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
坐标转换 树状数组二维数点