傳送門
題目中給的資訊很難直接維護,但是可以考慮一條邊對答案的貢獻
在以\(x\)為根的子樹裡,如果一條邊\(i\)的權值為\(w_i\),這條邊深度更深的端點為\(to_i\),那麼這條邊對這個子樹的貢獻為\(w_i*size_x*(size_x-size_)\),也就是這條邊會被計算邊兩端點個數之積次
那麼乙個子樹的答案就是$$\sum_ w_isize_(size_x-size_)$$
即$$\sum_ w_isize_xsize_-w_i}^2$$$$size_x\sum_ w_isize_-w_i}^2$$
然後把邊權\(w_i\)儲存在\(to_i\)上,維護\(w_i*size_\)和\(w_i*}^2\)就是個板子題了
#include#define ll long long
#define il inline
#define re register
#define db double
#define eps (1e-7)
using namespace std;
const int n=70000+10,m=50000+10,mod=2019;
il ll rd()
while(ch>='0'&&ch<='9')
return x*w;
}il int max(int a,int b)
il int min(int a,int b)
il void psdn(int o)
}void modif(int o,int l,int r,int ll,int rr,int x)
psdn(o);
if(ll<=mid) modif(lc,l,mid,ll,rr,x);
if(rr>mid) modif(rc,mid+1,r,ll,rr,x);
psup(o);
}int quer1(int o,int l,int r,int ll,int rr)
int quer2(int o,int l,int r,int ll,int rr)
int to[m<<1],nt[m<<1],w[m<<1],hd[n],tot=1;
il void add(int x,int y,int z)
int sz[m],son[m],de[m],fa[m],top[m],id[m],a[m],b[m],ti;
void dfs1(int x)
}void dfs2(int x)
}void bui(int o,int l,int r)
bui(lc,l,mid),bui(rc,mid+1,r);
psup(o);
z1[o]=(z1[lc]+z1[rc])%mod,z2[o]=(z2[lc]+z2[rc])%mod;
}int n,q,x,y,z;
char cc[4];
int main()
dfs1(1),top[1]=1,dfs2(1);
bui(1,1,n);
while(q--)
else
}return 0;
}
Wannafly挑戰賽14 E 線性基
題目描述 給乙個1 base陣列,有n次操作,每次操作會使乙個位置無效。乙個區間的權值定義為這個區間裡選出一些數的異或和的最大值。求在每次操作前,所有不包含無效位置的區間的權值的最大值。輸入描述 第一行讀入乙個正整數 1 n 105 第二行讀入n個正整數,第i個表示a i 0 a i 109 第三行...
Wannafly挑戰賽21 C 大水題
題目描述 現在給你n個正整數ai,每個數給出一 好數程度 gi 數值相同但位置不同的數之間可能有不同的好數程度 對於在 i 位置的數,如果有一在j位置的數滿足 j i 且 ai aj,則你可以將位於 i,j 閉區間內的序列評為 好序列 然後獲得 gk j k i 此閉區間內 好數程度 之和 分數。注...
Wannafly挑戰賽21 C 大水題
題目描述 現在給你n個正整數ai,每個數給出一 好數程度 gi 數值相同但位置不同的數之間可能有不同的好數程度 對於在 i 位置的數,如果有一在j位置的數滿足 j i 且 ai aj,則你可以將位於 i,j 閉區間內的序列評為 好序列 然後獲得 gk j k i 此閉區間內 好數程度 之和 分數。注...