【HackerRank】【HourRank 20】Birjik and Nicole's Tree Game
来源:互联网 发布:淘宝电商需要什么条件 编辑:程序博客网 时间:2024/06/01 10:15
题目大意
给你一棵形态确定的
Solution
果然是好久没打题了,看了题目又不会做。
观察题目可以发现,由于
这样的节点有多少个?
考虑排序后被染色的点
1.
2.
a)
b)
因此我们最多有
这样我们就可以在
#include<set>#include<map>#include<queue>#include<cmath>#include<string>#include<cstdio>#include<vector>#include<cassert>#include<cstring>#include<iostream>#include<algorithm>#define rep(i,a,b) for (int i=a; i<=b; i++)#define per(i,a,b) for (int i=a; i>=b; i--)#define debug(x) {cout<<(#x)<<" "<<x<<endl;}using namespace std;typedef long long LL;inline int read() { int x=0,f=1; char ch=getchar(); while (!(ch>='0'&&ch<='9')) {if (ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9') {x=x*10+(ch-'0'); ch=getchar();} return x*f;}const int N = 300005;int n,q,k,ind=0;vector<int> e[N],e2[N];int dep[N],f[N][21];int inp[N],oup[N];inline void dfs(int x,int fa) { inp[x]=++ind; dep[x]=dep[fa]+1; f[x][0]=fa; rep(i,1,20) f[x][i]=f[f[x][i-1]][i-1]; for (int i=0;i<(int)e[x].size();i++) if (e[x][i]!=fa) dfs(e[x][i],x); oup[x]=++ind;}inline int LCA(int u,int v) { if (dep[u]<dep[v]) swap(u,v); int d=dep[u]-dep[v]; per(i,20,0) if (d&(1<<i)) u=f[u][i]; per(i,20,0) if (f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i]; if (u==v) return u; return f[u][0];}int cnt[N],num[N];inline void dfs2(int x,int fa) { for (int i=0;i<(int)e2[x].size();i++) { dfs2(e2[x][i],x); num[x]+=num[e2[x][i]]; } cnt[num[x]]+=dep[x]-dep[fa];}int ver[N<<1];bool cmp(int a,int b) { return inp[a]<inp[b];}int stk[N];int main() { #ifndef ONLINE_JUDGE // freopen("input43.txt","r",stdin); // freopen("data.out","w",stdout); #endif n=read(); rep(i,1,n-1) {int u=read(),v=read(); e[u].push_back(v); e[v].push_back(u);} dep[0]=0; dfs(1,0); q=read(); while (q--) { int k=read(); int vsize=0; rep(i,1,k) { int x=read(); ver[++vsize]=x; num[x]=1; } sort(ver+1,ver+vsize+1,cmp); per(i,vsize,2) ver[++vsize]=LCA(ver[i],ver[i-1]); ver[++vsize]=1; sort(ver+1,ver+vsize+1,cmp); int nsize=1; rep(i,2,vsize) if (ver[i]!=ver[i-1]) ver[++nsize]=ver[i]; vsize=nsize; int top=0; stk[++top]=ver[1]; rep(i,2,vsize) { while (top>0&&oup[stk[top]]<=inp[ver[i]]) top--; stk[++top]=ver[i]; e2[stk[top-1]].push_back(stk[top]); } rep(i,0,k) cnt[i]=0; dfs2(1,0); cnt[0]=n; rep(i,1,k) cnt[0]-=cnt[i]; rep(i,0,k) printf("%d ",cnt[i]); puts(""); rep(i,1,vsize) {e2[ver[i]].clear(); num[ver[i]]=0;} } return 0;}
- 【HackerRank】【HourRank 20】Birjik and Nicole's Tree Game
- [Hackerrank]hourrank 19-What Are the Odds?
- HackerRank - number-game-on-a-tree
- Hackerrank (1): CodeStorm 2015 > Little Alexey's Tree
- [Hackerrank题目选做] Kundu and Tree 组合数学
- HackerRank: Bricks Game
- Hackerrank-Data structures-Tree
- Hackerrank Fibonacci Numbers Tree
- HackerRank-Tree: Inorder Traversal
- Hackerrank - Game Of Rotation 题解
- 【HackerRank】 Game Of Thrones - I
- Python HackerRank|The Minion Game
- Hackerrank Sherlock and Squares
- [hackerrank]Bob and Ben
- Roads and Libraries HackerRank
- Bricks Game(HackerRank play-game)
- codeforce--Vasya and Petya's Game
- A. Vasya and Petya's Game
- 0503
- Problem B: 合唱比赛开始了!
- 企业部署WAPI无线网络的技术详析
- 关于webStorm的实用的快捷键
- 求最大子矩阵的和
- 【HackerRank】【HourRank 20】Birjik and Nicole's Tree Game
- menu文件在actionbar中的用法
- 安卓集成极光推送经验总结
- PHP中的VC6,VC9,VC11,TS,NTS区别
- Linux 远程登录
- Easy-8
- okhttp的两种简易请求
- 欢迎使用CSDN-markdown编辑器
- c++实验5——数组分离