i可以作为起点说明把边反向后可以从1和n到达i。

设fl[i]表示从1到达i至少需要加几条边,fr[i]表示从n到达i至少需要加几条边。

把图上下翻转后,从左往右依次计算fl[i],有fl[i]=i-1-左边LIS的长度,用树状数组维护即可$O(n\log n)$求出。

从右往左计算fr[i]同理。

然后需要求i,j(i<=j),使得fr[i]+fl[j]<=k。

由于fl单调递增,fr单调递减,因此随着i不断右移,j也会不断右移,所以可以$O(n)$求出。

#include<cstdio>
#define N 100010
int n,m,p,k,i,j,x,y,z,bit[N],fl[N],fr[N],pre,ans,cnt;
struct E{int v,f;E*nxt;}*gl[N],*gr[N],pool[N],*cur=pool,*e;
inline void addl(int x,int y){e=cur++;e->v=y;e->nxt=gl[x];gl[x]=e;}
inline void addr(int x,int y){e=cur++;e->v=y;e->nxt=gr[x];gr[x]=e;}
inline void up(int&a,int b){if(a<b)a=b;}
inline void add(int x,int y){for(;x<=m;x+=x&-x)up(bit[x],y);}
inline int ask(int x){int t=0;for(;x;x-=x&-x)up(t,bit[x]);return t;}
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';}
int main(){
read(n),read(m),read(p),read(k);m++;
while(p--){
read(x),read(y),read(z);y=m-y;
z?addl(x+1,y):addr(x,y);
}
for(i=2;i<=n;i++){
for(e=gl[i];e;e=e->nxt)up(pre,e->f=ask(e->v)+1);
for(e=gl[i];e;e=e->nxt)add(e->v,e->f);
fl[i]=i-1-pre;
}
for(pre=0,i=1;i<=m;i++)bit[i]=0;
for(i=n-1;i;i--){
for(e=gr[i];e;e=e->nxt)up(pre,e->f=ask(e->v)+1);
for(e=gr[i];e;e=e->nxt)add(e->v,e->f);
fr[i]=n-i-pre;
}
for(i=j=1;i<=n;i++){
while(j<=n&&fr[i]+fl[j]<=k)j++;
up(ans,j-i);
if(!fl[i]&&!fr[i])cnt++;
}
return printf("%d",ans-cnt),0;
}

  

BZOJ1107 : [POI2007]驾驶考试egz的更多相关文章

  1. [POI2007]驾驶考试egz

    题目 BZOJ 神仙题,可比那些氵紫题有意思多了 做法 \(i\)能作为起始点,当\(i\)能到达\(1\)~\(i-1\)和\(i+1\)~\(n\) 这样处理显然会麻烦,因为要从每个点都特判一次 ...

  2. 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 ...

  3. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  4. [bzoj1107]驾驶考试

    转化题意,如果一个点k符合条件,当且仅当k能到达1和n考虑如果l和r($l<r$)符合条件,容易证明那么[l,r]的所有点都将会符合条件,因此答案是一个区间枚举答案区间[l,r],考虑如何判定答 ...

  5. BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2221  Solved: 1179[Submit][Sta ...

  6. BZOJ1098: [POI2007]办公楼biu

    从问题可以看出是求补图的连通块及点数 但补图太大.所以考虑缩小规模. 当一个点归属于一个连通块后,它以后就不需要了.所以可以用链表,删去这个点,也就减小了规模. 一个点开始bfs,每个点只会进队一次, ...

  7. BZOJ1097: [POI2007]旅游景点atr

    ..k次最短路后,考虑如何满足先走一些点 用状压dp,每一个点考虑它所需要经过的点a[i],当当前走过的点包含a[i]时,i 这个点才可以到达. 写的时候用记忆化搜索. #include<bit ...

  8. BZOJ 1101: [POI2007]Zap

    1101: [POI2007]Zap Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2262  Solved: 895[Submit][Status] ...

  9. BZOJ 1100: [POI2007]对称轴osi

    1100: [POI2007]对称轴osi Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 630  Solved: 243[Submit][Statu ...

随机推荐

  1. unity缓存和浏览器缓存

    原地址:http://www.cnblogs.com/hisiqi/p/3203553.html <蒸汽之城>游戏中,为什么会黑屏?或者无法正常进入游戏? 我们在进行多项测试中发现少数用户 ...

  2. UIScrollview使用

    改变内容偏移 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;  // animate at const ...

  3. ios 百度地图api 入门

    百度地图api 官方教程: http://developer.baidu.com/map/index.php?title=iossdk 这个非常好, 很适合新手 CLLocationCoordinat ...

  4. Tushare的安装

    TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工到数据存储的过程,能够为金融分析人员提供快速.整洁.和多样的便于分析的数据. 考虑到python ...

  5. Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说。。。

    Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说... root@xi4ojin:~# cd ...

  6. 怎样取出cobbler kopts中设置的参数?

    Is there a way to find out with what parameters did the kernel boot? For example if I specify noexec ...

  7. 【云计算】Docker云平台—Docker进阶

    Docker云平台系列共三讲,此为第二讲:Docker进阶 参考资料: 五个Docker监控工具的对比:http://www.open-open.com/lib/view/open1433897177 ...

  8. 说说localStorage

    HTML5的本地存储是大势所趋,如果仅存储在内存中,则是sessionStorage,他们的语法都是一样,仅仅是一个存储在本地文件系统中,另一个存储在内存中(随着浏览器的关闭而消失),其语句如下: l ...

  9. zabbix_agent key 传递参数

    root@(none):/etc/zabbix/zabbix_agentd.conf.d# pwd /etc/zabbix/zabbix_agentd.conf.d root@(none):/etc/ ...

  10. SWFUpload上传大文件(暂时用用,真正用的时候还是要改的)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...