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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CD操作

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

http://acm.hdu.edu.cn/showproblem.php?pid=4547

C++版本一

題解:

LCA樹上倍增

注意:CD 向下走可以一步到底

/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v,c; int ans,cnt,flag,temp,tot,sum,num; int pre[N]; bool vis[N]; int dep[N]; int dp[N][21]; string str,str1; struct node{int v,w; }x; map<string,int>mp; vector<int>G[N]; int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} void marge(int u,int v){int tu=find(u);int tv=find(v);if(tu!=tv){pre[tu]=tv;} } void dfs(int u){vis[u]=1;for(int i=0,j=G[u].size();i<j;i++){int v=G[u][i];if(!vis[v]){dep[v]=dep[u]+1;dp[v][0]=u;dfs(v);}} } void init(){for(int i=1;i<=n;i++){G[i].clear();pre[i]=i;}memset(vis,0,sizeof(vis));memset(dep,0,sizeof(dep));memset(dp,0,sizeof(dp));cnt=0,num=0;tot=0;mp.clear(); } int LCA(int x,int y){if(dep[x]<dep[y])swap(x,y);//cout<<x<<" "<<dp[1][0]<<endl;while(dep[x]>dep[y])x=dp[x][(int)log2(dep[x]-dep[y])];if(x==y)return x;for(int i=log2(dep[x]);i>=0;i--){if(dp[x][i]!=dp[y][i])x=dp[x][i],y=dp[y][i];}return dp[x][0]; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){cin>>str>>str1;if(!mp[str])mp[str]=++tot;if(!mp[str1])mp[str1]=++tot;u=mp[str];v=mp[str1];G[u].push_back(v);G[v].push_back(u);marge(u,v);}//cout<<"1"<<endl;for(int i=1;i<=n;i++){if(pre[i]==i){dfs(i);}}//cout<<"2"<<endl;for(int i=0;i<20;i++){for(int j=1;j<=n;j++){dp[j][i+1]=dp[dp[j][i]][i];}}for(int i=1;i<=m;i++){cin>>str>>str1;u=mp[str];v=mp[str1];int lca=LCA(u,v);if(lca!=v){cout<<dep[u]-dep[lca]+1<<endl;}else{cout<<dep[u]-dep[lca]<<endl;}}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }

C++版本二

題解:LCA轉RMQ

卡著內存過的

/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=100000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r,u,v,c; int ans,cnt,flag,temp,tot,sum,num; int pre[N]; bool vis[N]; int dep[N<<1]; int dp[N<<1][18]; int que[N<<1]; int frist[N]; string str,str1; map<string,int>mp; vector<int>G[N]; int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} void marge(int u,int v){int tu=find(u);int tv=find(v);if(tu!=tv){pre[tu]=tv;} } void dfs(int u,int deep){vis[u]=1;que[++num]=u;frist[u]=num;dep[num]=deep;for(int i=0,j=G[u].size();i<j;i++){int v=G[u][i];if(!vis[v]){dfs(v,deep+1);que[++num]=u;dep[num]=deep;}} } void init(){for(int i=1;i<=n;i++){G[i].clear();pre[i]=i;}memset(vis,0,sizeof(vis));memset(dep,0,sizeof(dep));memset(dp,0,sizeof(dp));memset(frist,0,sizeof(frist));memset(que,0,sizeof(que));cnt=0,num=0;tot=0;mp.clear(); } void ST(int n){for(int i=1;i<=n;i++){dp[i][0]=i;}for(int i=0;(1<<i)<n;i++){for(int j=1;j+(1<<i)<=n;j++){int a=dp[j][i],b=dp[j+(1<<i)][i];dp[j][i+1]=dep[a]<dep[b]?a:b;}} } int RMQ(int l,int r){int k=log2(r-l+1);int a=dp[l][k],b=dp[r-(1<<k)+1][k];return dep[a]<dep[b]?a:b; }int LCA(int u,int v){int x=frist[u],y=frist[v];if(x>y)swap(x,y);int res=RMQ(x,y);return que[res]; } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){cin>>str>>str1;if(!mp[str])mp[str]=++tot;if(!mp[str1])mp[str1]=++tot;u=mp[str];v=mp[str1];//G[u].push_back(v);G[v].push_back(u);marge(u,v);}//cout<<"1"<<endl;for(int i=1;i<=n;i++){if(pre[i]==i){dfs(i,0);}}//cout<<"2"<<endl;ST(2*n-1);for(int i=1;i<=m;i++){cin>>str>>str1;u=mp[str];v=mp[str1];int lca=LCA(u,v);int x=frist[u],y=frist[v],z=frist[lca];//cout<<u<<v<<lca<<endl;//cout<<x<<y<<z<<endl;//cout<<dep[x]<<dep[y]<<dep[z]<<endl;//cout<<que[x]<<que[y]<<que[z]<<endl;if(lca!=v){cout<<dep[x]-dep[z]+1<<endl;}else{cout<<dep[x]-dep[z]<<endl;}}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }

C++版本三

題解:Tarjan算法

#include<bits/stdc++.h> using namespace std; #define MAXN 100010 #define MAXL 45struct Edge {int to,nxt; } e[MAXN];int i,T,tot,id,n,m,root; int head[MAXN],dep[MAXN],f[MAXN],lca[MAXN],fa[MAXN]; string a,b; string x[MAXN],y[MAXN]; bool visited[MAXN]; map<string,int> mp; vector< pair<int,int> > query[MAXN];inline void add(int u,int v) {tot++;e[tot] = (Edge){v,head[u]};head[u] = tot; } inline void init(int u) {int i,v;for (i = head[u]; i; i = e[i].nxt){v = e[i].to;dep[v] = dep[u] + 1;init(v);} } inline int find(int x) {if (f[x] == x) return x;return f[x] = find(f[x]); } inline void tarjan(int u) {int i,v,pos;visited[u] = true;f[u] = u;for (i = 0; i < query[u].size(); i++){v = query[u][i].first;pos = query[u][i].second;if (visited[v]) lca[pos] = find(v);}for (i = head[u]; i; i = e[i].nxt){v = e[i].to;tarjan(v);f[v] = u;} }int main() {ios :: sync_with_stdio(0);cin.tie(0);cin >> T;while (T--){cin >> n >> m;tot = id = 0;mp.clear();for (i = 1; i <= n; i++){head[i] = 0;fa[i] = 0;visited[i] = false;query[i].clear();}for (i = 1; i < n; i++) {cin >> a >> b;if (!mp[a]) mp[a] = ++id;if (!mp[b]) mp[b] = ++id; add(mp[b],mp[a]);fa[mp[a]] = mp[b];} for (i = 1; i <= n; i++) {if (!fa[i])root = i;}dep[root] = 0;init(root);for (i = 1; i <= m; i++) {cin >> x[i] >> y[i];query[mp[x[i]]].push_back(make_pair(mp[y[i]],i));query[mp[y[i]]].push_back(make_pair(mp[x[i]],i));}tarjan(root);for (i = 1; i <= m; i++) {if (x[i] == y[i]) printf("%d\n",0);else if (lca[i] == mp[x[i]]) printf("%d\n",1);else if (lca[i] == mp[y[i]]) printf("%d\n",dep[mp[x[i]]]-dep[mp[y[i]]]);else printf("%d\n",dep[mp[x[i]]]-dep[lca[i]]+1);}}return 0;}

C++版本四

題解:Tarjan算法

/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=200000+10; const int M=100000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,q,w,v,u; int ans,cnt,flag,temp,sum,tot; int pre[N]; bool vis[N]; int dep[N]; int ANS[N]; struct query{int u,v,id; }e[N],y; string str,str1; map<string,int>mp; vector<int>G[N]; vector<query>Q[N]; int find(int x){return pre[x]==x?x:pre[x]=find(pre[x]);} void marge(int u,int v){int tu=find(u);int tv=find(v);if(tu!=tv){pre[tu]=tv;} } void Tarjan(int u){//marge和find為并查集合并函數和查找函數//cout<<u<<endl;vis[u]=1;for(int i=0,j=G[u].size();i<j;i++) { //訪問所有u子節點vint v=G[u][i];if(vis[v])continue;dep[v]=dep[u]+1;Tarjan(v); //繼續往下遍歷marge(v,u); //合并v到u上//cout<<dep[v]<<endl;}for(int i=0,j=Q[u].size();i<j;i++){ //訪問所有和u有詢問關系的eint e=Q[u][i].v;int id=Q[u][i].id;int ID=(id+1)/2;if(vis[e]){int lca=find(e);//cout<<lca<<endl;if(id%2){if(lca!=e){ANS[ID]=dep[u]-dep[lca]+1;}else{ANS[ID]=dep[u]-dep[lca];}}else{if(lca!=u){ANS[ID]=dep[e]-dep[lca]+1;}else{ANS[ID]=dep[e]-dep[lca];}}}} } void init(){for(int i=1;i<=n;i++){pre[i]=i;G[i].clear();Q[i].clear();}memset(vis,0,sizeof(vis));memset(dep,0,sizeof(dep));memset(ANS,0x3f,sizeof(ANS));tot=0;mp.clear(); } int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);init();for(int i=1;i<n;i++){cin>>str>>str1;if(!mp[str])mp[str]=++tot;if(!mp[str1])mp[str1]=++tot;u=mp[str];v=mp[str1];G[u].push_back(v);G[v].push_back(u);marge(u,v);}for(int i=1;i<=m;i++){cin>>str>>str1;if(!mp[str])mp[str]=++tot;if(!mp[str1])mp[str1]=++tot;//n==1時u=mp[str];v=mp[str1];y.v=v;y.id=2*i-1;Q[u].push_back(y);y.v=u;y.id=2*i;Q[v].push_back(y);}int root=0;for(int i=1;i<=n;i++){if(pre[i]==i){//Tarjan(i);root=i;break;}}for(int i=1;i<=n;i++){pre[i]=i;}Tarjan(root);for(int i=1;i<=m;i++){cout<<ANS[i]<<endl;}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }

?

總結

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

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

主站蜘蛛池模板: 天天搞天天干 | 黄色小视频免费网站 | 高潮videossex高潮 | 国产正在播放 | 中文字幕精品无码一区二区 | 成人性视频网站 | 国产小视频在线观看免费 | 蜜臀av性久久久久蜜臀av麻豆 | 国产精品爱啪在线线免费观看 | 国产成年无码久久久久毛片 | 狠狠爱五月婷婷 | 久久久18禁一区二区三区精品 | 暖暖av| 一级国产特黄bbbbb | 男女午夜视频在线观看 | 日本一级淫片1000部 | 日韩精品人妻无码一本 | 黄色网页免费看 | 日韩第一页 | 中文字幕在线观看亚洲 | 浪荡奴双性跪着伺候 | 欧美精品一区二区成人 | 狠狠操网 | 狠狠干夜夜操 | 色在线影院 | 91黑丝在线观看 | 伊人网在线播放 | 欧美激情一区二区三级高清视频 | 500福利视频导航 | 精品国产一区二区在线 | a级在线看| 极品新婚夜少妇真紧 | 狠狠干伊人网 | asian性开放少妇pics | 欧美最黄视频 | 久久69| feel性丰满白嫩嫩hd | 在线成人免费观看 | 五月婷婷婷婷 | 精品日韩一区二区三区四区 | 国产精品嫩草影院精东 | 无码人妻精品一区二区三区66 | 成人在线观看网 | 日本久久综合网 | 麻豆影音| 少妇裸体淫交视频免费看高清 | 久久香焦 | 日韩欧美福利 | 97国产精品视频人人做人人爱 | 日日av| 少女忠诚电影高清免费 | 天天干天天爽天天操 | 国产成人精品亚洲男人的天堂 | 骚av在线| 亚洲一二三四视频 | 久久亚洲aⅴ无码精品 | 欧美精品hd | 青青草原综合久久大伊人精品 | 超碰青娱乐| 日韩精品偷拍 | 成人国产亚洲 | 麻豆精品在线播放 | 成人免费在线看片 | 成人激情在线 | 欧美呦交| 国产 日韩 欧美 综合 | 久久a毛片 | 日韩不卡一二三区 | 国产极品福利 | 欧美一级片在线视频 | 深夜激情影院 | 欧美老女人bb | 97精品熟女少妇一区二区三区 | 欧美乱大交xxxxx | 98视频在线 | 中日韩免费视频 | 少妇太紧太爽又黄又硬又爽小说 | wwwwww色 | 日本一区二区免费在线观看 | 国产免费午夜 | 国产精品久久777777毛茸茸 | 免费a级片视频 | 九九在线精品视频 | 久久久久久国产视频 | 人人搞人人插 | 天天干天天操天天干 | 99爱视频| 国产午夜福利100集发布 | 外国电影免费观看高清完整版 | 污片在线免费观看 | 黄色大片中文字幕 | 肉色丝袜脚交一区二区 | 精品一区二区三区成人免费视频 | 一本大道久久久久精品嫩草 | 国产精品人成在线观看免费 | 国产福利小视频在线 | 久青草视频在线观看 | 成年人视频免费看 | 久久精品—区二区三区舞蹈 |