题面

有点意思的题

从一个位置$i$出发可以到达每一个位置即是从$1,n$出发可以到达$i$。然后有了一个做法:把图上下反转后建反图,这样就可以求从一个点$i$到达左右两侧的花费$dp[i][0/1]$了,这个花费就是当前总长度-到这个点为止的LIS长度(左右各求一遍)。因为还要考虑边的这个问题,可以用一个权值树状数组维护前/后缀最大值来实现。可以发现合法点的左侧都能到达左端,右侧都能到达右端,所以其实我们找的是一段区间,即找一段区间$(l,r)$使得$dp[l][1]+dp[r][0]<=k$,发现$dp$数组两维都是单调的,直接双指针即可。

 #include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
struct a{int h,v;}; vector<a> m1[N],m2[N];
int n,m,d,k,t1,t2,typ,len,ans,p1,p2;
int tr[N],dp[N][];
void maxx(int pos,int num)
{
while(pos<=m)
tr[pos]=max(tr[pos],num),pos+=pos&-pos;
}
int query(int pos)
{
int ret=;
while(pos)
ret=max(ret,tr[pos]),pos-=pos&-pos;
return ret;
}
int main ()
{
scanf("%d%d%d%d",&n,&m,&d,&k),m++;
for(int i=;i<=d;i++)
{
scanf("%d%d%d",&t1,&t2,&typ);
if(typ) m1[t1+].push_back((a){m-t2,});
else m2[t1].push_back((a){m-t2,});
}
for(int i=;i<=n;i++)
{
int siz=m1[i].size();
for(int j=;j<siz;j++)
{
m1[i][j].v=query(m1[i][j].h)+;
len=max(len,m1[i][j].v);
}
dp[i][]=i-len-;
for(int j=;j<siz;j++)
maxx(m1[i][j].h,m1[i][j].v);
}
len=,memset(tr,,sizeof tr);
for(int i=n;i;i--)
{
int siz=m2[i].size();
for(int j=;j<siz;j++)
{
m2[i][j].v=query(m2[i][j].h)+;
len=max(len,m2[i][j].v);
}
dp[i][]=n-len-i;
for(int j=;j<siz;j++)
maxx(m2[i][j].h,m2[i][j].v);
}
len=,p1=p2=;
while(p1<=n)
{
while(p2<=n&&dp[p1][]+dp[p2][]<=k) p2++;
ans=max(ans,p2-p1); if(!dp[p1][]&&!dp[p1][]) len++; p1++;
}
printf("%d",ans-len);
return ;
}

解题:POI 2007 Driving Exam的更多相关文章

  1. 解题:POI 2007 Tourist Attractions

    题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...

  2. 解题:POI 2007 Weights

    题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...

  3. [POI 2007]ZAP-Queries

    Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...

  4. 解题:SCOI 2007 蜥蜴

    题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...

  5. [POI 2007] 办公楼

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1098 [算法] 显然 , 答案为补图的连通分量个数 用链表优化BFS , 时间复杂度 ...

  6. [POI 2007] Zap

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1101 [算法] 首先 , 问题可以转化为求GCD(x,y) = 1,x <= ...

  7. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...

  8. [POI 2007] 堆积木

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1109 [算法] DP [代码] #include<bits/stdc++.h& ...

  9. 【POI 2007】 山峰和山谷

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...

随机推荐

  1. ELK环境搭建

    ELK环境搭建 1. Virtualbox/Vagrant安装 41.1. Virtualbox安装 41.2. Vagrant安装 41.2.1. 简述 41.2.2. Vagrant box 41 ...

  2. PyCharm配置SFTP远程调试Django应用

    http://www.ithao123.cn/content-41747.html http://www.th7.cn/system/lin/201703/205998.shtml

  3. map的运用

    一.map是一种关联容器,支持高效的查找和访问 map中的元素是一些关键字-值(key-value)对: 关键字起索引作用: 值表示与索引相关联的数据. 关联容器中元素是根据关键字存储的,故其不支持位 ...

  4. 在js中保存数据

    localStorage: localStorage.setItem("key", "value"); localStorage.getItem("k ...

  5. Daily Scrum (2015/11/5)

    这天晚上我们对爬虫进行了一些测试,发现仍然存在一些不小的BUG.现在我们的爬虫已经能完成基本的功能,焉域政同学也正在把他之前写的分类功能继续完善.在BUG的测试中,我们发现如果要求爬虫爬取特定的文件类 ...

  6. java第三次实验报告

    北京电子科技学院(BESTI) 实验报告 课程: Java程序设计 班级: 1352 姓名: 池彬宁 学号: 20135212 成绩: 指导教师: 娄嘉鹏 实验日期: 2015.6.3 实验密级: 无 ...

  7. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-准备阶段 在一个人孤身奋斗了将近半个学期以后,终于迎来的我们的第一次团队协作共同编码,也就是,我们的第一个结对编程练 ...

  8. Sprint9

    进展:完善设置事件提醒界面,增加调用手机铃声部分,以及是否选择振动,以及可以添加事件进行保存.

  9. git 的认识

    简单说,三个概念:远程仓库.本地仓库.本地工作目录.clone是从远程仓库上down下本地仓库+工作目录:本地仓库就是工作目录里.git这个目录commit是把工作目录的修改提交给本地仓库pull把远 ...

  10. C#编程概述

    一个简单的c#程序 标识符 标识符是一种字符串,用来命名变量.方法.参数和许多后面将要阐述的其他程序结构. 关键字 所有C#关键字都由小写字母组成,但是.NET类型名使用Pascal大小写约定. Ma ...