bzoj2827 千山鳥飛絕 splay

2022-09-11 02:15:11 字數 3253 閱讀 6029

[題目描述]

time limit: 10 sec  memory limit: 128 mb

submit: 815  solved: 231

[submit][status][discuss]

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

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

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

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

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

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

第一行乙個數n,代表鳥的隻數。(鳥王那傢伙你可以完全忽視掉)

接下來n行,每行三個整數w,x,y描述每只鳥的威武值和初始座標。第i+1行描述編號為i的鳥。

接下來一行有乙個數t,代表經過時間ts。

接下來t行,每行三個整數v,x,y描述鳥王每秒的命令。

一共n行,每行乙個數,代表每只鳥的戰鬥力。

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對於樣例的解釋:

首先5只鳥的位置為(1,1),(1,2),(4,4),(0,1),(2,3),士氣和團結值都是0。

鳥1飛到了(1,2),於是鳥1和鳥2互相鼓勵,鳥1士氣變為3,鳥2士氣變為1。鳥1鳥2的團結值變為1。

然後鳥2飛到(4,4),與鳥3互相鼓勵,鳥2士氣變為4,鳥3士氣變為3。鳥2與鳥3的團結值變為1。

鳥2然後飛到了(4,3),乙個沒有鳥的地方。於是士氣和團結值都變為了0。

接下來鳥3和鳥5都飛到了鳥4的位置,於是三隻鳥互相鼓勵,鳥4、鳥5士氣變為4,鳥3士氣仍為3。鳥3、鳥4、鳥5的團結值都變為2。

於是大家的戰鬥力:

鳥1:3 * 1 = 3

鳥2:4 * 1 = 4

鳥3:3 * 2 = 6

鳥4:4 * 2 = 8

鳥5:4 * 2 = 8

1≤n≤30000   0≤t≤300000   座標範圍為整數,且不超過int_min~int_max

威武值為不超過int_max的非負整數。

湖北省隊互測

[題解]

每個位置開乙個splay,加入時先更新原樹答案(打tag),在更新這個點,最後再加入

/* --------------

user vanisher

problem bzoj-2827

----------------*/

# include # define n 400010

# define ll long long

using namespace std;

int read()

while (ch>='0'&&ch<='9')

return tmp*fh;

}struct pointnow;

struct nodep[n];

struct treet[n];

int ansi[n],ansj[n],rt[n],place,ti,size[n],n,m,at[n];

map mp;

bool operator <(point x, point y)

bool operator ==(point x, point y)

void pushtag(int x)

void zig(int x)

void zag(int x)

void splay(int p, int x)

if (t[root].pl==x) zig(x); else zag(x);

rt[p]=x;

}void extend(int p, point x)

t[rt[p]].tagi=max(t[rt[p]].tagi,size[p]-1);

int i=rt[p],las=0; point mx;

while (i!=0)

ansj[x.y]=max(ansj[x.y],mx.x);

ansi[x.y]=max(ansi[x.y],size[p]-1);

t[rt[p]].tagj=max(t[rt[p]].tagj,x.x);

las=0, i=rt[p];

while (i!=0)

if (t[las].numt[las].pr=now; else t[las].pl=now;

t[now].fa=las;

splay(p,now);

}void del(int p, point x)

splay(p,i);

int l=t[rt[p]].pl,r=t[rt[p]].pr;

t[l].fa=0; t[r].fa=0;

if (l==0&&r==0) rt[p]=0;

else if (l==0) rt[p]=r;

else if (r==0) rt[p]=l;

else

splay(p,las);

t[rt[p]].pr=r;

t[r].fa=rt[p];

}size[p]--;

}int main());

} m=read();

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

extend(nex,(point));

p[j].p=nex;

} for (int i=1; i<=n; i++)

return 0;

}

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 由原位置...

BZOJ2827 千山鳥飛絕

離散化座標,每個座標開一棵以鳥的編號為關鍵字的平衡樹。每次插入時打2個標記,同時更新自身。這個方法比較顯然,而且好寫。正解好像用很迷的方法亂搞了一波,然後用線段樹不打標記就做出來了,並不會。treap旋轉沒傳引用,調了好久。include define n 30005 define m 330005...