洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ
正解:贪心+倍增+二分答案
解题报告:
正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题
其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了...
从标签就可以发现是个很麻烦考虑的点很多的问题,所以分开按步骤梳理我觉得应该会好些qwq
帕1,贪心
首先最最基本的思想要想到趴?就是贪心,就是,如果我不能跑到首都,我肯定是尽量往上跑;然后如果能跑到首都就先跑到首都再想怎么分配
帕2,倍增
已经发现是要往上提了,自然考虑倍增,于是写个函数预处理掉倍增这事儿
void dfs1(int u,int fafa) { for(int i=head[u];i;i=edge[i].next) ]=u;d[edge[i].to][]=edge[i].wei;dis[edge[i].to]=dis[u]+edge[i].wei;dfs1(edge[i].to,u);} } inline void pre() { dfs1(,); rp(i,,) rp(j,,n)fa[j][i]=fa[fa[j][i-]][i-],d[j][i]=d[j][i-]+d[fa[j][i-]][i-]; } //分了俩段,结构更好看qwq这是代码
帕3,二分
可以发现这个显然是个能二分的自然是想到二分
于是就写个check函数
然后这题就结束了
不存在的这题最麻烦的地方就在这个check函数趴?
然后接下来几个帕都是港这个check函数
关于check函数:
帕1,上提
通过之前预处理出的倍增往上走就是了
inline int stp(int u,int lim) {my(i,,)if(fa[u][i] && d[u][i]<=lim)lim-=d[u];[i],u=fa[u][i];return u;} //lim:二分的那个时间这还是代码
帕2,判断是否到首都
如果没到首都就让它呆哪儿,到了首都登记下它还能走多久
rp(i,,m) { int upup=stp(arm[i],limit); )vis[upup]=; else army[++cnt].sid=ff[i],army[cnt].tim=limit-dis[arm[i]]; } //判断:如果不能到就停哪儿,能到就登记下(就像之前贪心所说这又是代码
帕3,处理首都的亲崽有几个还没驻扎
再写个函数,判断有几个崽没被驻扎,登记下来(如果都被驻扎了就可以直接GG了退出掉
(对了我登记那儿忘复制来了但是又懒得编辑了就这样,自己去整个程序里看就是了,就在dfs后面qwq
void dfs2(int u) { ,orzgoldgenius=; for(int i=head[u];i;i=edge[i].next) { ]) { orzgoldgenius=; dfs2(edge[i].to); ; } } vis[u]=orzcjk&orzgoldgenius; } dfs2();这双是代码
帕4,分配
把登记了的到了首都的发配给没有被驻扎的崽子们那儿去(关于这里的处理似乎有争议啊...等下港qwq 争议被抹掉了没有争议
不过关于分配细节挺多的要注意下嗷
sort(army+,army+cnt+);sort(ned+,ned+cjk+,cmp); rp(i,,cjk) { if(!vis[ned[i]]) { )return false; ) { if(army[now].tim<dis[ned[i]] && now!=cnt) { vis[army[now].sid]=true; if(ned[i]==army[now].sid)break; ++now; } else { if(now==cnt)break; if(army[now].sid!=ned[i] && (!vis[army[now].sid])) { vis[army[now].sid]=true; ++now; } else break; } } if(now==cnt)if(army[now].tim<dis[ned[i]] && army[now].sid!=ned[i])return false; vis[ned[i]]=true;++now; } } return true;这叒是代码
然后就真滴讲完辽,二分什么的太套路了懒得放
最后放程序
overrrr
#include<bits/stdc++.h>
using namespace std;
#define rp(i,x,y) for(register int i=x;i<=y;++i)
#define my(i,x,y) for(register int i=x;i>=y;--i)
#define mp make_pair
#define pi pair<int,int>
,M=;
,fa[N][],d[N][],dis[N],ned[N],ff[N];
struct ed{int to,next,wei;}edge[M];
struct alive{int sid,tim;}army[N];
bool vis[N];
bool operator <(alive x,alive y){return x.tim<y.tim;}
inline int read()
{
;;
'))ch=getchar();
;
)+(x<<)+(ch^'),ch=getchar();
return y?x:-x;
}
inline void add(int x,int y,int z){edge[++tot].to=y;edge[tot].next=head[x];edge[tot].wei=z;head[x]=tot;}
void dfs1(int u,int fafa)
{
for(int i=head[u];i;i=edge[i].next)
]=u;d[edge[i].to][]=edge[i].wei;dis[edge[i].to]=dis[u]+edge[i].wei;dfs1(edge[i].to,u);}
}
void dfs2(int u)
{
,orzgoldgenius=;
for(int i=head[u];i;i=edge[i].next)
{
])
{
orzgoldgenius=;
dfs2(edge[i].to);
;
}
}
vis[u]=orzcjk&orzgoldgenius;
}
inline void pre()
{
dfs1(,);
rp(i,,)
rp(j,,n)fa[j][i]=fa[fa[j][i-]][i-],d[j][i]=d[j][i-]+d[fa[j][i-]][i-];
}
inline ,)if(fa[u][i] && d[u][i]<=lim)lim-=d[u][i],u=fa[u][i];return u;}
inline bool cmp(int x,int y){return dis[x]<dis[y];}
bool jud(int limit)
{
;memset(vis,,sizeof(vis));
rp(i,,m)
{
int upup=stp(arm[i],limit);
)vis[upup]=;
else army[++cnt].sid=ff[i],army[cnt].tim=limit-dis[arm[i]];
}
dfs2();
,now=;
];i;i=edge[i].next)if(!vis[edge[i].to])ned[++cjk]=edge[i].to;
sort(army+,army+cnt+);sort(ned+,ned+cjk+,cmp);
rp(i,,cjk)
{
if(!vis[ned[i]])
{
)return false;
)
{
if(army[now].tim<dis[ned[i]] && now!=cnt)
{
vis[army[now].sid]=true;
if(ned[i]==army[now].sid)break;
++now;
}
else
{
if(now==cnt)break;
if(army[now].sid!=ned[i] && (!vis[army[now].sid]))
{
vis[army[now].sid]=true;
++now;
}
else break;
}
}
if(now==cnt)if(army[now].tim<dis[ned[i]] && army[now].sid!=ned[i])return false;
vis[ned[i]]=true;++now;
}
}
return true;
}
inline ,))x=fa[x][i];return x;}
int main()
{
n=read();rp(i,,n-){int t1=read(),t2=read(),t3=read();add(t1,t2,t3);add(t2,t1,t3);}
pre();
m=read();rp(i,,m)arm[i]=read(),ff[i]=getf(arm[i]);
while(l<=r)
{
;
;
;
}
!=l)printf("%d\n",l);
else printf("-1\n");
;
}
这,依然是代码(...我是不是有点无聊啊233333333
啊森气!我重载运算符的时候把'<'重载成'>'了,然后调了一晚上...最近效率太太太低了我都想扇自己耳巴子了...
upd:18/11/03
总算A了?但是有个事儿我真的没懂...这样的,就是我想剪一波枝?然后我就想着鸭,如果我一个城市读入了很多次其实我是不用重复算的对趴,然后如果一个城市的爹的祖宗已经读入了我也不用重复算了它的爹了直接返回ff[i]就成了对趴?
哇我觉得这个思路真实好到爆炸了?然后我就成功90了?然后我删了那个剪枝就A了?
什么鬼啊你家祖宗还带变的嘛???什么玩意儿啊...实力哭爆了...我我我我调了半小时就因为这玩意儿?
哦我还发现我最近经常调试调很久,,,代码半小时debug三天就是我了:(
再放个辛酸的提交记录 不放了,蓝瘦
所以到底为什么会这样啊???我觉得我这波剪枝不可能错啊???什么鬼嘛QAQ
洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ的更多相关文章
- 洛谷P1084 疫情控制(贪心+倍增)
这个题以前写过一遍,现在再来写,感觉以前感觉特别不好写的细节现在好些多了,还是有进步吧. 这个题的核心思想就是贪心+二分.因为要求最小时间,直接来求问题将会变得十分麻烦,但是如果转换为二分答案来判断可 ...
- 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...
- [NOIP2012] 提高组 洛谷P1084 疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...
- NOIP2012 洛谷P1084 疫情控制
Description: H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情 ...
- 洛谷 P1084 疫情控制 —— 二分+码力
题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...
- 洛谷P1084 疫情控制
题目 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点.因此可以考虑二分时间,然后 ...
- 2018.09.26洛谷P1084 疫情控制(二分+倍增)
传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...
- D 洛谷 P3602 Koishi Loves Segments [贪心 树状数组+堆]
题目描述 Koishi喜欢线段. 她的条线段都能表示成数轴上的某个闭区间.Koishi喜欢在把所有线段都放在数轴上,然后数出某些点被多少线段覆盖了. Flandre看她和线段玩得很起开心,就抛给她一个 ...
- 洛谷P2839 [国家集训队]middle 主席树_二分
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
随机推荐
- WAF Bypass数据库特性(Mysql探索篇)
0x01 背景 Mysql数据库特性探索,探索能够绕过WAF的数据库特性. 0x02 测试 常见有5个位置即: SELECT * FROM admin WHERE username = 1[位置一 ...
- Explaining Delegates in C# - Part 4 (Asynchronous Callback - Way 1)
So far, I have discussed about Callback, Multicast delegates, Events using delegates, and yet anothe ...
- DrawCall 优化 .
unity3D 对于移动平台的支持无可厚非,但是也有时候用Unity3D 开发出来的应用.游戏在移动终端上的运行有着明显的效率问题,比如卡.画质等各种问题.自己在做游戏开发的时候偶有所得.对于主要影响 ...
- N76E003之IAP
修改FLASH数据通常需要很长时间,不像RAM那样可以实时操作.而且擦除.编程或读取FLASH数据需要遵循相当复杂的时序步骤.N76E003提供方便FALSH编程方式,可以帮助用户通过IAP方式,重新 ...
- 【转载】.NET 开发者必备的工具箱
本文作者Spencer是一名专注于ASP.NET和C#的程序员,他列举了平时工作.在家所使用的大部分开发工具,其中大部分工具都是集中于开发,当然也有一些其它用途的,比如图片处理.文件压缩等. 如果你是 ...
- C语言字节对齐问题详解
引言 考虑下面的结构体定义: typedef struct{ char c1; short s; char c2; int i; }T_FOO; 假设这个结构体的成员在内存中是紧凑排列的,且c1的起始 ...
- 【Laravel5.5】 Laravel 在views中加载公共页面怎么实现
背景: 在做后台功能时候,我们需要把头部和尾部摘出来作为公共模板使用 1:我们使用了Blade模板,并创建一个header.blade.php作为通用的模板.将子页面作为yield输出: header ...
- 【Python系列】python关键字、符号、数据类型等分类
https://github.com/AndyFlower/Python/blob/master/sample/python前言如下部分为python关键字,操作符号,格式字符.转义字符等,以后有时间 ...
- MFC onchar()
为什么在CView类中可以对ON_CHAR进行相应,添加消息处理函数onchar就可以了,但是在CDialog中要对ON_CHAR相应,直接添加不行? CView相当于Text控件,你可以在Text控 ...
- sencha touch 2.2.1 自定义彩色图标按钮(button+ico)
sencha touch 2.2.1 这个版本使用了新的按钮模式,不过他只提供了少部分的按钮样式.我们可以加一些自定义的ico样式 新加ico样式lower .x-button .x-button-i ...