博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2114 点分治
阅读量:6880 次
发布时间:2019-06-26

本文共 1606 字,大约阅读时间需要 5 分钟。

思路:

点分治

//By SiriusRen#include 
#include
#include
using namespace std;#define N 10005int n,k,xx,yy,first[N],next[N*2],v[N*2],w[N*2],tot;int f[N],size[N],vis[N],d[N],deep[N],root,sum,ans;void add(int x,int y,int z){w[tot]=z,v[tot]=y,next[tot]=first[x],first[x]=tot++;}void getroot(int x,int fa){ size[x]=1,f[x]=0; for(int i=first[x];~i;i=next[i])if(!vis[v[i]]&&v[i]!=fa) getroot(v[i],x),size[x]+=size[v[i]],f[x]=max(f[x],size[v[i]]); f[x]=max(f[x],sum-size[x]); if(f[x]
k)r--; else{ if(deep[l]==deep[r]){t+=(r-l+1)*(r-l)/2;break;} int st=l,ed=r; while(deep[st]==deep[l])st++; while(deep[ed]==deep[r])ed--; t+=(st-l)*(r-ed); l=st,r=ed; } return t;}void work(int x){ ans+=calc(root,0),vis[x]=1; for(int i=first[x];~i;i=next[i])if(!vis[v[i]]) ans-=calc(v[i],w[i]), sum=size[v[i]],root=0, getroot(v[i],x),work(root);}int read(){ int x=0;char p=getchar(); while(p<'0'||p>'9')p=getchar(); while(p>='0'&&p<='9')x=x*10+p-'0',p=getchar(); return x; }int main(){ while(scanf("%d",&n)&&n){ memset(first,-1,sizeof(first));tot=0; for(int i=1;i<=n;i++) while(xx=read()) yy=read(),add(i,xx,yy),add(xx,i,yy); while(k=read()){ memset(vis,0,sizeof(vis)); f[0]=10005,root=ans=0,sum=n,getroot(1,0); work(root); puts(ans?"AYE":"NAY"); }puts("."); }}

这里写图片描述

转载于:https://www.cnblogs.com/SiriusRen/p/6532085.html

你可能感兴趣的文章
这样一篇典型的软文
查看>>
微信内置的浏览器window.location.href 跳转不兼容问题
查看>>
数据库相关内容 已看1 有用
查看>>
【bzoj3110】[Zjoi2013]K大数查询
查看>>
java中相对路径,绝对路径问题总结
查看>>
[转载] 山楂树之恋——07-09
查看>>
足球——2011-2012德甲球队队标
查看>>
Signalr系列之虚拟目录详解与应用中的CDN加速实战
查看>>
一个简单的Linux后门程序的实现
查看>>
前端之jquery
查看>>
Java练习 SDUT-2246_时间日期格式转换
查看>>
Python中 可变参数
查看>>
python_函数传递列表
查看>>
上海市松江区 <-> 上海市金山区枫泾·万枫东路ab6177,racehttp://live.racing-china.com/...
查看>>
webpack 学习笔记 (一)
查看>>
eclipse安装spring的插件
查看>>
hide software keybox
查看>>
Linux下clock计时函数学习【转】
查看>>
0405复利5.0震撼来袭
查看>>
【软件工程】功能规格说明书
查看>>