能到达所有路的充要条件是能到达左右两端的路

用vector反向建边对每条路左右分别求个最长不上升子序列

预处理出每条路向左向右分别需要多建多少路才能到达最左端和最右端

然后跑个\(\Theta(n)\)的尺取法就可以了

本题最长不上升子序列用vector+zkw线段树比二分更加好想?

原来标程的solve函数尺取时出锅(但是居然AC了

感谢我自己回来看题解发现看不懂

现在这题解是真题解了

#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
#include"vector"
using namespace std; const int MAXN=1<<17; int n,m,P,K,np;
int f[2][MAXN];
int tree[MAXN<<1];
struct rpg{bool kd;int h,fl,fr;};
vector<rpg> vec[MAXN]; int read()
{
int x=0;char ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
return x;
} void calcl()
{
for(int i=1;i<n;++i){
for(int j=0;j<vec[i].size();++j){
if(!vec[i][j].kd){
int l=MAXN+vec[i][j].h-1,r=MAXN+m+2,maxn=0;
while(l^r^1){
if(~l&1) maxn=max(maxn,tree[l^1]);
if(r&1) maxn=max(maxn,tree[r^1]);
l>>=1;r>>=1;
}vec[i][j].fl=maxn+1;
}
}for(int j=0;j<vec[i].size();++j){
if(!vec[i][j].kd){
for(int k=MAXN+vec[i][j].h;k;k>>=1){
tree[k]=max(tree[k],vec[i][j].fl);
}
}
}int l=MAXN,r=MAXN+m+2,maxn=0;
while(l^r^1){
if(~l&1) maxn=max(maxn,tree[l^1]);
if(r&1) maxn=max(maxn,tree[r&1]);
l>>=1,r>>=1;
}f[0][i+1]=maxn;
}return;
} void calcr()
{
for(int i=n;i>1;--i){
for(int j=0;j<vec[i].size();++j){
if(vec[i][j].kd){
int l=MAXN+vec[i][j].h-1,r=MAXN+m+2,maxn=0;
while(l^r^1){
if(~l&1) maxn=max(maxn,tree[l^1]);
if(r&1) maxn=max(maxn,tree[r^1]);
l>>=1;r>>=1;
}vec[i][j].fr=maxn+1;
}
}for(int j=0;j<vec[i].size();++j){
if(vec[i][j].kd){
for(int k=MAXN+vec[i][j].h;k;k>>=1){
tree[k]=max(tree[k],vec[i][j].fr);
}
}
}int l=MAXN,r=MAXN+m+2,maxn=0;
while(l^r^1){
if(~l&1) maxn=max(maxn,tree[l^1]);
if(r&1) maxn=max(maxn,tree[r&1]);
l>>=1,r>>=1;
}f[1][i-1]=maxn;
}return;
} void init()
{
n=read(),m=read(),P=read(),K=read();
for(int i=1;i<=P;++i){
int x=read(),y=read(),z=read();
if(z) vec[x].push_back((rpg){z^1,y+1});
else vec[x+1].push_back((rpg){z^1,y+1});
}calcl();memset(tree,0,sizeof(tree));calcr();
for(int i=1;i<=n;++i) f[0][i]=i-f[0][i]-1,f[1][i]=n-i-f[1][i];
return;
} void solve()
{
int ans=0,ct=0,cnt=0;
for(int i=1;i<=n;++i){
while(ct+1<=n&&f[1][i]+f[0][ct+1]<=K){
++ct;
if(!f[0][ct]&&!f[1][ct]) ++cnt;
}ans=max(ans,ct-i+1-cnt);
if(!f[0][i]&&!f[1][i]) --cnt;
}printf("%d\n",ans);
return;
} int main()
{
init();
solve();
return 0;
}

[POI2007]EGZ-Driving Exam的更多相关文章

  1. 解题:POI 2007 Driving Exam

    题面 有点意思的题 从一个位置$i$出发可以到达每一个位置即是从$1,n$出发可以到达$i$.然后有了一个做法:把图上下反转后建反图,这样就可以求从一个点$i$到达左右两侧的花费$dp[i][0/1] ...

  2. BZOJ 1107: [POI2007]驾驶考试egz / Luogu P3463 [POI2007]EGZ-Driving Exam (树状数组 LIS)

    能从iii走到所有跑道 相当于 能从iii走到111和nnn. 边反向后就相当于 能从111和nnn走到iii. 为了方便叙述,把111~nnn叫做x坐标,111~(m+1)(m+1)(m+1)叫做y ...

  3. BZOJ1107 : [POI2007]驾驶考试egz

    i可以作为起点说明把边反向后可以从1和n到达i. 设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边. 把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i- ...

  4. [POI2007]驾驶考试egz

    题目 BZOJ 神仙题,可比那些氵紫题有意思多了 做法 \(i\)能作为起始点,当\(i\)能到达\(1\)~\(i-1\)和\(i+1\)~\(n\) 这样处理显然会麻烦,因为要从每个点都特判一次 ...

  5. HDU 2633 Getting Driving License(模拟)

    Getting Driving License Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  6. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  7. Linux学习之Exam系统发布

    配置时间:2015年11月27日 配置人:撰写人:微冷的雨   Happy 01.Linux安装图 欢迎页面 桌面 02.Linux命令之文件目录操作 给北大青鸟五道口校区创建三个机房(L4,L5,L ...

  8. BZOJ1098: [POI2007]办公楼biu

    从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...

  9. BZOJ1097: [POI2007]旅游景点atr

    ..k次最短路后,考虑如何满足先走一些点 用状压dp,每一个点考虑它所需要经过的点a[i],当当前走过的点包含a[i]时,i 这个点才可以到达. 写的时候用记忆化搜索. #include<bit ...

随机推荐

  1. Servlet入门实践

    本文主要介绍servlet,包括入门到升入,基本上可以对servlet有一个很好的认识: 1servlet介绍:   Servlet(Server Applet),全称Java Servlet,未有中 ...

  2. leetcode-209-长度最小的子数组

    题目描述: 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...

  3. MyBatisSystemException->BindingException: Parameter 'xxx' not found. Available parameters are [arg1, arg0, param1, param2]

    最近在使用Spring boot+mybatis做新的基础框架,结果碰到如下问题: 1 org.mybatis.spring.MyBatisSystemException: nested except ...

  4. elment 中 el-table 进行校验

    脑洞大开:什么是展示数据最好的方式呢,表格,写得又快,又清晰,又明显,那么就积累一些工作中表格经常使用到的东西. 第一步:效果图: 第二步:举个例子: <template> <div ...

  5. #Go# 点滴积累

    此篇仅为不断记录趟过的坑 StringToTimestamp import ( "time" ) const TimeFormat = "2006-01-02T15:04 ...

  6. [转] 两个静态html页面传值方法的总结

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/csdn_ds/article/details/78393564 问题 因最近尝试实现客户端与服务端分 ...

  7. sql server 2008 R2 配置管理工具打不开

    使用 sql server 配置管理工具是报如下错误: 解决方法:   1 找出 sqlmgmproviderxpsp2up.mof 这个文件的位置   2 以管理员身份运行 mofcomp &quo ...

  8. Java程序员的面试经历和题库

    最近打算换城市了,受不了北京的雾霾了,所以准备逃离啦.所以一直在面试中,整理了下最近遇到的一些面试题,供大家参考.其中会包含一些面试的小经验,如果您是面霸,希望能给予指导.自己不是大牛,如果您是大牛, ...

  9. js实现私有变量

    一.块级作用域 js中没有块级作用域的概念,可用匿名函数实现,由于匿名函数执行完一遍后,内部没有引用其变量对象的函数,其变量对象被清除,后面则引用不到其中的变量 (function(){ //块级作用 ...

  10. 《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...