题目

题目大意

给你个平面上的一堆点,问序列pi{p_i}pi​的个数。
满足ypi−1>ypiy_{p_{i-1}}>y_{p_i}ypi−1​​>ypi​​并且xpix_{p_i}xpi​​在xpi−1x_{p_i-1}xpi​−1​和xpi−2x_{p_i-2}xpi​−2​之间。


正解

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

这题的正解有很多,最为传奇的,则是彭大爷的神仙解法。
显然这是个DP,而他抛弃了按照yyy从大到小排序的传统做法,反而是以xxx从小到大排序。将pi{p_i}pi​倒过来做。设fi,0/1f_{i,0/1}fi,0/1​表示到iii这个点,上一个点在左边或者右边的方案数。
DP的时候iii从左到右扫过去,然后从右到左枚举jjj,有两种转移:
如果yj&lt;yiy_j&lt;y_iyj​<yi​,则从fj,1f_{j,1}fj,1​转移到fi,0f_{i,0}fi,0​
如果yj&gt;yiy_j&gt;y_iyj​>yi​,则从fi,0f_{i,0}fi,0​转移到fj,1f_{j,1}fj,1​
这样的转移为什么是对的?实际上随便画个图就能理解了。
具体来说,在第一类转移的时候,很显然之前转移到fj,1f_{j,1}fj,1​的是jjj和iii之间的状态;
在第二类转移的时候,很显然之前转移到fi,0f_{i,0}fi,0​的是jjj和iii之间的状态。
这样就保证了题目要求的性质。


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 7010
inline int input(){char ch=getchar();while (ch<'0' || '9'<ch)ch=getchar();int x=0;do{x=x*10+ch-'0';ch=getchar();}while ('0'<=ch && ch<='9');return x;
}
int n,m,mo;
struct Node{int x,y;
} d[N];
inline bool cmpd(const Node &a,const Node &b){return a.x<b.x;}
int f[N][2];
int main(){n=input(),mo=input();for (int i=1;i<=n;++i)d[i]={input(),input()};sort(d+1,d+n+1,cmpd);for (int i=1;i<=n;++i){f[i][0]=f[i][1]=1;for (int j=i-1;j>=1;--j)if (d[j].y<d[i].y)(f[i][0]+=f[j][1])%=mo;else(f[j][1]+=f[i][0])%=mo;}long long ans=0;for (int i=1;i<=n;++i)ans+=f[i][0]+f[i][1];printf("%lld\n",((ans-n)%mo+mo)%mo);return 0;
}

总结

这样的DP真是太鬼畜了……
彭大爷牛逼!!!
%%%

[JZOJ1901] 【2010集训队出题】光棱坦克相关推荐

  1. 清橙 A1210. 光棱坦克

    A1210. 光棱坦克 时间限制:1.0s   内存限制:512.0MB   总提交次数:   AC次数:   平均分: 将本题分享到: 查看未格式化的试题   提交   试题讨论 试题来源 2010 ...

  2. jzoj1901. 光棱坦克

    题目描述 Description 一个平面直角坐标系上,有N个点,标号为1到N,其中第i个点的坐标为(x[i], y[i]). 求满足以下两个条件的点列{p[i]}的数目(假设{p[i]}的长度为M) ...

  3. 清橙A1210. 光棱坦克

    问题描述 一个平面直角坐标系上,有N个点,标号为1到N,其中第i个点的坐标为(x[i], y[i]). 求满足以下两个条件的点列{p[i]}的数目(假设{p[i]}的长度为M): 1) 对任意1 &l ...

  4. [Tsinsen A1210] 光棱坦克(动态规划+前缀和优化)

    题意 一个平面直角坐标系上,有 N N N个点,标号为 1 1 1到 N N N,其中第 i i i个点的坐标为 ( x [ i ] , y [ i ] ) (x[i], y[i]) (x[i],y[ ...

  5. [tsinsen1210]光棱坦克——动态规划+前缀和优化

    题目大意: 一个平面直角坐标系上,有N个点,标号为1到N,其中第i个点的坐标为(x[i], y[i]). 求满足以下两个条件的点列{p[i]}的数目(假设{p[i]}的长度为M): 1) 对任意1 & ...

  6. argb可以和rgb同步吗_神光同步酷炫幻彩,安钛克光棱120 RGB风扇套装

    目前这个时代,电脑的各种配件来说,走向了万物皆要有光的风格.相信发光耳机,发光键盘,发光鼠标大家也都见过不少.侧透机箱甚至全透机箱搭配各类酷炫光效在电竞游戏领域也变得越来越火.许多小伙伴在组装一款电脑 ...

  7. 【2011集训队出题】跳跳棋

    [2011集训队出题]跳跳棋 Time Limits: 1000 ms Memory Limits: 128000 KB Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点 ...

  8. JZOJ 1980. 【2011集训队出题】Construct

    Description 随着改革开放的深入推进-- 小T家要拆迁了-- 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于市中心,拆 ...

  9. bzoj2144 [2011集训队出题] 跳跳棋 倍增 lca

    Description 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把 ...

最新文章

  1. recycleView 滑动删除Item,拖拽切换Item,你想了解的都在这儿
  2. BZOJ3230 相似子串 字符串 SA ST表
  3. 坐拥双妹、佰草集,上海家化是怎样将一只脚留在高端护肤品门外的?
  4. 前端技术分享:Nginx负载均衡视频,基础的实战应用
  5. java imap 标记已读,JavaMail通过IMAP和POP3接收未读以及设置已读邮件
  6. CRM One Order 事件处理元数据初始化的准确位置
  7. Android Bluetooth BLE相关开发资源汇总
  8. 14-mysql-分页查询
  9. Oracle查询一个范围,oracle字段范围查询
  10. POJ 1659 Frogs#39; Neighborhood(度序列组成)
  11. 检查pandas是否存在一列或者多列
  12. QT实现低延迟的RTSP、RTMP播放器
  13. 解析几何:第六章 二次曲面(2)抛物面 二次锥面 柱面 一般二次曲面
  14. iOS如何通过安装描述文件获取设备UDID
  15. RuoYi-flowable工作流管理
  16. 阿里云国际版查看云服务器ecs实例系统日志和截图-Unirech
  17. 关于linux下UART串口编程的困惑
  18. 201771010101 白玛次仁 《2018面向对象程序设计(Java)》第九周学习总结
  19. drozer连接时出错,显示received an empty response from the agent
  20. 自己动手制作C 语言编译器(8):表达式

热门文章

  1. PDF快捷工具软件开发(非标)
  2. 报告指2018年全球经济保持稳定增长
  3. 大数据带给国防动员哪些机遇?
  4. 「UbuntuROS」Ubuntu系统下几个必不可少的设置和软件|1-4
  5. 小师妹问 easyUI mergeCells 行合并后表头和内容对不齐
  6. 什么是冲突域?如何解决冲突?
  7. vue中使用vuex-persistedstate插件实现数据持久化
  8. PAT L3-011 直捣黄龙
  9. 面试官最喜欢考的设计模式---单例设计模式
  10. flexible.js在华某为手机上使用rem时,页面宽度超出手机屏幕宽度