【NOIP2012】DAY1+DAY2题解
不贴代码的原因是我的代码在初中机房。忘记带过来了。
DAY 1 T1随便搞,但是字符串相关的题我经常犯蠢
T2 一个结论题,OAO但是需要高精度写。
具体就是按左手的数除右手的数(还是怎么的来着)排个序
算过去就行了。证明的话QAQ不会,但是曾经想通过
T3 开车旅行 是个倍增 没写【不会】
OAO我好咸啊
DAY2 T1 用拓展欧几里得解,我数学不好直接背板子了。抱歉不能给出详细的讲解。
T2 借教室 这题我写过好几次线段树,没过。始终被TLE 正确做法是二分到哪一个请求可以满足,每次通过重新维护前缀和来check答案。有一个小的优化是如果这次可以完成请求那么下次就直接在上次的前缀和直接加。据说能快一点。
T3 疫情控制 昨年和今年写的时候都是痛不欲生,昨年直接搞了一周左右,今年还好,大约3h就写完+调试完了
预处理每支军队到根节点用的时间。二分时间判断能否完成。
说不清楚还是放代码吧。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
struct edge
{
int nw;
int to;
int val;
};
edge line[];
int n=,m=,head[]={},cnt=;
int amy[]={},deep[]={};
int beiz[][]={},value[][]={};
int tim[]={},from[]={};
int xl[]={};
bool mark[]={},cho[]={};
void add(int f,int t,int v);
void ready();//预处理
void to_do(int nw,int t);//对到不了首都的军队进行处理。
bool check(int nw);//check当前子树是否需要守护(大雾
bool ask(int t);//在规定的时间能否完成
void dfs(int nw);
bool kp(int a,int b);
int main(void)
{
freopen("blockade.in","r",stdin);
freopen("blockade.out","w",stdout);
scanf("%d",&n);
int a=,b=,c=,lf=,rt=,mid=,ans=0x7fffffff;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
rt+=c;
add(a,b,c);
add(b,a,c);
}
beiz[][]=;
deep[]=;
dfs();
scanf("%d",&m);
for(int i=;i<=m;i++)scanf("%d",&amy[i]);
ready();
for(int i=;i<=m;i++)xl[i]=i;
sort(xl+,xl+m+,kp);
while(lf<=rt)
{
mid=(lf+rt)/;
if(ask(mid))rt=mid-,ans=min(ans,mid);
else lf=mid+;
}
if(ans==0x7fffffff)printf("-1");
else printf("%d",ans);
return ;
} bool kp(int a,int b)
{
if(tim[amy[a]]>tim[amy[b]])return ;
return ;
} void add(int f,int t,int v)
{
line[++cnt].nw=t;
line[cnt].to=head[f];
line[cnt].val=v;
head[f]=cnt;
return;
} void dfs(int nw)
{
if(nw>n)return;
int next=;
for(int i=head[nw];i>;i=line[i].to)
{
next=line[i].nw;
if(next==beiz[nw][])continue;
beiz[next][]=nw;
deep[next]=deep[nw]+;
value[next][]=line[i].val;
dfs(next);
}
return;
} void ready()
{
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
{beiz[j][i]=beiz[beiz[j][i-]][i-];value[j][i]=value[j][i-]+value[beiz[j][i-]][i-];}
int tot=,x=;
for(int i=;i<=n;i++)
{
x=i,tot=;
if(tim[x]!=)continue;
for(int j=;j>=;j--)
{
if(deep[x]-(<<j)>=deep[])
{
tot+=value[x][j];
x=beiz[x][j];
if(j==)from[i]=x;
}
}
tim[i]=tot;
}
return;
} bool ask(int t)
{
memset(mark,,sizeof(mark));
memset(cho,,sizeof(cho));
int next=,point=m;
for(int i=;i<=m;i++)
{
if(tim[amy[xl[i]]]<=t)
{
point=i;
break;
}
to_do(amy[xl[i]],t);
cho[xl[i]]=true;
}
for(int i=head[];i>;i=line[i].to)
{
next=line[i].nw;
if(check(next))continue;
for(int j=point;j<=m;j++)
{
if(cho[xl[j]])continue;
if(t-tim[amy[xl[j]]]>=line[i].val||from[amy[xl[j]]]==next)
{
mark[next]=true;
cho[xl[j]]=true;
break;
}
}
if(!mark[next])return false;
}
return true;
} void to_do(int nw,int t)
{
int tot=,x=nw;
for(int i=;i>=;i--)
{
if(tot+value[x][i]<=t)
{
tot+=value[x][i];
x=beiz[x][i];
}
}
mark[x]=true;
return;
} bool check(int nw)
{
if(mark[nw])return true;
int next=;
bool as=false;
for(int i=head[nw];i>;i=line[i].to)
{
next=line[i].nw;
if(next==beiz[nw][])continue;
if(!check(next))return false;
else as=true;
}
return as;
}
【NOIP2012】DAY1+DAY2题解的更多相关文章
- A · F · O —— JLOI2018翻车记(附Day1简要题解)
JLOI2018翻车记 并不知道该怎么写... 算了还是按照标准剧情来吧 这应该是一篇写得非常差的流水账... 2018.04.04 Day -1 省选前在机房的最后一天. 压力并不是很大,毕竟联赛 ...
- NOIP2012 疫情控制 题解(LuoguP1084)
NOIP2012 疫情控制 题解(LuoguP1084) 不难发现,如果一个点向上移动一定能控制更多的点,所以可以二分时间,判断是否可行. 但根节点不能不能控制,存在以当前时间可以走到根节点的点,可使 ...
- 「CSP-S」2019年第一届Day1游记+题解
「CSP-S」2019年第一届Day1游记+题解 Day 1 7:30 A.M. 8:10 A.M. 8:30 A.M. T1 格雷码 题目 考场经历+思考(正解) 8:50 A.M. T2 括号树 ...
- NOIp2018集训test-10-6/test-10-7 (联考五day1/day2)
昨天考完月考,明天初赛,dcoi2017级今天终于开始停课准备noip了,大概没有比本弱校停课更晚的学校了吧.本来就够菜了,怕是要凉透哦. DAY1 T1石头剪刀布 据说爆搜随便做,但是我觉得我的O( ...
- NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
- NOIP2013 DAY2题解
DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...
- 模拟测试20191017~18 lrd Day1& Day2
$Day1:$ $T1:位运算$ 从低位到高位分类讨论就好了 记得判$inf$ $T2:集合论$ 考场上差点就打线段树了 用一个数组维护,同时用一个变量代表当前总体$+$&&$-$的值 ...
随机推荐
- Angularjs 与Ckeditor
Angularjs 与Ckeditor Angularjs 诞生于Google是一款优秀的前端JS框架,已经被用于Google的多款产品当中.AngularJS有着诸多特性,最为核心的是:MVC.模块 ...
- 回车tab切换
//event表示事件对象,keyCode表示键值,srcElement事件源 function changeCommand(){ //如果按下的是回车,并且不是提交按钮,不是重置按钮,则回车认为是t ...
- WCF RIA Services异常
.svc处理程序映射缺失导致的WCF RIA Services异常 在确定代码.编译结果和数据库都正常的情况下,无法从数据库取到数据.错误提示:Sysyem.Net.WebException:远程服务 ...
- NHibernate:教你如何搭建数据访问层?
NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ...
- c#通用多线程基类,以队列形式
c#通用多线程基类,以队列形式 个人原创.欢迎转载.转载请注明出处.http://www.cnblogs.com/zetee/p/3487084.html 多线程这个概念大家都很熟悉,对于winfor ...
- poj3006 筛选法求素数模板(数论)
POJ:3006 很显然这是一题有关于素数的题目. 注意数据的范围,爆搜超时无误. 这里要用到筛选法求素数. 筛选法求素数的大概思路是: 如果a这个数是一个质数,则n*a不是质数. 用一个数组实现就是 ...
- Dump Checking
Dump Checking Debug相关的一些小技巧 摘要: 1. 如何Debug一个进程的子进程? 答: 使用WinDBG attach到父进程, 然后输入命令".childdbg 1& ...
- FormsAuthentication知多少
前述:对于FormsAuthentication相信大家都烂熟于胸了,这里只是做一下小结. 一.先看一下使用FormsAuthentication做登录认证的用法 用法一: FormsAuthenti ...
- [google面试CTCI] 1-4.判断两个字符串是否由相同字符组成
[字符串与数组] Q:Write a method to decide if two strings are anagrams or not 题目:写一个算法来判断两个字符串是否为换位字符串.(换位字 ...
- jQuery中的ready方法及实现按需加载css,js
模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...