[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 ...
随机推荐
- 时序数据库InfluxDB的基本语法
一 了解InfluxDB的必要性 时序数据库主要存放的数据 Time series data is a series of data points each associated with a spe ...
- 基于linux在线预览
1.Libreoffice安装 在服务器上安装Libreoffice,在这里就不多说了, import os import sys import subprocess import re def co ...
- Miller Rabin 详解 && 小清新数学题题解
在做这道题之前,我们首先来尝试签到题. 签到题 我们定义一个函数:\(qiandao(x)\) 为小于等于 x 的数中与 x 不互质的数的个数.要求 \(\sum\limits _{i=l}^r qi ...
- SpringBoot-集成SpringSecurity
在 Web 开发中,安全一直是非常重要的一个方面. 安全虽然属于应用的非功能性需求,但是从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中. Spring Security官网 ...
- 数据库已经存在表, django使用inspectdb反向生成model实体类
1.通过inspectdb处理类,可以将现有数据库里的一个或者多个.全部数据库表生成Django model实体类 python manage.py inspectdb --database defa ...
- change or reset WSL password
change or reset WSL password To change or reset your password, open the Linux distribution and enter ...
- css3鼠标悬停图片边框线条动画特效
css3鼠标经过内容区时,边框线条特效效果制作. html: <div class="strength grWidth hidden"> <div class ...
- Android系统编程入门系列之应用权限的定义与申请
在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类, ...
- 深入理解Java虚拟机之类加载机制篇
概述 虚拟机把描述类的数据从 Class 文件加载到内存中,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,就是虚拟机的类加载机制. 在Java语言里面,类型的 ...
- RBAC 权限管理模型
一.RBAC模型--基于角色的访问控制 什么是RBAC RBAC(Role-Based Access Control)基于角色的访问控制.这是从传统的权限模型的基础之上,改进而来并且相当成熟的权限模型 ...