BZOJ3219:巡游
浅谈树分治:https://www.cnblogs.com/AKMer/p/10014803.html
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=3219
因为中位数也可以二分,所以这题跟WC2010重建计划差不多。不加剪枝会\(TLE\)。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(n)\)
点分治版代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1e5+5;
bool vis[maxn];
int n,L,R,N,tot,mx,rt,ans,Mx,limit;
int now[maxn],pre[maxn*2],son[maxn*2],val[maxn*2];
int f[maxn],g[maxn],siz[maxn],Q[maxn],depest[maxn],V[maxn],dis[maxn];
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
void add(int a,int b,int c) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b,val[tot]=c;
}
void find_rt(int fa,int u) {
int res=0;siz[u]=1;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[v]&&v!=fa)find_rt(u,v),res=max(res,siz[v]),siz[u]+=siz[v];
res=max(res,N-siz[u]);
if(res<mx)mx=res,rt=u;
}
void dfs(int fa,int u,int dep) {
siz[u]=1;mx=max(mx,dep);
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[v]&&v!=fa)dfs(u,v,dep+1),siz[u]+=siz[v];
}
bool cmp(int a,int b) {
return depest[a]<depest[b];
}
int calc(int v) {
if(v<limit)return -1;
return 1;
}
void make_g(int fa,int u,int dep,int len) {
if(dep>R)return;
g[dep]=max(g[dep],len);
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[v]&&v!=fa)make_g(u,v,dep+1,len+calc(val[p]));
}
bool query(int a,int b) {
int pos=a,h=0,t=0;
for(int i=1;i<=b;i++) {
while(i+pos>=L&&pos>=0) {
while(h!=t&&f[Q[t-1]]<f[pos])t--;
Q[t++]=pos,pos--;
}
while(h!=t&&i+Q[h]>R)h++;
if(h!=t&&f[Q[h]]+g[i]>=0)return 1;
}
return 0;
}
bool check(int u) {
for(int i=1;i<=depest[V[tot]];i++)f[i]=-maxn,g[i]=-maxn;
for(int i=1;i<=tot;i++) {
make_g(u,V[i],1,calc(dis[V[i]]));
if(query(depest[V[i-1]],depest[V[i]]))return 1;
for(int j=1;j<=depest[V[i]];j++)
f[j]=max(f[j],g[j]),g[j]=-maxn;
}
return 0;
}
void work(int u,int size) {
N=size,mx=rt=n+1,find_rt(0,u);
u=rt,vis[u]=1,tot=0;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[v]) {
V[++tot]=v,mx=0,dis[v]=val[p];
dfs(u,v,1),depest[v]=min(R,mx);
}
sort(V+1,V+tot+1,cmp);
if(2*depest[V[tot]]<L)return;
int l=ans,r=Mx;
while(l<r) {
limit=(l+r+1)>>1;
if(check(u))l=limit;
else r=limit-1;
}ans=l;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[v])work(v,siz[v]);
}
int main() {
n=read(),L=read(),R=read();
for(int i=1;i<n;i++) {
int a=read(),b=read(),c=read();
add(a,b,c),add(b,a,c);Mx=max(Mx,c);
}work(1,n);
if(!ans)puts("-1");
else printf("%d\n",ans);
return 0;
}
边分治版代码如下:
#include <cmath>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
#define fr first
#define sc second
const int maxn=2e5+5;
vector<pii>to[maxn];
vector<pii>::iterator it;
bool vis[maxn];
int siz[maxn],f[maxn],g[maxn],Q[maxn];
int now[maxn],pre[maxn*2],son[maxn*2],val[maxn*2];
int n,L,R,N,tot,mx,id,limit,Mx,ans,fake1,fake2,u1,u2,cnt;
int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
void add(int a,int b,int c) {
pre[++tot]=now[a];
now[a]=tot,son[tot]=b,val[tot]=c;
}
void find_son(int fa,int u) {
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(v!=fa)find_son(u,v),to[u].push_back(make_pair(v,val[p]));
}
void rebuild() {
tot=1;memset(now,0,sizeof(now));
for(int i=1;i<=n;i++) {
int size=to[i].size();
if(size<=2) {
for(it=to[i].begin();it!=to[i].end();it++) {
pii tmp=*it;
add(i,tmp.fr,tmp.sc),add(tmp.fr,i,tmp.sc);
}
}
else {
pii u1=make_pair(++n,0),u2;
if(size==3)u2=to[i].front();
else u2=make_pair(++n,0);
add(i,u1.fr,u1.sc),add(u1.fr,i,u1.sc);
add(i,u2.fr,u2.sc),add(u2.fr,i,u2.sc);
if(size==3) {
for(int j=1;j<3;j++)
to[n].push_back(to[i].back()),to[i].pop_back();
}
else {
int p=0;
for(it=to[i].begin();it!=to[i].end();it++) {
if(!p)to[n-1].push_back(*it);
else to[n].push_back(*it);p^=1;
}
}
}
}
}
void find_edge(int fa,int u) {
siz[u]=1;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[p>>1]&&v!=fa) {
find_edge(u,v),siz[u]+=siz[v];
if(abs(N-2*siz[v])<mx)
mx=abs(N-2*siz[v]),id=p>>1;
}
}
void dfs(int fa,int u,int dep) {
mx=max(mx,dep),siz[u]=1;
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[p>>1]&&v!=fa)dfs(u,v,dep+1),siz[u]+=siz[v];
}
int calc(int v) {
if(!v)return 0;
if(v<limit)return -1;
return 1;
}
void solve(int *a,int fa,int u,int dep,int len) {
if(dep>R)return;
a[dep]=max(a[dep],len);
for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
if(!vis[p>>1]&&v!=fa)solve(a,u,v,dep+(val[p]!=0),len+calc(val[p]));
}
bool query(int a,int b) {
int pos=a,h=0,t=0;
for(int i=0;i<=b;i++) {
while(i+pos+cnt>=L&&pos>=0) {
while(h!=t&&f[Q[t-1]]<f[pos])t--;
Q[t++]=pos,pos--;
}
while(h!=t&&Q[h]+i+cnt>R)h++;
if(h!=t&&f[Q[h]]+g[i]+calc(val[id<<1])>=0)return 1;
}
return 0;
}
bool check() {
for(int i=1;i<=fake2;i++)g[i]=f[i]=-maxn;
solve(f,0,u1,0,0),solve(g,0,u2,0,0);
if(query(fake1,fake2))return 1;
return 0;
}
void work(int u,int size) {
if(size<2)return;
N=size,mx=id=n+1,find_edge(0,u);
fake1=0,fake2=0;vis[id]=1;
u1=son[id<<1],u2=son[id<<1|1];
mx=0,dfs(0,u1,0),fake1=min(R,mx);
mx=0,dfs(0,u2,0),fake2=min(R,mx);
if(fake1>fake2)swap(u1,u2),swap(fake1,fake2);
cnt=(val[id<<1]!=0);
if(fake2+fake1+cnt<L)return;
int l=ans,r=Mx;
while(l<r) {
limit=(l+r+1)>>1;
if(check())l=limit;
else r=limit-1;
}ans=l;
int tmp1=u1,tmp2=u2;
work(tmp1,siz[tmp1]),work(tmp2,siz[tmp2]);
}
int main() {
n=read(),L=read(),R=read();
for(int i=1;i<n;i++) {
int a=read(),b=read(),c=read();
add(a,b,c),add(b,a,c),Mx=max(Mx,c);
}find_son(0,1),rebuild(),work(1,n);
if(!ans)puts("-1");
else printf("%d\n",ans);
return 0;
}
BZOJ3219:巡游的更多相关文章
- 六星经典CSAPP笔记(1)计算机系统巡游
CSAPP即<Computer System: A Programmer Perspective>的简称,中文名为<深入理解计算机系统>.相信很多程序员都拜读过,之前买的旧版没 ...
- Ajax完整篇(转载)
Ajax 完整教程 第 1 页 Ajax 简介Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用 ...
- 恶趣味小游戏 I'm hungry
之前学算法的时候无聊做了个游戏放松放松,现在传到了github以免电脑坏了就永远丢失了... github地址:https://github.com/BenDanChen/IamHungry I am ...
- ajax教程完整版
第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序.本文的作者是 ...
- Ajax 完整教程。。转载
Ajax 完整教程 第 1 页 Ajax 简介 Ajax 由 HTML.JavaScript™ 技术.DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应 ...
- dp式子100个……
1. 资源问题1-----机器分配问题F[I,j]:=max(f[i-1,k]+w[i,j-k]) 2. 资源问题2------01背包问题F[I,j]:=max(f[i- ...
- HK游记 Day2迪斯尼(下)
接下来我们要去看狮子王庆典,绕啊绕啊,终于进场了,说实话我对一大帮人扮演动物歌舞表演不是很感冒,静倒是觉得很好看,印象最深的是狮子王的主题曲,还有大象车,长颈鹿车,狮子王车,静举着手机拍视频. 看完表 ...
- 越狱Season 1- Episode 18: Bluff
Season 1, Episode 18: Bluff -Michael: Scofield Scofield Michael Scofield Michael Scofield -Patoshik: ...
- 掌握 Ajax,第 1 部分: Ajax 入门简介
转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...
随机推荐
- caffe---ubuntu1604下anaconda2.5的尝试----失败,建议使用系统的python系统,避免各种各样的陷阱
caffe---ubuntu1604下anaconda2.5的尝试----失败,建议使用系统的python系统,避免各种各样的陷阱. 如果使用caffe+ anacoanda 已经遇到的陷阱有 1. ...
- 10-客户端防表单重复提交和服务器端session防表单重复提交
/****************************************************DoFormServlet********************************** ...
- 初识vue-01
一.属性和方法 vue自定义的一些数据和方法需要绑定到实例的不同属性上面去例如数据都要绑定要data属性,方法都要绑定到methods方法实例上的data和methods里面的key值会自动挂载到vu ...
- struts2 Eclipse 中集成strust2开发框架实例
下面通过建立一个小的实例具体来说明Eclipse 集成struts2,以下实例采用的为 struts2 版本为 struts2 2.2.3.1 为应用. 1. 下载struts2的开发包 第一步: 在 ...
- Til the Cows Come Home(最短路模板题)
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Description Bessie is ...
- 九度OJ 1082:代理服务器 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1871 解决:574 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务器的IP地 ...
- 九度OJ 1068:球的半径和体积 (基础题)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5385 解决:1949 题目描述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心点和球上某一点的坐标,以如下形式输 ...
- win10+UEFI下u盘安装ubuntu16.04
本人电脑是华硕,由于要求使用linux所以安装: 1.首先给linux划出一个大分区,感觉最少50G: win10下磁盘管理,在最后的分区中压缩出50g,空间,其他的不用问了,也不用继续分区,一个大的 ...
- 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Zhuo' did not find a matching property.
eclipse里面配置tomcat方法:window -- show view -- other -- 找到servers 点击finish 就会出现servers选项卡在选项卡中右键鼠标 new - ...
- Hadoop基础学习(一)分析、编写并执行WordCount词频统计程序
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jiq408694711/article/details/34181439 前面已经在我的Ubuntu ...