2017-11-3离线赛总结
来源:互联网 发布:java语言精粹 pdf 编辑:程序博客网 时间:2024/06/01 08:15
有一段时间没有离线赛了,感觉这次考得还过得去
失分小结:
估分:240
实际分数:230
万万没想到自己第二题的n^3可以卡过去,正解为LCP(最长公共前缀)
第三题就是抽直径,然后就分类讨论
注意直径的性质:距离一点最远的点一定是直径两端点中的一点
设两个机房分别在a,b,他们在直径上对应的点为u,v
那么答案就会在Lt到u或u到v或v到Rt的路径上,然后由于满足单调性
对于中间的那部分,可以直接利用公式推算
#include<cstdio>#include<iostream>using namespace std;#define M 100005inline void chk_mx(int &x,int y){if(x<y)x=y;}int To[M<<1],nxt[M<<1],head[M],tta;void addedge(int a,int b){nxt[++tta]=head[a];head[a]=tta;To[tta]=b;}#define LFOR(i,x) for(int i=head[x];~i;i=nxt[i])int n,dep[M],fa[M],mark[M],dis[M],Fr[M],Mx[M],Num[M],Real[M];void dfs(int x,int f,int &t){ dep[x]=dep[f]+1; fa[x]=f; if(dep[t]<dep[x])t=x; LFOR(i,x){ int y=To[i]; if(y==f)continue; dfs(y,x,t); }}void mdfs(int x,int f,int a){ Fr[x]=a; dis[x]=dis[f]+1; if(Mx[a]<dis[x])Mx[a]=dis[x]; LFOR(i,x){ int y=To[i]; if(mark[y]||y==f)continue; mdfs(y,x,a); }}int Lt,Rt;struct Segment_Tree{ struct node{int l,r,mx;}tree[M<<2]; void build(int l,int r,int p,int flag){ tree[p].l=l,tree[p].r=r; if(l==r){ if(flag)tree[p].mx=Mx[Real[l]]-dep[Real[l]]; else tree[p].mx=Mx[Real[l]]+dep[Real[l]]; return; } int mid=(l+r)>>1; build(l,mid,p<<1,flag);build(mid+1,r,p<<1|1,flag); tree[p].mx=max(tree[p<<1].mx,tree[p<<1|1].mx); } int query(int l,int r,int p){ if(tree[p].l==l&&tree[p].r==r)return tree[p].mx; int mid=(tree[p].l+tree[p].r)>>1; if(mid>=r)return query(l,r,p<<1); else if(mid<l)return query(l,r,p<<1|1); else return max(query(l,mid,p<<1),query(mid+1,r,p<<1|1)); }}Lee,Ree;void init(){ dep[0]=-1,dis[0]=-1; dfs(1,0,Lt); dfs(Lt,0,Rt);//Lt-->Rt int t=dep[Rt]+1; int p=Rt;while(p){Real[t]=p;Num[p]=t--;mark[p]=1;p=fa[p];}//抽直径 p=Rt;while(p){mdfs(p,0,p);p=fa[p];} //find max Lee.build(1,Num[Rt],1,0); Ree.build(1,Num[Rt],1,1);}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++)head[i]=-1; for(int i=1;i<n;i++){ int x,y; scanf("%d%d",&x,&y); addedge(x,y);addedge(y,x); } init(); int m; scanf("%d",&m); while(m--){ int x,y; scanf("%d%d",&x,&y); int u=Fr[x],v=Fr[y]; if(dep[u]>dep[v])swap(u,v),swap(x,y); int ans=0; chk_mx(ans,min(dis[y]+dep[v],dis[x]+dep[u])); chk_mx(ans,min(dep[Rt]-dep[u]+dis[x],dep[Rt]-dep[v]+dis[y])); int pos=(dis[y]-dis[x]+dep[u]+dep[v])>>1;pos++; if(pos>Num[u])chk_mx(ans,Lee.query(Num[u]+1,pos,1)-dep[u]+dis[x]); if(pos+1<Num[v])chk_mx(ans,dis[y]+dep[v]+Ree.query(pos+1,Num[v]-1,1)); printf("%d\n",ans); } return 0;}
阅读全文
0 0
- 2017-11-3离线赛总结
- 2017-11-3离线赛总结
- 2017-11-4离线赛总结
- 2017-11-5离线赛总结
- 2017-11-6离线赛总结
- 2017-11-7离线赛总结
- 2017-11-8离线赛总结
- 2017-11-9离线赛总结
- 2017.10.11离线赛总结
- 2017.10.3离线赛总结
- 2017-11-8离线赛总结 (NOIP七连测第六场)
- 2017/7/29 离线赛 总结
- 2017-9-24离线赛总结
- 2017-9-25离线赛总结
- 2017-9-26离线赛总结
- 2017-9-28离线赛总结
- 2017-9-29离线赛总结
- 2017-10-4离线赛总结
- tomcat在linux中启动慢的解决方案
- Centos7.0以上版本静态IP设置
- Spring框架之基础类—GenericBeanDefinition实现类
- 深入理解BFC和Margin Collapse
- MD5加密下的SQL注入
- 2017-11-3离线赛总结
- 笔记:Echarts
- Java Http请求工具类和接收请求的方法
- iptables的基本概念和数据包流程图
- Codeforces Round #442 (Div. 2) A+B+C
- 解决linux下tomcat8.5上传图片other用户无法通过Nginx查看的问题
- NB-IoT要点概括与工作状态解析
- 2017-3-4 IDEA中运行Topology
- python基础教程链接