2827 千山鳥飛絕 splay打標記

2021-08-15 15:26:20 字數 2664 閱讀 6092

description

話說有一天doyouloveme和vfleaking到山里玩。誰知doyouloveme剛剛進山,所有的鳥兒竟被他的神犇氣場給驚得全部飛走了。vfleaking頓時膜拜不已。

這時鳥王用鳥語說道:「!@#$%……?」安撫了一下眾鳥的情緒。鳥王生性好鬥,作出了乙個決定——要排鳥布陣把剛才嚇到它們的人類趕出山去。

每只鳥都有乙個編號,都有乙個威武值。每秒鐘鳥王都會發乙個命令,編號為v的鳥飛到(x,y)去(座標系原點是山頂,座標單位為鳥爪)。鳥飛得很快,一秒之內就飛到了,可以看作是瞬間移動。如果編號為v的鳥和編號為u的鳥某一時刻處在同一位置,它們就會互相鼓勵,增加各自的士氣值和團結值。乙隻鳥的士氣值等於此刻與它處在同一位置的鳥中的威武值的最大值,團結值等於此刻與它處在同一位置的鳥的隻數。如果每一時刻都沒有鳥與它處在同一位置,則士氣值和團結值都為0。要注意自己不能鼓勵自己,計算士氣值和團結值時不能算上自己。

t秒鐘後,doyouloveme目測出了現在每只鳥的戰鬥力,於是感嘆了一句:「不妙,我們得走了。」

正所謂團結的鳥兒乙個頂倆,所以doyouloveme這樣描述戰鬥力:乙隻鳥戰鬥力值等於它在0到t秒中士氣值的最大值與團結值的最大值的乘積。注意不是乘積的最大值,而是最大值的乘積。

vfleaking很想知道現在每只鳥的戰鬥力,但是他當然不會啦,於是他把這個任務交給了你來完成。

首先把座標離散化,對每個座標建一棵splay,以鳥的編號為關鍵字。然後要支援刪除、插入、維護最大值,把乙個新的點插入,它的答案就用那棵splay的最大值和大小來更新,然後用它自己的值來更新原來splay裡的點,用打標記就行了。但是我遇到個問題,就是原來的標記有可能會傳到新插入的點,我的解決方法是在插入點的時候把它的父親到根的標記都下傳,很慢,但我沒想到更好的方法了……

#include

using

namespace

std;

#define ll long long

#define pa pair

const

int maxn=30010;

const

int maxt=300010;

const

int inf=2147483647;

int read()

while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return x*f;

}map

int>h;int cnt=0;

int to(int x,int y)

int n,t;

struct birda[maxn];

int tot=0;

int fa[maxn+maxt],son[maxn+maxt][2],root[maxn+maxt],size[maxn+maxt];

int mx[maxn+maxt],v[maxn+maxt],d[maxn+maxt],t1[maxn+maxt],t2[maxn+maxt];

int ans1[maxn],ans2[maxn];

int pos[maxn];

void up(int x)

void down(int x)

if(t2[x])

}void rotate(int x)

int sta[maxn+maxt];

void work(int o,int x)

void splay(int o,int x,int rt)

if(!rt)root[o]=x;

}int find(int o,int x)

return now;

}void add(int o,int x,int y,int f)

void ins(int o,int x,int y)

add(o,x,y,find(o,x));

}void insert(int o,int x,int y)

ans1[x]=max(ans1[x],mx[t]);

ans2[x]=max(ans2[x],size[t]);

ins(o,x,y);

t=tot;

splay(o,t,0);

t1[t]=max(t1[t],y);

t2[t]=max(t2[t],size[t]-1);

}void del(int x)

int lc=son[t][0],rc=son[t][1];

if(lc&&!rc)

if(!lc&&rc)

if(!son[t][0])

int p=son[t][0];

while(son[p][1])p=son[p][1];

splay(o,p,t);

root[o]=p;fa[p]=0;

son[p][1]=son[t][1];

if(son[t][1])fa[son[t][1]]=p;

up(p);

}void dfs(int x)

int main()

t=read();

while(t--)

for(int i=1;i<=cnt;i++)

if(root[i])dfs(root[i]);

for(int i=1;i<=n;i++)printf("%lld\n",(ll)(ans1[i])*(ll)(ans2[i]));

}

bzoj2827 千山鳥飛絕 splay

題目描述 time limit 10 sec memory limit 128 mb submit 815 solved 231 submit status discuss 話說有一天doyouloveme和vfleaking到山里玩。誰知doyouloveme剛剛進山,所有的鳥兒竟被他的神犇氣場給...

bzoj 2827 千山鳥飛絕

time limit 10 sec memory limit 128 mb submit 802 solved 228 submit status discuss 51 1 1 3 1 2 4 4 4 2 0 1 2 2 3 51 1 2 2 4 4 2 4 3 3 0 1 5 0 134 688對...

BZOJ2827 千山鳥飛絕

portal 有 n n leq10 5 隻鳥分布在二維平面的整點上。每只鳥有威武值 士氣值和團結值 威武值是固定的 士氣值等於與其在同一位置的其他鳥的威武值的最大值 團結值等於與其在同一位置的其他鳥的隻數。接下來 t t leq2.5 times10 5 秒,第 i 秒會有乙隻鳥 b i 由原位置...