【队内胡策 10.30】 T2
来源:互联网 发布:mac第一次创建的账户 编辑:程序博客网 时间:2024/05/16 18:23
求一个被memset卡时的人的心理阴影面积
嗯。。多叉树。。考试的时候想成二叉树了
两个人肯定尽量去堵对方的路
所以他们一定会在一个点相遇
如果这个点还有其他分枝,按最优原则分配给两个人:
如果两个人走过的总边数为奇数,那么相遇后,下一个选择的人是Yjq,反之为Hja。每个人选择当前可以选择的分枝中子树权值最大的一个。所以预处理以每个点为根的子树的大小
这个题最麻烦的是分类求相遇点。。
总的思路:
求lca得到经过的边数
找相遇点以及到达相遇点上一步两个人所处的点
分配答案
分配答案的函数里我加了一个memset。。然后TLE了4个点。。。其实每次都修改,sort的时候只sort当前区间,是不用memset的。。。
代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const int maxn=100000+10;int n,m,cnt,ans,Index;int fist[maxn],nxt[maxn<<1],fa[maxn][22],deep[maxn],rank[maxn];int zi[maxn];struct hh{ int f,t,v;}e[maxn<<1];int dfs(int f,int t,int v){ deep[t]=deep[f]+1; fa[t][0]=f; for(int i=fist[t];i!=-1;i=nxt[i]) if(f!=e[i].t) zi[t]+=dfs(t,e[i].t,e[i].v)+e[i].v; return zi[t];}void done(){ for(int i=1;i<=log2(n);++i) for(int j=1;j<=n;++j) fa[j][i]=fa[fa[j][i-1]][i-1];}int make_lca(int x,int y){ if(deep[x]<deep[y]) swap(x,y); for(int i=log2(n);i>=0;--i) if(deep[fa[x][i]]>=deep[y]) x=fa[x][i]; if(x==y) return x; for(int i=log2(n);i>=0;--i) if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } return fa[x][0];}void build(int f,int t,int v){ e[++cnt]=(hh){f,t,v}; nxt[cnt]=fist[f]; fist[f]=cnt;}int get_fa(int x,int j){ for(int i=log2(n);i>=0;--i) if(deep[fa[x][i]]>=j) x=fa[x][i]; return x;}bool cmp(int x,int y){ return x>y;}void ask_ans(int mid,int x,int y,int lca,int first){ int cnt1=0; //memset(rank,0,sizeof(rank)); if(fa[mid][0]==x) ans+=zi[1]-zi[mid]; for(int i=fist[mid];i!=-1;i=nxt[i]) { int t=e[i].t; if(t==x||t==y) { if(t==x&&t!=fa[mid][0]) ans+=zi[t]+e[i].v; continue; } if(t==fa[mid][0]) rank[++cnt1]=zi[1]-zi[lca]; else rank[++cnt1]=zi[t]+e[i].v; } sort(rank+1,rank+cnt1+1,cmp); int i=2; if(first) i=1; for(;i<=cnt1;i+=2) ans+=rank[i];}int main(){ memset(fist,-1,sizeof(fist)); scanf("%d%d",&n,&m); for(int i=1;i<n;++i) { int a,b,c; scanf("%d%d%d",&a,&b,&c); build(a,b,c); build(b,a,c); } dfs(0,1,0); done();for(int i=1;i<=m;++i) { ans=0; int a,b; scanf("%d%d",&a,&b); int lca=make_lca(a,b); int mid,ka,kb,first=0,where; int l=deep[a]+deep[b]-2*deep[lca]; mid=(l+1)>>1; if(l%2==0) first=1; if(l==1) where=b; else if(deep[a]>deep[b]) where=get_fa(a,deep[a]-mid); else where=get_fa(b,deep[b]-(l-mid)); if(lca!=where) { if(deep[a]-deep[lca]<mid) ka=fa[where][0]; else ka=get_fa(a,deep[a]-mid+1); if(deep[b]-deep[lca]<l-mid) kb=fa[where][0]; else kb=get_fa(b,deep[b]-(l-mid)+1); } else { ka=get_fa(a,deep[lca]+1); kb=get_fa(b,deep[lca]+1); } if(a==where) ka=0; if(b==where) kb=0; if(a==b) ka=kb=0; ask_ans(where,ka,kb,lca,first); printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 【队内胡策 10.30】 T2
- 【队内胡策 10.24 T2】术式
- 【队内胡策 11.1】 T1 T2
- 【队内胡策 11.3】 T1 T2
- t2
- t2
- t2
- T2
- t2
- T2
- 【NOIP模拟】 (10.30) T2 游戏
- NOIP模拟(10.30)T2 Game
- <胡策day> 10.30 T2 树上的战争(倍增lca)
- T2-J
- T2定时器
- 10.18 T2
- NOIp2013PJ T2
- NOIp2004PJ T2
- 展望丨人工智能:中国或成领跑者
- 现场丨2017中国计算机大会(CNCC2017)之沈向洋演讲:自然语言中的描述、对话和隐喻
- android studio中如何申请百度地图新版Key中SHA1值
- 干货丨2017年含金量最高的机器学习技能或知识有哪些?
- 干货丨三大特征选择策略,有效提升你的机器学习水准
- 【队内胡策 10.30】 T2
- Git的详细使用命令和DOC的简单实用指令
- 配置使用IM表达式的基本任务
- 2.7、迭代器
- 移动APP渗透测试方案 展示5个方面总结3种常见漏洞—转载绿盟科技
- 幼儿园第一天
- 资讯丨高通骁龙芯片与AI亲密接触、百度开启燎原计划扶持AI开发者
- 深度丨全球14家顶尖 AI 产业巨头深度学习实力及战略分析
- 干货丨一文看懂生成对抗网络:从架构到训练技巧