Codeforces Gym 100650B Countdown (离线)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Gym 100650B Countdown (离线)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:http://codeforces.com/gym/100650
根據(jù)給出的樹和d,求出一些結(jié)點,這些結(jié)點形成子樹的第d層結(jié)點數(shù)應(yīng)該盡量多,具體要求可以參考題目。
dfs一個結(jié)點前保存詢問深度的答案,訪問完以后減去之前的值就得到答案了。
#include<bits/stdc++.h> using namespace std; const int maxn = 1100;vector<string> names; map<string,int> mp; int id_cnt; #define se second #define MP make_pairint ID(const string & s){map<string,int>::iterator i = mp.find(s);if(i != mp.end()) return i->se;names.push_back(s);mp.insert(MP(s,id_cnt));return id_cnt++; } int deg[maxn]; int head[maxn],nxt[maxn],to[maxn],ecnt;void addEdge(int u,int v) {to[ecnt] = v;nxt[ecnt] = head[u];head[u] = ecnt++; }int pre[maxn*2]; int cnt[maxn*2]; int deep[maxn];struct Node {int d,id;bool operator < (const Node & x) const {return d < x.d || ( d == x.d && names[id] > names[x.id] );} };priority_queue<Node> q;int n,d; void dfs(int u) {cnt[deep[u]]++;int qd = deep[u]+d;if(qd < maxn) pre[u] = cnt[qd];for(int i = head[u]; ~i; i = nxt[i]){int v = to[i];deep[v] = deep[u]+1;dfs(v);}if(qd<maxn){int ans = cnt[qd]-pre[u];if(ans) q.push(Node{ans,u});} }void init() {names.clear();mp.clear();id_cnt = 0;ecnt = 0;memset(deg,0,sizeof(deg));memset(head,-1,sizeof(head));memset(cnt,0,sizeof(cnt));while(q.size()) q.pop(); }char str[500];void read() {scanf("%d%d",&n,&d);while(n--){int ch; scanf("%s%d",str,&ch);int fa = ID(str);while(ch--){scanf("%s",str);int v = ID(str);deg[v]++;addEdge(fa,v);}} }void topo() {int root;n = mp.size();for(int i = 0; i < n; i++){if(deg[i] == 0) { root = i; break; }}deep[root] = 0;dfs(root); }int main() {//freopen("in.txt","r",stdin);int T; scanf("%d",&T);for(int kas = 1; kas <= T; kas++){init();read();topo();printf("Tree %d:\n",kas);for(int i = 1; i <= 3; i++){if(q.empty()) break;Node x = q.top(); q.pop();printf("%s %d\n",names[x.id].c_str(),x.d);if(i == 3){int pre = x.d;while(q.size()){x = q.top(); q.pop();if(x.d == pre){printf("%s %d\n",names[x.id].c_str(),x.d);}else {break;}}}}if(kas != T) putchar('\n');}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/jerryRey/p/4740203.html
總結(jié)
以上是生活随笔為你收集整理的Codeforces Gym 100650B Countdown (离线)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于插件化的企业级开发平台JXADF(开
- 下一篇: linux下查看文件夹的大小