深繪里一直很討厭雨天。
灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。
雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連
根拔起,以及田地裡的糧食被弄得一片狼藉。
無奈的深繪里和村民們只好等待救濟糧來維生。
不過救濟糧的發放方式很特別。
首先村落裡的一共有n 座房屋,並形成乙個樹狀結構。然後救濟糧分m 次發放,每次選擇
兩個房屋(x,y),然後對於x 到y 的路徑上(含x 和y) 每座房子裡發放一袋z 型別的救濟糧。
然後深繪里想知道,當所有的救濟糧發放完畢後,每座房子裡存放的最多的是哪種救濟糧。
首先,我們應該說:
離線**好!用樹鏈剖分,每種糧食分開來處理離線**好!
離線**好!
因為題目是乙個區間集體+1,所以我們要保證:
如當前區間的標記陣列中有數沒有下傳,那麼當前區間的子區間沒有被訪問,也就是每個區間的標記陣列必須把標記傳到子區間中被訪問的最深處,
這樣就可以保證當前區間內所有點只被加了這麼多次,這個值也就是當前區間的答案最小值,
當然,我們還要記錄最近一次訪問當前區間的時間,過時的統計一下當前區間的答案最小值再清零,
全部做完以後再單獨跑一遍就可以統計每個點的答案了
複雜度:o(
n∗lo
g(n)
2∗2)
,後面的*2是因為要把每個區間的標記陣列必須把標記傳到子區間中被訪問的最深處。
#include
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define efo(i,q) for(int i=a[q];i;i=b[i][0])
using namespace std;
typedef long long ll;
const int n=100500,maxlongint=2147483640;
intread(int &n)
int n,m1;
int b[n*2][2],b0,a[n];
struct qqww
a[n];
int zx[n*5],tim;
struct qww
b[n*5];
struct qw
qwsc[n];
int max(int a,int b)
bool px(qwqw a,qwqw b)
int dfs1(int
q,int c,int fa)
void dfs2(int
q,int
lt)void clean(int e)
}void doit(int e,int cd)
b[e].la=0;
}void change(int l,int r,int e,int l1,int r1,bool l2)
int t=(l+r)/2;
if(r1<=t)change(l,t,e*2,l1,r1,l2);
else
if(t1,r,e*2+1,l1,r1,l2);
else
}void modify(int
q,int w,bool e)
if(a[q].c>a[w].c)swap(q,w);
change(1,n,1,a[q].zx,a[w].zx,e);
}void dfssg(int l,int r,int e)
int t=(l+r)/2;
dfssg(l,t,e*2);
dfssg(t+1,r,e*2+1);
}int main()
tim=sc[i].z;
modify(sc[i].x,sc[i].y,1);
}fo(j,q,m1)modify(sc[j].x,sc[j].y,0);
tim=maxlongint;
dfssg(1,n,1);
fo(i,1,n)printf("%d\n",a[i]);
return
0;}
JZOJ3397 雨天的尾巴
深繪里一直很討厭雨天。灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連 根拔起,以及田地裡的糧食被弄得一片狼藉。無奈的深繪里和村民們只好等待救濟糧來維生。不過救濟糧的發放方式很特別。首先村落裡的一共有...
雨天的尾巴
acwing連線 bzoj3307 深繪里一直很討厭雨天。灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連根拔起,以及田地裡的糧食被弄得一片狼藉。無奈的深繪里和村民們只好等待救濟糧來維生。不過救濟糧的...
雨天的尾巴
考試的時候直接扎第一題上了這到題連暴力都沒打出來t t 心路歷程 其實考試時候還是有可能做出來的,當然關鍵在能否想到線段樹合併。當時想到了離散化 很慌沒打出來。樹上差分,lca倍增,當時覺滴倍增很難打,一看n 100000,於是選擇 用向上標記法,然而少了一行 爆零兩行淚。現在看來倍增真是一點不難啊...