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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【Foreign】采蘑菇 [点分治]

發(fā)布時間:2023/12/19 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Foreign】采蘑菇 [点分治] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

采蘑菇

Time Limit: 20 Sec??Memory Limit: 256 MB

Description

  

Input

  

Output

  

Sample Input

  5
  1 2 3 2 3
  1 2
  1 3
  2 4
  2 5

Sample Output

  10
  9
  12
  9
  11

HINT

  

Main idea

  詢問從以每個點為起始點時,各條路徑上的顏色種類的和。

Solution

  我們看到題目,立馬想到了O(n^2)的做法,然后從這個做法研究一下本質(zhì),我們確定了可以以點分治作為框架。

  我們先用點分治來確定一個center(重心)。然后計算跟這個center有關的路徑。設現(xiàn)在要統(tǒng)計的是經(jīng)過center,對x提供貢獻的路徑。

  我們先記錄一個記錄Sum[x]表示1~i-1子樹中 顏色x 第一次出現(xiàn)的位置的那個點 的子樹和,然后我們就利用這個Sum來解題。

  我們顯然可以分兩種情況來討論:

  (1)統(tǒng)計center->x出現(xiàn)顏色的貢獻
    顯然,這時候,對于center->x這一段,直接像O(n^2)做法那樣記錄一個color表示到目前為止出現(xiàn)的顏色個數(shù),然后加一下即可。再記錄一個record表示當前可有的貢獻和,一旦出現(xiàn)過一個顏色,那么這個顏色在1~i-1子樹上出現(xiàn)第一次以下的點,對于x就不再提供貢獻了,record減去Sum[這個顏色],然后這樣深搜往下計算即可。

  (2)統(tǒng)計center->x沒出現(xiàn)過的顏色的貢獻
    顯然,對于center->x上沒出現(xiàn)過的顏色,直接往下深搜,一開始為record為(All - Sum[center]),一旦出現(xiàn)了一個顏色,record則減去這個Sum。同樣表示不再提供貢獻即可。

  我們這樣做就可以求出每個子樹前綴對于其的貢獻了,倒著再做一邊即可求出全部的貢獻。統(tǒng)計x的時候,順便統(tǒng)計一下center。可以滿足效率,成功AC這道題。

Code

