日期:

八月七号

 总分:

300分

 难度:

提高 ~ 省选  

 得分:

112分(OvO)

题目目录:

  T1:幸福的道路

  T2:Solitaire

  T3:Flags

赛后心得:

第一题裸树d啊!竟然花了一个多小时才切掉……

第二题输出样例成功骗到12分。

题解:

T1:幸福的道路

树形dp,先两次dfs算出每个点的最长路,用两个单调队列维护每天的极差……做完了……

CODE:

 #include<iostream>
#include<queue>
#include<cstdio>
#include<cmath>
using namespace std; int n,m,x,tot=,h[];
long long y,f[],g[],a[];
struct Edge{
int x,next;
long long dis;
}e[];
int q1[],q2[]; inline void add_edge(int x,int y,long long z){
e[++tot].x=y,e[tot].dis=z;
e[tot].next=h[x],h[x]=tot;
} void dfs1(int x,int fa){
for(int i=h[x];i;i=e[i].next){
if(e[i].x==fa)continue;
dfs1(e[i].x,x);
f[x]=max(f[x],f[e[i].x]+e[i].dis);
}
} void dfs2(int x,int fa){
long long maxn=,sec=;
for(int i=h[x];i;i=e[i].next){
if(e[i].x==fa)continue;
if(f[e[i].x]+e[i].dis>maxn)
sec=maxn,maxn=f[e[i].x]+e[i].dis;
else sec=max(sec,f[e[i].x]+e[i].dis);
g[e[i].x]=g[x]+e[i].dis;
}
for(int i=h[x];i;i=e[i].next){
if(e[i].x==fa)continue;
if(f[e[i].x]+e[i].dis==maxn)
g[e[i].x]=max(g[e[i].x],sec+e[i].dis);
else g[e[i].x]=max(g[e[i].x],maxn+e[i].dis);
dfs2(e[i].x,x);
}
} int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d%lld",&x,&y);
add_edge(i,x,y);
add_edge(x,i,y);
}
dfs1(,-),dfs2(,-);
for(int i=;i<=n;i++)a[i]=max(f[i],g[i]);
int l1=,l2=,r1=,r2=,tmp=,ans=;;
for(int i=;i<=n;i++){
while(l1<=r1&&a[i]<=a[q1[r1]])r1--;
while(l2<=r2&&a[i]>=a[q2[r2]])r2--;
q1[++r1]=i,q2[++r2]=i;
if(a[q2[l2]]-a[q1[l1]]>m){
if(q2[l2]<=q1[l1])tmp=q2[l2],l2++;
else tmp=q1[l1],l1++;
}
ans=max(ans,i-tmp);
}
printf("%d",ans);
}

T2:Solitaire

题解戳这里

CODE:

 #include<iostream>
#include<cstdio>
using namespace std; #define mod 1000000007
int n,k,ans,f[][],sum[]; int main(){
scanf("%d%d",&n,&k);
f[][n+]=;
for(int i=;i<=k;i++)
for(int j=n+;j>=;j--){
sum[j]=(sum[j+]+f[i-][j])%mod;
f[i][j]=(j<=n-i+?sum[j]:);
}
ans=(f[k][]-f[k-][]+mod)%mod;
for(int i=;i<=n-k-;i++)ans=(ans+ans)%mod;
printf("%d",ans);
}

T3:Flags

2-sat 问题

题解戳这里

CODE:

 #include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
using namespace std; int v[];
int n,x,y,tot=,h[];
int scc[],dfn[],low[],C,cnt;
bool vis[];
struct Edge{
int x,next;
}e[];
pair<int,int> a[];
stack<int> s; inline void add_edge(int x,int y){
e[++tot].x=y;
e[tot].next=h[x],h[x]=tot;
} void tarjan(int x){
dfn[x]=low[x]=++cnt;
s.push(x),vis[x]=true;
for(int i=h[x];~i;i=e[i].next){
if(!dfn[e[i].x]){
tarjan(e[i].x),low[x]=min(low[x],low[e[i].x]);
}else if(vis[e[i].x]){
low[x]=min(low[x],dfn[e[i].x]);
}
}
if(dfn[x]==low[x]){
C++;
int tmp;
for(;;){
tmp=s.top();
vis[tmp]=false,scc[tmp]=C;
s.pop();
if(tmp==x)break;
}
}
} void build(int o,int l,int r){
if(r-l==){
add_edge(o+n*,a[l].second^);
return;
}
add_edge(o+n*,(o<<)+n*);
add_edge(o+n*,(o<<|)+n*);
int mid=l+r>>;
build(o<<,l,mid),build(o<<|,mid,r);
} void link(int o,int l,int r,int x,int y,int a){
if(l>=x&&r<=y){
add_edge(a,o+n*);
return;
}
int mid=l+r>>;
if(x<mid)link(o<<,l,mid,x,y,a);
if(y>mid)link(o<<|,mid,r,x,y,a);
} inline pair<int,int> get(int x,int len){
int l=,r=x;
pair<int,int> ans;
while(l<r){
int mid=l+r>>;
if(a[x].first-a[mid].first<len)r=mid;
else l=mid+;
}
ans.first=l;
l=x,r=n*-;
while(l<r){
int mid=l+r+>>;
if(a[mid].first-a[x].first<len)l=mid;
else r=mid-;
}
ans.second=l;
return ans;
} inline bool check(int d){
memset(scc,,sizeof(scc));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(h,-,sizeof(h)),tot=;
build(,,n*);
for(int i=;i<n*;i++){
int id=a[i].second;
pair<int,int> x=get(i,d);
if(i<x.second)link(,,n*,i+,x.second+,id);
if(x.first<i)link(,,n*,x.first,i,id);
}
C=cnt=;
for(int i=;i<n*;i++)if(!dfn[i])tarjan(i);
for(int i=;i<n*;i++)
if(scc[a[i].second]==scc[a[i].second^])return false;
return true;
} int main(){
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d%d",&x,&y);
a[*i+]=make_pair(x,*i+);
a[*i]=make_pair(y,*i);
}
sort(a,a+n*);
int l=,r=;
while(l<r){
int mid=l+r+>>;
if(check(mid))l=mid;
else r=mid-;
}
printf("%d",l);
}

