2021ICPC昆明区域赛

传送门

A

超级大模拟

B

状压dp计数

C

D

k=0,k=1特判
k为奇数特判
构造112111211111
2^2+ 2^3+ 2^5

F

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,M=2*N;
int n;
double w[N],b,ans;
vector<int>g[N];
void dfs(int u,int fa){
    
    
    //如果我是正的,我儿子也是正的,更新一下max
    //如果我是正的,我儿子我父亲都是负的,更新一下max
    //儿子1 - u - 儿子2
    int son1=0,son2=0,son3=0,son4=0;
    for(auto v:g[u]){
    
    
        if(v==fa)continue;
        if(w[v]<=w[son1])son2=son1,son1=v;
        else if(w[v]<=w[son2])son2=v;
        if(w[v]>=w[son3])son4=son3,son3=v;
        else if(w[v]>=w[son4])son4=v;
        if(w[u]>=0&&w[v]>=0)b=max(b,abs(w[u]+w[v])/2);
        if(w[u]<=0&&w[v]<=0)b=max(b,abs(w[u]+w[v])/2);
        if(fa!=-1&&w[u]>=0&&w[fa]<=0&&w[v]<=0)b=max(b,abs(w[u]+w[v]+w[fa])/3);
        if(fa!=-1&&w[u]<=0&&w[fa]>=0&&w[v]>=0)b=max(b,abs(w[u]+w[v]+w[fa])/3);
        dfs(v,u);
    }
    if(son1&&son2)b=max(b,abs(w[son1]+w[u]+w[son2])/3);
    if(son3&&son4)b=max(b,abs(w[son3]+w[u]+w[son4])/3);
    return;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++)cin>>w[i];
    for(int i=1;i<n;i++){
    
    
        int u,v;
        cin>>u>>v;
        b=max(b,abs(w[u]+w[v])/2);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,-1);
    cout<<fixed<<b*b/4;
}

K

L

坐标转换 树状数组二维数点

M

猜你喜欢

转载自blog.csdn.net/supreme567/article/details/124266842