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

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;
}

最新文章

  1. myeclipse竖行删除
  2. 关于阿里 阿里巴巴共享业务事业部UED团队 出品的sui基于zepto的开源UI框架的使用心得
  3. Markdown syntax guide and writing on MWeb
  4. Git使用命令
  5. 【JAVA线程间通信技术】
  6. Java 参数传递都是值传递
  7. What is the difference between DAO and DAL?
  8. Autolayout环境设置任意个数相等间距排列的按钮的方法
  9. 【JAVA版】Storm程序整合Kafka、Mongodb示例及部署
  10. discuz X2.5自己写代码,获取当前登录的用户信息
  11. ABAP ALV DEMO示例源码
  12. javascriipt类型转换
  13. google反向代理网址收集
  14. JDOM生成、解析XML实例
  15. 《k8s-1.13版本源码分析》上github
  16. vim 插件 -- taglist
  17. vue 跨域问题
  18. 编写第一个 Shell 脚本
  19. opencv学习之路(7)、访问图像像素
  20. weblogic配置集群(一)

热门文章

  1. Linux 安装配置maven3.0 以及搭建nexus私服
  2. shell脚本中执行另一个shell脚本
  3. {{angular.js 使用技巧}} - 实现计算列属性
  4. SpringMVC视图
  5. Asp.Net异步编程
  6. 凝结时光:ImageMagick 制作 gif
  7. [置顶] 在js中如何实现方法重载?以及函数的参数问题
  8. 基于python的《Hadoop权威指南》一书中气象数据下载和map reduce化数据处理及其可视化
  9. WCF 自承载
  10. [google面试CTCI] 2-3 只给定链表中间节点指针,如何删除中间节点?