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

用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. jdk完全卸载(亲测jdk1.7.0_80在win7)

    1.从控制面板里删除java程序 2.删除注册表:HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\ 3.删除C:\Windows\System32 和 C:\Windows\ ...

  2. dubbo服务器启动后报错端口被占用

    环境:maven工程,ssm框架,tomcat 情景:dubbo的服务注册方服务器启动 问题原因: 经过网络查找,结果是Root WebApplicationContext 启动了两次,第二次报错,d ...

  3. delphi 10.2 ----简单的递归函数例子求和

    unit Unit10; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Syste ...

  4. 如何使用robots禁止各大搜索引擎爬虫爬取网站

    ps:由于公司网站配置的测试环境被百度爬虫抓取,干扰了线上正常环境的使用,刚好看到每次搜索淘宝时,都会有一句由于robots.txt文件存在限制指令无法提供内容描述,于是便去学习了一波 1.原来一般来 ...

  5. 队列的理解和实现(一) ----- 循环队列(java实现)

    什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...

  6. openproject安装与使用

    思路: 1.生成config配置文件 2.导出配置文件,修改配置文件,删除容器,重新部署容器 3.登录后配置, 4.配置git,可以从openproject里查看gitlab上的代码库 第一次安装: ...

  7. eclipse如何设置UTF-8

    一.Eclipse设置utf-8编码包括两个方面,一方面可以设置workspace工作间编码,另一方面可以设置Android Project项目编码,设置步骤: 1)设置workspace工作间编码: ...

  8. Java操作数据库实现"增删改查"

    本文主要讲解JDBC操作数据库    主要实现对MySql数据库的"增删改查" 综合概述: JDBC的常用类和接口 一   DriverManager类 DriverManage类 ...

  9. /usr/bin/ld: cannot find -lperconaserverclient_r 解决

    编译sqladvisor安装遇到: [root@localhost sqladvisor]# cd SQLAdvisor/sqladvisor/ [root@localhost sqladvisor] ...

  10. 分段锁——ConcurrentHashMap

    1.线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 2.效率低下的HashTable容 ...