GDOI2014模擬 雨天的尾巴

2021-07-12 01:45:32 字數 1348 閱讀 3550

給出乙個n個節點的樹和m次操作,每次操作把x到y的路徑上的所有的點的z種物品+1.

求最後每個點最多的物品編號。若有多個相同的取編號小的,若沒有則輸出0.

n,m<=10^5,z<=10^9

#include

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define fd(i,a,b) for(int i=a;i>=b;i--)

#define rep(i,a) for(int i=last[a];i;i=next[i])

#define n 100005

using

namespace

std;

map h;

vector

a[n],b[n];

struct notetr[n*50];

int n,m,x,y,z,l,tot,top,root[n],le[n*50],ri[n*50],bz[n*50];

int t[n*2],next[n*2],last[n],p[n],d[n],ans[n],fa[n][17];

void add(int x,int y)

void dfs(int x,int y)

int lca(int x,int y)

note max(note y,note z)

else

if (y.mx>z.mx)

else

return x;

}void change(int &v,int l,int r,int x,int y) int m=(l+r)/2;

if (l==r)

if (x<=m) change(le[v],l,m,x,y);

else change(ri[v],m+1,r,x,y);

tr[v]=max(tr[le[v]],tr[ri[v]]);

}int merge(int v,int x,int l,int r)

int m=(l+r)/2;

le[v]=merge(le[v],le[x],l,m);

ri[v]=merge(ri[v],ri[x],m+1,r);

tr[v]=max(tr[le[v]],tr[ri[v]]);

return v;

}void make(int x,int y)

int main()

make(1,0);

fo(i,1,n) printf("%d\n",ans[i]);

}

GDOI2014模擬 網格

description 某城市的街道呈網格狀,左下角座標為a 0,0 右上角座標為b n,m 其中n m。現在從a 0,0 點出發,只能沿著街道向正右方或者正上方行走,且不能經過圖示中直線左上方的點,即任何途徑的點 x,y 都要滿足x y,請問在這些前提下,到達b n,m 有多少種走法。輸入檔案中僅...

GDOI2014模擬 伺服器

我們可以從n個數中選擇一些,選擇第i個數的代價為ci,且必須選擇n。對於每個沒有被選擇的數i,若它右邊離它最近的乙個被選擇的數是j,則代價為j i。求最小代價。n 10 6 n 2dp還是很顯然的。設fi表示i必須選,且i的右邊已經搞定了的最小代價,那麼fi min fk k i 1 k i 2 c...

GDOI2014模擬 伺服器

直到比賽最後幾分鐘,才發現60 資料居然是乙個水dp,結果沒打完。我們需要將乙個檔案複製到n個伺服器上,這些伺服器的編號為s1,s2,sn。首先,我們可以選擇一些伺服器,直接把檔案複製到它們中 將檔案複製到伺服器si上,需要花費ci 0的置放費用。對於沒有直接被複製檔案的伺服器si來說,它依次向後檢...