BZOJ3807 : Neerc2011 Lanes
左右与右左是两个独立的问题
设f[i]表示i时刻左右车道减少一条的答案
g[i]表示i时刻右左车道增加一条的答案
ans=min(f[i]+g[i+r])
计算f[i]:
首先暴力计算出f[m+1],同时记录下每个时刻刚开走的车的数量now[i]
从m到1计算f[i],如果该时刻开走的车数不足n1+1,则无影响
否则多了一辆车,选取后面最早的有空位的时刻j开走
用一个栈维护空位,复杂度为$O(m)$
计算g[i]:
首先暴力计算出g[0],同时记录下每个时刻刚开走的车的数量now[i]
从1到m+r计算g[i],如果该时刻开走的车数不足n2+1,则无影响
否则多了一辆车,选取后面最早的有空位的时刻j开走
因为j是单调变化的,所以复杂度为$O(m)$
#include<cstdio>
#define N 200010
typedef long long ll;
struct P{int t,k;P(){}P(int _t,int _k){t=_t,k=_k;}}q[N];
int n1,n2,m,r,i,a[N],b[N],now[N],rem,t,mx,fin;ll ans,f[N],g[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int min(int a,int b){return a<b?a:b;}
int main(){
for(read(n1),read(n2),read(m),read(r),i=1;i<=m;i++)read(a[i]),read(b[i]);
for(rem=ans=0,i=1;i<=m;i++)rem+=a[i],t=min(rem,n1+1),now[i]=t,rem-=t,ans+=rem;
mx=m+rem/n1+1,fin=rem%n1;
if(fin)ans+=(ll)(fin+rem-n1)*(rem/n1)/2;else ans+=(ll)rem*(rem/n1-1)/2;
for(q[t=1]=P(mx,fin),i=m;i;i--){
if(now[i]>n1){
while(t&&q[t].k==n1)t--;
if(!t)q[t=1]=P(++mx,0);
q[t].k++,ans+=q[t].t-i;
}else q[++t]=P(i,now[i]);
f[i]=ans;
}
for(rem=ans=0,i=1;i<=m+r;i++)rem+=b[i],t=min(rem,n2+1),now[i]=t,rem-=t,ans+=rem;
mx=m+r+rem/(n2+1)+1,fin=rem%(n2+1);
if(fin)ans+=(ll)(fin+rem-n2-1)*(rem/(n2+1))/2;else ans+=(ll)rem*(rem/(n2+1)-1)/2;
for(i=t=1;i<=m+r;i++){
g[i]=ans;
if(now[i]>n2){
while(t<=m+r&&(t<i||now[t]>n2))t++;
if(t<=m+r)now[t]++,ans+=t-i;else{
if(fin>n2)mx++,fin=0;
fin++,ans+=mx-i;
}
}
}
for(ans=1LL<<62,i=1;i<=m;i++)if(f[i]+g[i+r]<ans)t=i,ans=f[i]+g[i+r];
return printf("%d",t),0;
}
BZOJ3807 : Neerc2011 Lanes的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 2632: [neerc2011]Gcd guessing game
2632: [neerc2011]Gcd guessing game Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 144 Solved: 84[S ...
- POJ 3895 Cycles of Lanes (dfs)
Description Each of the M lanes of the Park of Polytechnic University of Bucharest connects two of t ...
- BZOJ2646 : neerc2011 flight
答案由$3$部分构成: $1$.抛物线的极值. $2$.询问区间的左端点在抛物线上的值. $3$.询问区间的右端点在抛物线上的值. 对于$1$,就是某个矩形范围内最大值查询,使用KD-Tree可以在$ ...
- BZOJ3806: Neerc2011 Dictionary Size
题解: 这题搞得我真是酸(dan)爽(teng) 原来一直不会,一定会用到什么神奇的东西.因为重复的不知道如何计算. 今天中午睡起来忽然想到好像可以在正trie上故意走无出边,因为这样就保证了这次统计 ...
- POJ 3377 Ferry Lanes
虽然它出现在dp专场里···但是我第一反应是一道最短路题···不过幸好它出现在dp专场里···因为我不怎么会dijstra什么的··· 题意:一条河上有N+1对码头,每个相邻码头之间需要一定时间到达, ...
- poj-3895-Cycles of Lanes 简单DFS
题目链接: http://poj.org/problem?id=3895 题目意思: 在无向连通图中图中找一个经过边数最多的环. 解题思路: 从任意一点直接DFS,不用回溯,注意构成环的话至少有3条边 ...
- BZOJ2647 : [Neerc2011]Journey
$|x|+|y|=\max(x+y,x-y,-x+y,-x-y)$,设$f[i][j]$表示在$(0,0)$,朝向方向$j$,执行第$i$条指令后的信息: $cir$:是否陷入循环 $d$:朝向 $x ...
- bzoj4232: [Neerc2011 Northern]Kids Like Cakes
Description 给定一个n个点的严格凸多边形(各个内角<180°),现在要切出两个非退化三角形(三点不共线),要求两个三角形顶点必须是凸多边形的顶点,且三角形不可相交(但是点或边可以重合 ...
随机推荐
- HDOJ并查集题目 HDOJ 1213 HDOJ 1242
Problem Description Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. ...
- c# 继承,多态,new /overrid 区别, 引用父类的方法
好久没碰c#了,偶尔需要制作点小工具.为了一个灵活的架构设计,需要对继承/多态有比较深刻的理解. 不料忘得差不多了,好吧,再来回忆下.直接上代码了,如下: using System; using Sy ...
- js指定标签的id只能添加不能删除
<body> <form id="form1" runat="server"> <div> <input id=&qu ...
- python时间转换
#设a为字符串 import time a = "2011-09-28 10:00:00" #中间过程,一般都需要将字符串转化为时间数组 time.strptime(a,'%Y-% ...
- cocos2dx3.0rc导出自定义类到lua的方法
以前要导出c++类到lua,就得手动维护pkg文件,那简直就是噩梦,3.0以后就会感觉生活很轻松了. 转载请注明出处http://www.cnblogs.com/mrblue/p/3637910.ht ...
- sqlserver的执行计划
一:执行计划生成过程 说到执行计划,首先要知道的是执行计划大概生成的过程,这样就可以做到就心中有数了,下面我画下简图: 1. 分析过程 这三个比较容易理解,首先我们要保证sql的语法不能错误,sele ...
- ubuntu命令行相关命令使用心得
一.Ubuntu解压缩zip,tar,tar.gz,tar.bz2 ZIP zip可能是目前使用得最多的文档压缩格式.它最大的优点就是在不同的操作系统平台,比如Linux, Windows以及Mac ...
- Spring MVC程序中得到静态资源文件css,js,图片
转载自:http://www.blogjava.net/fiele/archive/2014/08/24/417283.html 用 Spring MVC 开发应用程序,对于初学者有一个很头疼的问题, ...
- rsync 不能同不子级目录的问题
/usr/bin/rsync -vr /alidata/www/pro/mobile/* /alidata/www/crontal/mobile #-r, --recursive 对子目录以递归模式处 ...
- ubuntu下打开终端插件
一个 nautilus 插件,用于在任意目录中打开终端 nautilus-open-terminal