日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj2243

發布時間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj2243 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2243: [SDOI2011]染色

Time Limit: 20 Sec??Memory Limit: 512 MB
Submit: 6753??Solved: 2496
[Submit][Status][Discuss]

Description

給定一棵有n個節點的無根樹和m個操作,操作有2類:

1、將節點a到節點b路徑上所有點都染成顏色c

2、詢問節點a到節點b路徑上的顏色段數量(連續相同顏色被認為是同一段),如“112221”由3段組成:“11”、“222”和“1”。

請你寫一個程序依次完成這m個操作。

Input

第一行包含2個整數nm,分別表示節點數和操作數;

第二行包含n個正整數表示n個節點的初始顏色

下面行每行包含兩個整數xy,表示xy之間有一條無向邊。

下面行每行描述一個操作:

“C a b c”表示這是一個染色操作,把節點a到節點b路徑上所有點(包括ab)都染成顏色c

“Q a b”表示這是一個詢問操作,詢問節點a到節點b(包括ab)路徑上的顏色段數量。

Output

對于每個詢問操作,輸出一行答案。

Sample Input

6 5

2 2 1 2 1 1

1 2

1 3

2 4

2 5

2 6

Q 3 5

C 2 1 1

Q 3 5

C 5 1 2

Q 3 5

Sample Output

3

1

2

HINT

數N<=10^5,操作數M<=10^5,所有的顏色C為整數且在[0, 10^9]之間。

Source

第一輪day1

樹鏈剖分練習。

1.每次查詢時記得跳上去時,要把兩個端點是否相等計算進去。color[num[fa[top[x]]]]==color[num[top[x]]]記得判斷,這里用單點查詢即可。

(這里不會出現錯誤,有人會想:fa[top[x]]會不會跳到了這兩個點的路徑外?不會,因為當dep[top[x]]<dep[top[x]時交換x,y所以當x已經在最上面的區間時,他就不會動了,只有y會向上跳)

2.每次查詢時query(l,mid) query(mid+1,r)時也要判斷rc[x*2]==lc[x*2+1](查詢時)當且僅當a<=mid<b時要判斷;(a,b是要查詢的區間),因為如果這兩個端點不在查詢的區間里,那么也就沒有必要判斷了。

3.tag要先變成-1,顏色可能為0

4.pushdown是把下面節點的信息修改,不是僅僅修改他的tag。(不清楚)

一組數據:

7 3
1 1 1 1 1 1 1
1 2 1 3
2 4 2 5
3 6 3 7
C 6 3 2
C 4 7 1
Q 6 7

這組數據說明了第二條

?

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 200010 struct edge {int to,nxt; }e[N]; int n,m,cnt,k; int head[N],size[N],rc[N<<2],lc[N<<2],sum[N<<2],tag[N<<2]; int num[N],c[N],fa[N],top[N],son[N],dep[N]; void link(int u,int v) {e[++cnt].nxt=head[u];head[u]=cnt;e[cnt].to=v; } int min(int x,int y) {return x<y?x:y; } int max(int x,int y) {return x>y?x:y; } void dfs1(int u,int Fa) {int Max=0; size[u]=1;for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v!=Fa){fa[v]=u;dep[v]=dep[u]+1;dfs1(v,u);if(size[v]>Max){son[u]=v;Max=size[v];}size[u]+=size[v];}} } void dfs2(int u,int acs,int Fa) {top[u]=acs; num[u]=++k;if(son[u]) dfs2(son[u],acs,u);for(int i=head[u];i;i=e[i].nxt){int v=e[i].to;if(v!=Fa&&v!=son[u]) dfs2(v,v,u);} } void pushdown(int x) {if(tag[x]!=-1){tag[x*2+1]=tag[x*2]=tag[x];sum[x*2+1]=sum[x*2]=1;lc[x*2+1]=lc[x*2]=rc[x*2+1]=rc[x*2]=tag[x];tag[x]=-1;} } void update(int l,int r,int x,int a,int b,int c) {if(l>b||r<a) return;if(l>=a&&r<=b){tag[x]=lc[x]=rc[x]=c; sum[x]=1;return;}if(r<=b) rc[x]=c;if(l>=a) lc[x]=c;pushdown(x);update(l,(l+r)/2,x*2,a,b,c);update((l+r)/2+1,r,x*2+1,a,b,c);sum[x]=sum[x*2]+sum[x*2+1]-(rc[x*2]==lc[x*2+1]); } int query(int l,int r,int x,int a,int b) {if(l>b||r<a) return 0;if(l>=a&&r<=b) return sum[x];pushdown(x);int ret=0;ret+=query(l,(l+r)/2,x*2,a,b);ret+=query((l+r)/2+1,r,x*2+1,a,b);if((l+r)/2>=a&&(l+r)/2<b) ret-=(rc[x*2]==lc[x*2+1]);return ret; } int pquery(int l,int r,int x,int pos) {if(l==r) return tag[x];pushdown(x);if(pos>(l+r)/2) return pquery((l+r)/2+1,r,x*2+1,pos);else return pquery(l,(l+r)/2,x*2,pos); } void ask(int x,int y) {int ans=0;while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);ans+=query(1,n,1,num[top[x]],num[x]); // printf("color=%d\n",pquery(1,n,1,num[fa[top[x]]]));ans-=(pquery(1,n,1,num[top[x]])==pquery(1,n,1,num[fa[top[x]]])); x=fa[top[x]];}ans+=query(1,n,1,min(num[x],num[y]),max(num[x],num[y]));printf("%d\n",ans); } void change(int x,int y,int c) {while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);update(1,n,1,num[top[x]],num[x],c);x=fa[top[x]];}update(1,n,1,min(num[x],num[y]),max(num[x],num[y]),c); } int main() {memset(tag,-1,sizeof(tag)); // lc[0]=rc[0]=-1;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&c[i]);}for(int i=1;i<n;i++){int u,v; scanf("%d%d",&u,&v);link(u,v); link(v,u);}dfs1(1,0);dfs2(1,1,0);for(int i=1;i<=n;i++){update(1,n,1,num[i],num[i],c[i]);}while(m--){char s[10]; scanf("%s",s); if(s[0]=='Q'){int x,y; scanf("%d%d",&x,&y);ask(x,y);}if(s[0]=='C'){int x,y,c; scanf("%d%d%d",&x,&y,&c);change(x,y,c);} }return 0; } View Code

?

轉載于:https://www.cnblogs.com/19992147orz/p/6250350.html

總結

以上是生活随笔為你收集整理的bzoj2243的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。