解题:POI 2007 Driving Exam
有点意思的题
从一个位置$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的更多相关文章
- 解题:POI 2007 Tourist Attractions
题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...
- 解题:POI 2007 Weights
题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...
- [POI 2007]ZAP-Queries
Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...
- 解题:SCOI 2007 蜥蜴
题面 拆点跑最大流 所有能跑出去的点连向汇点,容量为inf 原点连向所有初始有蜥蜴的点,容量为1 每根柱子拆成两个点“入口”和“出口”,入口向出口连容量为高度的边,出口向别的有高度的柱子的入口连容量为 ...
- [POI 2007] 办公楼
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1098 [算法] 显然 , 答案为补图的连通分量个数 用链表优化BFS , 时间复杂度 ...
- [POI 2007] Zap
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1101 [算法] 首先 , 问题可以转化为求GCD(x,y) = 1,x <= ...
- BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)
手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...
- [POI 2007] 堆积木
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1109 [算法] DP [代码] #include<bits/stdc++.h& ...
- 【POI 2007】 山峰和山谷
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...
随机推荐
- Python函数初识
一.函数是什么 计算机语言中的函数是类比于数学中的函数演变来的,但是又有所不同.前面的知识中我们学会了运用基础语法(列表.字典)和流程控制语句貌似也能处理一些复杂的问题,但是相对于相似的大量重复性 ...
- tar.gz 文件解压 (安装 netbean 时会用到)
sudo tar xvf jdk-7u45-linux-i586.tar.gz -C /usr/lib 参考文章 http://hi.baidu.com/xiaomeng008/item/5e787b ...
- Nginx 配置优化
一.开启Gzip 1.参数 gzip on;gzip_min_length 1k;gzip_buffers 4 16k;gzip_comp_level 2;gzip_types text/plain ...
- Spring Cloud限流思路及解决方案
转自: http://blog.csdn.net/zl1zl2zl3/article/details/78683855 在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Clo ...
- sprint2(第六天)
昨天休息一天,今天继续做任务. 燃尽图:
- mybatis之模糊查询SQL
一,MySQL数据库 name like concat('%' , #{name} , '%') 二,Oracle数据库 name like '%' || #{name} || '%'
- 提不起劲想赶紧完工 Scrum Meeting 博客汇总
提不起劲想赶紧完工 Scrum Meeting 博客汇总 一.Alpha阶段 1,第一次Scrum Meeting 2,第二次Scrum Meeting 3,第三次Scrum Meeting 4,第四 ...
- 寒假学习计划&进度
学习计划 c语言查缺:这方面的查缺,我觉得我不需要花较多时间,因为老师上课讲的也足够详细,自己学的也自认为没有太多疏漏,所以我假期学习的中心放在了c++上面. c++学习:开始我先看了几集师爷的视频, ...
- 在visual studio中查看源代码
地址:https://docs.microsoft.com/zh-cn/visualstudio/ide/go-to-and-peek-definition?view=vs-2017 在 Visual ...
- 很有用的高级 Git 命令
10 个很有用的高级 Git 命令 迄今,我已经使用Git很长一段时间了,考虑分享一些不管你是团队开发还是个人项目,都受用的高级git命令. 1. 输出最后一次提交的改变 这个命令,我经常使用它 来发 ...