2018.8.8 Noip2018模拟测试赛(二十一)的更多相关文章

  1. 2018.8.7 Noip2018模拟测试赛(二十)

    日期: 八月七号  总分: 300分  难度: 提高 ~ 省选    得分: 100分(呵呵一笑) 题目列表: T1:SS T2:Tree Game T3:二元运算 赛后反思: Emmmmmm…… 开 ...

  2. 2018.7.31 Noip2018模拟测试赛(十六)

     日期: 七月最后一天  总分: 300分  难度: 提高 ~ 省选  得分: 30分(少的可怜) 我太弱了:(题目目录) T1:Mushroom追妹纸 T2:抵制克苏恩 T3:美味 失分分析:(QA ...

  3. 2018.8.6 Noip2018模拟测试赛(十九)

    日期: 八月六号  总分: 300分  难度: 提高 ~ 省选    得分: 10分(MMP) 题目目录: T1:Tree T2:异或运算 T3:Tree Restoring 赛后反思: Emmmmm ...

  4. 2017.8.2 Noip2018模拟测试赛(十八)

     日期: 八月二日  总分: 300分  难度: 提高 ~ 省选  得分: 40分(又炸蛋了!!) 题目列表: T1:分手是祝愿 T2:残缺的字符串 T3:树点涂色 赛后心得: 哎,T1求期望,放弃. ...

  5. 2017.8.1 Noip2018模拟测试赛(十七)

    日期: 八月第一天  总分: 300分  难度: 提高 ~ 省选    得分: 100分(不应该啊!) 题目目录: T1:战争调度 T2:选数 T3:由乃的OJ 赛后心得: MMP,首先第一题花了大概 ...

  6. [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania

    [2018冬令营模拟测试赛(二十一)]Problem A: Decalcomania 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见&quo ...

  7. noi2019模拟测试赛(四十七)

    noi2019模拟测试赛(四十七) T1与运算(and) 题意: ​ 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...

  8. EZ 2018 05 04 NOIP2018 模拟赛(十二)

    这次的试卷应该是激励我们一下的,链接 然后大家的分数就都很高,然后我就210被一群秒A T2的240大佬爆踩 掉了5rating但Rank竟然发杀了 X_o_r dalao && YZ ...

  9. EZ 2018 06 24 NOIP2018 模拟赛(二十)

    很久之前写的一套题了,由于今天的时间太多了,所以记起来就写掉算了. 这一场尽管T2写炸了,但也莫名Rank4涨了Rating.不过还是自己太菜. A. 环游世界 首先我们先排个序,想一下如果不用走回来 ...

随机推荐

  1. C++类和结构体的区别

    C++类和结构体的区别? 结构体默认数据访问控制是public; 类默认数据访问控制是private;

  2. oracle中print_table存储过程实例介绍

    oracle中pro_print_table存储过程实例介绍 存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.这 ...

  3. 【Python学习之七】递归——汉诺塔问题的算法理解

    汉诺塔问题 汉诺塔的移动可以用递归函数非常简单地实现.请编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的 ...

  4. MyBatis的增删改查操作

    搭建好mybatis之后 进行对数据库的操作 添加语句 在映射文件中添加语句 insert into student(name,age,score) values(#{name},#{age},#{s ...

  5. python-类与继承

    类的继承 什么是继承? 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类.python中,父类.子类(派生类)只有在继承的时候才会产生. 继承的特性:子类会继承父类所有的属性. 为什么要用 ...

  6. matplotlib学习记录 五

    # 绘制电影票房竖条形图 from matplotlib import pyplot as plt a = ["战狼2","速度与激情8","功夫瑜伽 ...

  7. Java-basic-2-

    接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类. 如果一个类定义在某个包中,那么package语句应该在源文件的首行. 如果源文件包含import语句,那么应该放在package语句和 ...

  8. STM32HAL学习博客

    https://www.cnblogs.com/wt88/category/1297945.html

  9. Artwork Gym - 101550A 离线并查集

    题目:题目链接 思路:每个空白区域当作一个并查集,因为正着使用并查集分割的话dfs会爆栈,判断过于复杂也会导致超时,我们采用离线反向操作,先全部涂好,然后把黑格子逐步涂白,我们把每个空白区域当作一个并 ...

  10. Kubernetes(k8s)底层网络原理刨析

    目录 1 典型的数据传输流程图 2 3种ip说明 3 Docker0网桥和flannel网络方案 4 Service和DNS 4.1 service 4.2 DNS 5 外部访问集群 5.1 外部访问 ...