博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[JZOJ1901] 【2010集训队出题】光棱坦克
阅读量:5291 次
发布时间:2019-06-14

本文共 852 字,大约阅读时间需要 2 分钟。

题目大意

给你个平面上的一堆点,问序列\({p_i}\)的个数。

满足\(y_{p_{i-1}}>y_{p_i}\)并且\(x_{p_i}\)\(x_{p_i-1}\)\(x_{p_i-2}\)之间。


正解

我不知道为什么我的树状数组打挂了……尽管不一定能AC,但是WA了……

这题的正解有很多,最为传奇的,则是彭大爷的神仙解法。

显然这是个DP,而他抛弃了按照\(y\)从大到小排序的传统做法,反而是以\(x\)从小到大排序。将\({p_i}\)倒过来做。设\(f_{i,0/1}\)表示到\(i\)这个点,上一个点在左边或者右边的方案数。
DP的时候\(i\)从左到右扫过去,然后从右到左枚举\(j\),有两种转移:
如果\(y_j<y_i\),则从\(f_{j,1}\)转移到\(f_{i,0}\)
如果\(y_j>y_i\),则从\(f_{i,0}\)转移到\(f_{j,1}\)
这样的转移为什么是对的?实际上随便画个图就能理解了。
具体来说,在第一类转移的时候,很显然之前转移到\(f_{j,1}\)的是\(j\)\(i\)之间的状态;
在第二类转移的时候,很显然之前转移到\(f_{i,0}\)的是\(j\)\(i\)之间的状态。
这样就保证了题目要求的性质。


代码

using namespace std;#include 
#include
#include
#define N 7010inline int input(){ char ch=getchar(); while (ch<'0' || '9'
=1;--j) if (d[j].y

总结

这样的DP真是太鬼畜了……

彭大爷牛逼!!!
%%%

转载于:https://www.cnblogs.com/jz-597/p/11423155.html

你可能感兴趣的文章
python多线程的使用
查看>>
团队编程项目作业1-成员简介及分工
查看>>
使用Chrome(PC)调试移动设备上的网页
查看>>
UI基础--手写代码实现汤姆猫动画
查看>>
使用gitbash来链接mysql
查看>>
黑盒测试和百合测试的优缺点对比
查看>>
SecureCRT的使用方法和技巧(详细使用教程)
查看>>
右侧导航栏(动态添加数据到list)
查看>>
81、iOS本地推送与远程推送详解
查看>>
C#基础_注释和VS常用快捷键(一)
查看>>
虚拟DOM
查看>>
uva 11468 Substring
查看>>
自建数据源(RSO2)、及数据源增强
查看>>
BootStrap2学习日记2--将固定布局换成响应式布局
查看>>
关于View控件中的Context选择
查看>>
2018icpc徐州OnlineA Hard to prepare
查看>>
R语言-rnorm函数
查看>>
Spark的启动进程详解
查看>>
Java 字符终端上获取输入三种方式
查看>>
javascript 简单工厂
查看>>