1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<cmath> 7 using namespace std; 8 9 const int ONE = 600005; 10 const int INF = 214783640; 11 const int MOD = 1e9+7; 12 13 int n,x,y; 14 int Val[ONE]; 15 int next[ONE],first[ONE],go[ONE],tot; 16 int vis[ONE]; 17 int Ans[ONE],Sum[ONE]; 18 int All; 19 20 21 int get() 22 { 23 int res,Q=1; char c; 24 while( (c=getchar())<48 || c>57) 25 if(c=='-')Q=-1; 26 if(Q) res=c-48; 27 while((c=getchar())>=48 && c<=57) 28 res=res*10+c-48; 29 return res*Q; 30 } 31 32 void Add(int u,int v) 33 { 34 next[++tot]=first[u]; first[u]=tot; go[tot]=v; 35 next[++tot]=first[v]; first[v]=tot; go[tot]=u; 36 } 37 38 namespace Point 39 { 40 int center; 41 int Stack[ONE],top; 42 int total,Max,center_vis[ONE]; 43 int num,V[ONE]; 44 45 struct power 46 { 47 int size,maxx; 48 }S[ONE]; 49 50 void Getsize(int u,int father) 51 { 52 S[u].size=1; 53 S[u].maxx=0; 54 for(int e=first[u];e;e=next[e]) 55 { 56 int v=go[e]; 57 if(v==father || center_vis[v]) continue; 58 Getsize(v,u); 59 S[u].size += S[v].size; 60 S[u].maxx = max(S[u].maxx,S[v].size); 61 } 62 } 63 64 void Getcenter(int u,int father,int total) 65 { 66 S[u].maxx = max(S[u].maxx,total-S[u].size); 67 if(S[u].maxx < Max) 68 { 69 Max = S[u].maxx; 70 center = u; 71 } 72 73 for(int e=first[u];e;e=next[e]) 74 { 75 int v=go[e]; 76 if(v==father || center_vis[v]) continue; 77 Getcenter(v,u,total); 78 } 79 } 80 81 void Ad_sum(int u,int father) 82 { 83 if(!vis[Val[u]]) 84 { 85 Stack[++top] = Val[u]; 86 All += S[u].size; Sum[Val[u]] += S[u].size; 87 } 88 vis[Val[u]]++; 89 for(int e=first[u];e;e=next[e]) 90 { 91 int v=go[e]; 92 if(v==father || center_vis[v]) continue; 93 Ad_sum(v,u); 94 } 95 vis[Val[u]]--; 96 } 97 98 void Calc_in(int u,int father,int center,int Size,int f_time,int record) 99 { 100 if(!vis[Val[u]]) f_time++, record += Size, record -= Sum[Val[u]]; 101 Ans[u] += record; Ans[center]+=f_time; 102 Ans[u] += f_time; vis[Val[u]] ++; 103 for(int e=first[u];e;e=next[e]) 104 { 105 int v=go[e]; 106 if(v==father || center_vis[v]) continue; 107 Calc_in(v,u,center,Size,f_time,record); 108 } 109 vis[Val[u]] --; 110 } 111 112 void Calc_not(int u,int father,int record) 113 { 114 if(!vis[Val[u]]) record -= Sum[ Val[u] ]; 115 Ans[u] += record; vis[Val[u]] ++; 116 for(int e=first[u];e;e=next[e]) 117 { 118 int v=go[e]; 119 if(v==father || center_vis[v]) continue; 120 Calc_not(v,u,record); 121 } 122 vis[Val[u]] --; 123 } 124 125 void Dfs(int u) 126 { 127 Max = n; 128 Getsize(u,0); 129 Getcenter(u,0,S[u].size); 130 Getsize(center,0); 131 center_vis[center] = 1; 132 133 int num=0; for(int e=first[center];e;e=next[e]) if(!center_vis[go[e]]) V[++num]=go[e]; 134 135 for(int i=1;i<=num;i++) 136 { 137 int v=V[i]; 138 int Size = S[center].size - S[v].size - 1; 139 vis[Val[center]] = 1; 140 Calc_in(v,center,center, Size,1,All - Sum[Val[center]] + Size); 141 vis[Val[center]] = 0; 142 Ad_sum(v,center); 143 } 144 while(top) Sum[Stack[top--]]=0; All=0; 145 146 for(int i=num;i>=1;i--) 147 { 148 int v=V[i]; 149 vis[Val[center]] = 1; 150 Calc_not(v,center, All-Sum[Val[center]]); 151 vis[Val[center]] = 0; 152 Ad_sum(v,center); 153 } 154 155 while(top) Sum[Stack[top--]]=0; All=0; 156 for(int e=first[center];e;e=next[e]) 157 { 158 int v=go[e]; 159 if(center_vis[v]) continue; 160 Dfs(v); 161 } 162 } 163 164 } 165 166 int main() 167 { 168 n=get(); 169 for(int i=1;i<=n;i++) Val[i]=get(); 170 171 for(int i=1;i< n;i++) 172 { 173 x=get(); y=get(); 174 Add(x,y); 175 } 176 177 Point:: Dfs(1); 178 for(int i=1;i<=n;i++) 179 printf("%d\n",Ans[i]+1); 180 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/BearChild/p/6517325.html

總結(jié)

以上是生活随笔為你收集整理的【Foreign】采蘑菇 [点分治]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美国产成人精品一区二区三区 | 最近免费中文字幕中文高清百度 | 极品美女无套呻吟啪啪 | 18pao国产成视频永久免费 | 涩涩视频网址 | 麻豆精品视频 | 97公开免费视频 | 天堂俺去俺来也www 欧美大片在线播放 | av私库 | www成年人 | 少妇人妻一区二区三区 | 久久久www成人免费毛片 | 日本高清免费看 | 涩色视频 | 97视频免费在线观看 | 亚洲av毛片基地 | 韩国三级做爰视频 | 欧美成人综合视频 | 国产精品专区在线观看 | 亚欧精品视频一区二区三区 | 操日本女人 | 91看篇| 88av在线| 人人妻人人澡人人爽欧美一区双 | www.久久久久久久久 | 在线观看精品国产 | 色播在线观看 | 久久国产精品久久国产精品 | 26uuu成人网| 天天色网站 | 91亚洲网| 很污很黄的网站 | 网红日批视频 | 黑花全肉高h湿play短篇 | 爱情岛论坛亚洲自拍 | 欧美一级夜夜爽 | 色咪咪网站 | 91国产网站 | 久久无码高潮喷水 | 欧美a天堂 | 美国一级大黄一片免费中文 | 欧美福利视频一区二区 | 国产在线操 | 色漫在线观看 | 骚黄网站| 丝袜人妻一区 | 欧美视频在线观看 | 久久99色 | 国产剧情在线 | 最新国产精品 | 手机av在线免费 | 国产精品综合久久 | av黄色一级片 | 国产乡下妇女做爰毛片 | 骚虎视频最新网址 | 亚洲国产精品自拍 | 成人在线小视频 | 黄色成人免费网站 | 久久久久精彩视频 | 国产高清无密码一区二区三区 | 秋霞精品| 精品一级| 欧美日韩麻豆 | 亚洲九九夜夜 | 一区二区在线 | 99精品综合 | 免费看黄色一级大片 | 国产毛片18 | 一区二区在线观看av | 无码精品在线观看 | 色噜噜狠狠狠综合曰曰曰88av | 免费看毛片网站 | av福利站 | 精品日韩制服无码久久久久久 | 在线观看日本 | 黄色的网站在线 | 国产乱码精品一区二区三区忘忧草 | 久久综合国产 | 日韩有码视频在线 | 97操碰 | 这里只有精品视频 | 成人av地址 | 天天射av | 亚洲av日韩av在线观看 | 亚洲射色 | 日日干天天射 | 亚洲mv一区 | 国产欧美日韩激情 | 日本一级淫片免费放 | 亚洲性大片 | 91香蕉视频黄色 | 夜间福利网站 | 在线观看污 | 97精品一区二区 | 污漫在线观看 | 黑人巨大精品欧美一区二区 | 国产美女又黄又爽又色视频免费 | 永久免费未网 | 播放毛片 |