雨天的尾巴題目解析

2021-09-24 20:45:18 字數 2603 閱讀 5490

考試的時候直接扎第一題上了這到題連暴力都沒打出來t_t;

心路歷程:

其實考試時候還是有可能做出來的,當然關鍵在能否想到線段樹合併。

當時想到了離散化(很慌沒打出來。。。),樹上差分,lca倍增,當時覺滴倍增很難打,一看n<100000,於是選擇

用向上標記法,然而少了一行**,,,,爆零兩行淚。。。

現在看來倍增真是一點不難啊好打有好用,所以不要有為難情緒,剛就完了。(平日板子要多打記熟啊)

之所以沒想到線段樹合併是因為當時真的沒有透徹理解,

所以新知識點還是要知道它能幹什麼,知道它的用處。

離散化用來乾掉1->109,考試的時候真的傻認為要是有109種不就完了嗎,,,然後發現忘了還有m次操作這東東,所以z離散化後len最大也就m個卡掉了很多

以前乙個物品的題直接dfs,lca樹上差分就行,現在有109個(離散後105個),空間時間不可能乙個乙個去維護所以 得用線段樹合併。

每個點有很多資訊所以權值線段樹用來優化空間(當然也能優化時間),對每個點動態開樹插入和刪除(lca,f[lca]),最後dfs,父親合併兒子。

所以需維護區間的maxcnt以及其id,在merge時就需要多傳一下l,r(1,len),如果l==r更新maxx值和id,需要注意的是如果maxx<=0,id乾成0(題目要求)。

sd錯誤:merge時忘了加上root[x]=merge,如果root[x]=0,就會…炸。還有空間沒開夠得開到maxn*50。

優化:插入時如果lcax||lcay,那就插入了一次刪了一次所以乾脆不插入。。。

**:#include

#include

#include

#include

using namespace std;

const int maxn=100050;

bool mark[maxn];

int n,m,t,ans[maxn],len;

int kpx[maxn],kpy[maxn],kpz[maxn],turn[maxn];//離線離散化

int deep[maxn],f[maxn][20];//倍增lca

int sz,root[maxn],cnt[maxn50],lc[maxn50],rc[maxn50],maxx[maxn50],num[maxn50];//線段樹

int head[maxn],cntn=1;

struct nodeline[maxn2];

void add(int x,int y)

void dfs(int x)}}

int ask(int x,int y)

}return f[x][0];

}void insert(int &root,int l,int r,int x)

int mid=(l+r)/2;

if(x<=mid) insert(lc[root],l,mid,x);

else insert(rc[root],mid+1,r,x);

if(maxx[lc[root]]>=maxx[rc[root]]) maxx[root]=maxx[lc[root]],num[root]=num[lc[root]];

else maxx[root]=maxx[rc[root]],num[root]=num[rc[root]];

}void decrease(int &root,int l,int r,int x)

int mid=(l+r)/2;

if(x<=mid) decrease(lc[root],l,mid,x);

else decrease(rc[root],mid+1,r,x);

if(maxx[lc[root]]>=maxx[rc[root]]) maxx[root]=maxx[lc[root]],num[root]=num[lc[root]];

else maxx[root]=maxx[rc[root]],num[root]=num[rc[root]];

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

int mid=(l+r)/2;

lc[x]=merge(lc[x],lc[y],l,mid);

rc[x]=merge(rc[x],rc[y],mid+1,r);

if(maxx[lc[x]]>=maxx[rc[x]]) maxx[x]=maxx[lc[x]],num[x]=num[lc[x]];

else maxx[x]=maxx[rc[x]],num[x]=num[rc[x]];

return x;

}void dfst(int x)

}ans[x]=turn[num[root[x]]];

}int main()

if(xkpy[i])

insert(root[ kpx[i] ],1,len,kpz[i]);

insert(root[ kpy[i] ],1,len,kpz[i]);

decrease(root[x],1,len,kpz[i]);

decrease(root[ f[x][0] ],1,len,kpz[i]);

}memset(mark,0,sizeof(mark));

mark[1]=1;

dfst(1);

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

}

雨天的尾巴

acwing連線 bzoj3307 深繪里一直很討厭雨天。灼熱的天氣穿透了前半個夏天,後來一場大雨和隨之而來的洪水,澆滅了一切。雖然深繪里家鄉的小村落對洪水有著頑固的抵抗力,但也倒了幾座老房子,幾棵老樹被連根拔起,以及田地裡的糧食被弄得一片狼藉。無奈的深繪里和村民們只好等待救濟糧來維生。不過救濟糧的...

雨天的尾巴

考試的時候直接扎第一題上了這到題連暴力都沒打出來t t 心路歷程 其實考試時候還是有可能做出來的,當然關鍵在能否想到線段樹合併。當時想到了離散化 很慌沒打出來。樹上差分,lca倍增,當時覺滴倍增很難打,一看n 100000,於是選擇 用向上標記法,然而少了一行 爆零兩行淚。現在看來倍增真是一點不難啊...

bzoj3307 雨天的尾巴

time limit 10 sec memory limit 128 mb submit 258 solved 121 submit status discuss n個點,形成乙個樹狀結構。有m次發放,每次選擇兩個點x,y 對於x到y的路徑上 含x,y 每個點發一袋z型別的物品。完成 所有發放後,每...