不贴代码的原因是我的代码在初中机房。忘记带过来了。

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题解的更多相关文章

  1. A · F · O —— JLOI2018翻车记(附Day1简要题解)

    JLOI2018翻车记 并不知道该怎么写... 算了还是按照标准剧情来吧 这应该是一篇写得非常差的流水账... 2018.04.04 Day -1 省选前在机房的最后一天. 压力并不是很大,毕竟联赛 ...

  2. NOIP2012 疫情控制 题解(LuoguP1084)

    NOIP2012 疫情控制 题解(LuoguP1084) 不难发现,如果一个点向上移动一定能控制更多的点,所以可以二分时间,判断是否可行. 但根节点不能不能控制,存在以当前时间可以走到根节点的点,可使 ...

  3. 「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 括号树 ...

  4. NOIp2018集训test-10-6/test-10-7 (联考五day1/day2)

    昨天考完月考,明天初赛,dcoi2017级今天终于开始停课准备noip了,大概没有比本弱校停课更晚的学校了吧.本来就够菜了,怕是要凉透哦. DAY1 T1石头剪刀布 据说爆搜随便做,但是我觉得我的O( ...

  5. NOIp2018集训test-9-22(am/pm) (联考三day1/day2)

    szzq学长出的题,先orz一下. day1 倾斜的线 做过差不多的题,写在我自己的博客里,我却忘得一干二净,反而李巨记得清清楚楚我写了的. 题目就是要最小化这个东西 $|\frac{y_i-y_j} ...

  6. NOIp2016 Day1&Day2 解题报告

    Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...

  7. noip2011提高组day1+day2解题报告

    Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...

  8. NOIP2013 DAY2题解

    DAY2 T1积木大赛 传送门 题目大意:每次可以选区间[l,r]加1,最少选几次,让每个位置有 它应有的高度. 题解:O(n)扫一遍就好了.后一个比前一个的高度低,那么前一个已经把它覆盖了, 如果高 ...

  9. 模拟测试20191017~18 lrd Day1& Day2

    $Day1:$ $T1:位运算$ 从低位到高位分类讨论就好了 记得判$inf$ $T2:集合论$ 考场上差点就打线段树了 用一个数组维护,同时用一个变量代表当前总体$+$&&$-$的值 ...

随机推荐

  1. 读书笔记—CLR via C#委托和attribute

    前言 这本书这几年零零散散读过两三遍了,作为经典书籍,应该重复读反复读,既然我现在开始写博了,我也准备把以前觉得经典的好书重读细读一遍,并且将笔记整理到博客中,好记性不如烂笔头,同时也在写的过程中也可 ...

  2. 松瀚SN8P2501 定时器初始化程序--汇编源码

    /* 松瀚 SN8P2501B 定时器初始化程序 */ INI_IRQ: ;定时器T0初始化 MOV A, #01100000b ;定时器模式Fcpu/4 16M/4/4=1M 1U计一次 B0MOV ...

  3. mac下Android apk 破解流程

    相关工具下载:http://pan.baidu.com/s/1kTkOicn 首先你要有eclipse工具,在sdk目录下有如下工具可以使用 android:adb shell:进入交互shell  ...

  4. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 一

    本人系新接触MongoDB不久,属于MongoDB的菜鸟范畴.在使用MongoDB的过程中,总结了一些认识,在此总结跟大家分享.欢迎拍砖. 关于MongoDB的内容,在此就不做介绍了,网上有浩如烟海的 ...

  5. C/C++基础知识总结——多态性

    1. 多态性的概述 1.1 多态是指同样的消息被不同类型的对象接收时导致不同的行为.所谓消息是指对垒的成员函数的调用,不同行为是指不同的实现. 1.2 多态的实现 (1) 实现角度讲多态可分为两类:编 ...

  6. storm源码之storm代码结构【译】

    storm源码之storm代码结构[译] 说明:本文翻译自Storm在GitHub上的官方Wiki中提供的Storm代码结构描述一节Structure of the codebase,希望对正在基于S ...

  7. NotePad++安装和配置C/C++开发插件

    NotePad++ - 安装和配置C/C++开发插件 | NotePad++ - Install and Configure plugins for develop C/C++ http://aofe ...

  8. NuGet的本地服务器安装与Package的发布

    NuGet的本地服务器安装与Package的发布 主要的步骤是按照下面的例子来做的: NuGet学习笔记(1)——初识NuGet及快速安装使用 NuGet学习笔记(2)——使用图形化界面打包自己的类库 ...

  9. cocos2d-x 通过socket实现http下载及断点续传的实现

    cocos2d-x 通过socket实现http下载及断点续传的实现 代码未经进一步的整理,可能比较混乱. 首先,2dx的socket库由BSSocket组成.可跨平台,在windows上已验证. 1 ...

  10. 导出&导入

    导出&导入 上一文中,我们大致明白了,利用MEF框架实现自动扫描并组装扩展组件的思路.本文我们继续前进,从最初的定义公共接口开始,一步步学会如何使用MEF. 在上一文中我们知道,对于每一个实现 ...