NOIP2019模擬賽 test

2022-08-05 13:15:20 字數 1441 閱讀 9660

【noip2019模擬賽】test

題目描述

分析對於操作2-4,顯然是樹鏈剖分的裸題,重點是操作1

首先,操作1顯然只對操作3產生影響,假設當前根為root,操作3的節點為u

如果\(u=root\),顯然權值之和為整棵樹

如果\(u\neq root\)且\(lca(u,root)\neq u\)那麼換根操作不對子樹權值和產生影響

如果\(u\neq root\)且\(lca(u,root)=u\)那麼權值和為整棵樹減去\(u\)到\(root\)的鏈上最靠近\(u\)的一點的子樹權值和

**

#includeusing namespace std;

const int n=1e5+5;

struct node

tree[4*n];

struct node

edge[2*n];

int n,m,a[n],deep[n],fa[n],siz[n],maxson,son[n],id[n],val[n],cnt,top[n],root,head[n],tot;

void build(int p,int l,int r)

int mid=(l+r)/2;

build(p*2,l,mid);

build(p*2+1,mid+1,r);

tree[p].val=tree[2*p].val+tree[2*p+1].val;

return;

}void change(int p,int x,int val)

int mid=(tree[p].l+tree[p].r)/2;

if( x <= mid ) change(p*2,x,val);

else change(p*2+1,x,val);

tree[p].val=tree[2*p].val+tree[2*p+1].val;

return;

}int ask(int p,int l,int r)

void add(int x,int y)

void input()

return;

}void dfs2(int x,int topf)

return;

}void prepare()

void deal1()

void deal2()

int check(int x,int y)

return -1;

}void deal3()

int chain(int x,int y)

if( deep[x] < deep[y] ) swap(x,y);

tem+=ask(1,id[y],id[x]);

return tem;

}void deal4()

void work()

return;

}int main()

故地重遊 NOIP2019 格雷碼

洛谷5657 去年noip省賽題,當時就學了1個月oi所以第一題就慘遭爆零,如今再回來刷一遍過了 總體思路就是把格雷碼當成十進位制的數字進行...

NOIP2019 紀念品 揹包dp

初態下你有 m 元錢,有 n 票,你有超能力可以知道未來 t 天它們的 ,現在空倉,第 t 天結束後清倉,求能擁有的最多的錢數。 t leq 100 n leq 100 m leq 10 3 ,任何時候錢數不超過 10 4 我們把問題轉化成每天持有哪些物品的多重揹包,那麼持有一個物品佔用的體積就是錢...

noip2019提高組 Emiya 家今天的飯

題面 這裡思路 一道很妙的dp題,首先可以發現至多有一種主要食材被選超過t 2次 所以考慮用容斥 合法方案 總方案數 每行的不合法方案數。顯然 求出確定的某一列不合法的方案數比求出每一行都合法的方案數要簡單得多 範圍減小,限制更明確 。 這也是容斥的基本思路 正難則反 根據這個可以列出樸素的dp轉移...