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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

codeforces1467 E. Distinctive Roots in a Tree(树上差分)

發(fā)布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 codeforces1467 E. Distinctive Roots in a Tree(树上差分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

E. Distinctive Roots in a Tree

樹上差分

  • 如果當前節(jié)點u的某一棵子樹中的某個節(jié)點的值和當前節(jié)點相同,那么除了當前節(jié)點這一棵子樹節(jié)點,其他節(jié)點(其他子樹以及u上面的節(jié)點)一定不滿足要求。

  • 如果當前節(jié)點子樹之外的節(jié)點(u上面的節(jié)點)與當前節(jié)點值相同,那么當前子樹節(jié)點不滿足要求。

如何知道當前子樹中的節(jié)點是否與當前節(jié)點相同?
dfs過程中記錄進入該子樹之前某值的個數與出子樹后該值的個數進行比較,如果比之前多,說明子樹中存在該值。

如何知道當前節(jié)點所有子樹之外的節(jié)點是否存在與當前值相同的節(jié)點?
如果不存在,說明當前節(jié)點所有子樹出現該值個數和應該與總個數相同

對于不能作為答案的節(jié)點標記一下即可,由于只有子樹操作考慮dfs序,區(qū)間修改單點查詢差分即可。

#define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<stack> #include<queue> #include<random> #include<bitset> #include<string> #include<vector> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<unordered_map> #include<unordered_set> using namespace std; typedef long long ll; typedef pair<int,int> pii; const int N=200010,mod=1e9+7; int h[N],e[2*N],ne[2*N],idx; int a[N],cnt[N],num[N],s[N],n; map<int,int> mp; int find(int x) {if(!mp.count(x)) mp[x]=++idx;return mp[x]; } void add(int a,int b) {e[idx]=b,ne[idx]=h[a],h[a]=idx++; } void update(int l,int r,int x) {s[l]+=x,s[r+1]-=x; } int dfn[N],timestamp,sz[N]; void dfs(int u,int fa) {dfn[u]=++timestamp;sz[u]=1;int now=cnt[a[u]];// 差分統(tǒng)計u子樹出現a[u]的次數cnt[a[u]]++;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];if(j==fa) continue;int pre=cnt[a[u]];//進入子樹前dfs(j,u);sz[u]+=sz[j];if(cnt[a[u]]>pre) //說明j子樹出現了a[u]update(1,n,1),update(dfn[j],dfn[j]+sz[j]-1,-1);}if(cnt[a[u]]-now!=num[a[u]])//差分統(tǒng)計u子樹出現a[u]的次數 不等于總個數update(dfn[u],dfn[u]+sz[u]-1,1);//1表示不能作為答案} int main() {IO;int T=1;//cin>>T;while(T--){memset(h,-1,sizeof h);cin>>n;for(int i=1;i<=n;i++) {cin>>a[i];a[i]=find(a[i]);num[a[i]]++;//總個數}idx=0;for(int i=1;i<n;i++){int a,b;cin>>a>>b;add(a,b),add(b,a);}dfs(1,-1);int res=0;for(int i=1;i<=n;i++){s[i]+=s[i-1];if(!s[i]) res++;}cout<<res<<'\n';}return 0; }

要加油哦~

總結

以上是生活随笔為你收集整理的codeforces1467 E. Distinctive Roots in a Tree(树上差分)的全部內容,希望文章能夠幫你解決所遇到的問題。

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