Wannafly挑戰賽21 E 未來城市規劃

2022-02-05 07:22:56 字數 1561 閱讀 9140

傳送門

題目中給的資訊很難直接維護,但是可以考慮一條邊對答案的貢獻

在以\(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 此閉區間內 好數程度 之和 分數。注...