[bzoj1107]驾驶考试
考虑如果l和r($l<r$)符合条件,容易证明那么[l,r]的所有点都将会符合条件,因此答案是一个区间
枚举答案区间[l,r],考虑如何判定答案是否合法,也就是要求满足l能到达n且r能到达1,那么预处理出f1[i]表示i能到达1的最少边数,f2[i]表示i能到达n的最少边数,相当于要满足$f1[r]+f2[l]\le k$(注意:这两个不会重复,因为边是有向的)
考虑如何预处理出f1数组(f2数组同理),其实容易发现这就是维护一个每一个位置有多个选择的最长不上升子序列,不妨将每一个位置上的数字从小到大排列,直接求lis即可
最后求答案用单调性维护即可,注意要去掉初始合法的区间长度

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 vector<int>v1[N],v2[N];
5 int n,m,k,x,y,z,ans,a[N],f1[N],f2[N];
6 void add(int k){
7 x=1,y=a[0]+1;
8 while (x<y){
9 z=(x+y>>1);
10 if (a[z]<k)y=z;
11 else x=z+1;
12 }
13 a[0]=max(a[0],x);
14 a[x]=k;
15 }
16 int main(){
17 scanf("%d%*d%d%d",&n,&m,&k);
18 for(int i=1;i<=m;i++){
19 scanf("%d%d%d",&x,&y,&z);
20 if (z)v1[x+1].push_back(y+1);
21 else v2[x].push_back(y+1);
22 }
23 for(int i=1;i<=n;i++){
24 sort(v1[i].begin(),v1[i].end());
25 sort(v2[i].begin(),v2[i].end());
26 }
27 for(int i=2;i<=n;i++){
28 for(int j=0;j<v1[i].size();j++)
29 if ((!j)||(v1[i][j]!=v1[i][j-1]))add(v1[i][j]);
30 f1[i]=i-1-a[0];
31 }
32 memset(a,0,sizeof(a));
33 for(int i=n-1;i;i--){
34 for(int j=0;j<v2[i].size();j++)
35 if ((!j)||(v2[i][j]!=v2[i][j-1]))add(v2[i][j]);
36 f2[i]=n-i-a[0];
37 }
38 for(int i=1,j=1;(i<=n)&&(j<=n);i++){
39 while ((j<=n)&&(f2[i]+f1[j]<=k))j++;
40 ans=max(ans,j-i);
41 }
42 for(int i=1;i<=n;i++)
43 if ((!f1[i])&&(!f2[i]))ans--;
44 printf("%d",ans);
45 }
[bzoj1107]驾驶考试的更多相关文章
- BZOJ1107 : [POI2007]驾驶考试egz
i可以作为起点说明把边反向后可以从1和n到达i. 设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边. 把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i- ...
- [POI2007]驾驶考试egz
题目 BZOJ 神仙题,可比那些氵紫题有意思多了 做法 \(i\)能作为起始点,当\(i\)能到达\(1\)~\(i-1\)和\(i+1\)~\(n\) 这样处理显然会麻烦,因为要从每个点都特判一次 ...
- 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 ...
- http://codeforces.com/contest/845
A. Chess Tourney time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- 手动挡C1驾驶学车@长建驾校
2015-11-01 下午取钱去长建驾校报名学车 4600(学费) + 100(暂住证) + 30(照片) + 10(体检) 2015-11-14 8:00-12:00 理论课2 光盘10 2015 ...
- (转)深入浅出linux系统umask值及其对应的文件权限讲解
浅出linux系统umask值及其对应的文件权限讲解 原文:http://blog.51cto.com/oldboy/1060032 缘起:1.此文的撰写特别为感谢51cto的博客工作人员和领导,老男 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- @Value竟然能玩出这么多花样
前言 对于从事java开发工作的小伙伴来说,spring框架肯定再熟悉不过了.spring给开发者提供了非常丰富的api,满足我们日常的工作需求. 如果想要创建bean实例,可以使用@Controll ...
- OGG-如何只同步最近某个时间范围的数据
一.需求,某客户希望使用OGG只同步时间大于2021-02-01日期之后的数据变换 需求如标题所示,如何使用OGG进行配置? 客户环境需要同步的表有几百G,表数据太大了;如果同步所有数据,目标库空间存 ...
- 【Python123】练习1: Python基本语法元素 (第1周)
实例1: 温度转换 这是"实例"题,与课上讲解实例相同,请作答检验学习效果. ...
- C++ 与 Visual Studio 2019 和 WSL(二)
终端 A more integrated terminal experience | Visual Studio Blog (microsoft.com) Say hello to the new V ...
- jmeter基础功能及认识
1.基础知识: JMeter是免费开源的,纯java开发的性能测试工具,可以测试静态和动态的资源,例如:静态文件.java服务小程序.CGI脚本.java对象.数据库.FTP服务器.邮件服务器和Per ...
- 395.至少有 K 个重复字符的最长子串
题目 给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于k .返回这一子串的长度. 示例 1: 输入:s = "aaabb" ...
- [Beta]the Agiles Scrum Meeting 10
会议时间:2020.5.25 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 暂无 tq 暂无 wjx 实现创建.显示博客作业功能 增加博客作业功能 dzx 实 ...
- 2020BUAA软工个人项目作业
2020BUAA软工个人项目作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人项目作业 我在这个课程的目标是 学 ...
- Spring Cloud Gateway 网关限流
Spring Cloud Gateway 限流 一.背景 二.实现功能 三.网关层限流 1.使用默认的redis来限流 1.引入jar包 2.编写配置文件 3.网关正常响应 4.网关限流响应 2.自定 ...
- flyway的使用
1.使用它之前先要了解一些概念: 版本:对数据库的每一次变更可称为一个版本. 迁移:Flyway把数据库结构从一个版本更新到另一个版本叫做迁移. 可用的迁移:Flyway的文件系统识别出来的迁移版本. ...