[CSP-S模拟测试]:折射(DP)
题目描述
小$Y$十分喜爱光学相关的问题,一天他正在研究折射。
他在平面上放置了$n$个折射装置,希望利用这些装置画出美丽的折线。
折线将从某个装置出发,并且在经过一处装置时可以转向,若经过的装置坐标依次为$(x_1,y_1),(x_2,y_2),...(x_k,y_k)$,则必须满足:
$\bullet \forall j\in (1,k],y_j<y_{j−1}$
$\bullet \forall j\in (2,k],x_{j−2}<x_j<x_{j−1}or\ x_{j−1}<x_j<x_{j−2}$
现在他希望你能告诉他,一共有多少种不同的光线能被他画出来,两种光线不同当且仅当经过的折射装置的集合不同。你只需要告诉他答案对${10}^9+7$取模后的结果。
输入格式
第一行一个正整数$n$,表示折射装置的数量。
接下来$n$行,每行两个整数$x_i,y_i$表示折射装置的坐标。
输出格式
输出一行一个整数,表示答案对${10}^9+7$取模后的结果。
样例
样例输入:
4
2 2
3 1
1 4
4 3
样例输出:
14
数据范围与提示
对于$10\%$的数据:$n\leqslant 700,1\leqslant x_i,y_i\leqslant N$
对于$20\%$的数据:$n\leqslant 1,000,1\leqslant x_i,y_i\leqslant N$
对于$50\%$的数据:$n\leqslant 4,000,|x_i|,|y_i|\leqslant {10}^9$
对于$100\%$的数据:$n\leqslant 6,000,|x_i|,|y_i|\leqslant {10}^9$
所有数据满足$\forall i\neq j,x_i\neq x_j\ and\ y_i\neq y_j$。
题解
考试的时候上去就将$y_i$排了个序,然后我就死了……
这道题就是让你找形如下图的图形有多少个:

因为给$y_i$排序不好处理,所以我们考虑给$x_i$排序。
那么我们考虑$DP$,设$dp[i][0/1]$表示第$i$个点为顶端,向左或向右的方案数。
那么我们可以列出状态转移方程:
$\alpha.\forall y_j<y_i,dp[i][0]\leftarrow dp[j][1]$。
$\beta.\forall y_j>y_i,dp[j][1]\leftarrow dp[k][0]|x_k>x_j\ and\ y_k<y_i$。
时间复杂度:$\Theta(n^2)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
pair<int,int> p[6001];
int dp[2][6001];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&p[i].first,&p[i].second);
sort(p+1,p+n+1);
for(int i=1;i<=n;i++)
{
dp[0][i]=dp[1][i]=1;
for(int j=i-1;j;j--)
p[i].second>p[j].second?dp[0][i]=(dp[0][i]+dp[1][j])%1000000007:dp[1][j]=(dp[1][j]+dp[0][i])%1000000007;
}
for(int i=1;i<=n;i++)dp[0][0]=(dp[0][0]+(dp[0][i]+dp[1][i])%1000000007)%1000000007;
printf("%d",(dp[0][0]-n+1000000007)%1000000007);
return 0;
}
rp++
[CSP-S模拟测试]:折射(DP)的更多相关文章
- noi2019模拟测试赛(四十七)
noi2019模拟测试赛(四十七) T1与运算(and) 题意: 给你一个序列\(a_i\),定义\(f_i=a_1\&a_2\&\cdots\&a_i\),求这个序列的所 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- csp-s模拟测试93
csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 02:07:34 ...
- csp-s模拟测试92
csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼 ...
随机推荐
- koa2 源码解读 application
koa2的源码比较简单,重点解读aplication, 其中context源码比较简单,主要是一些error cookies等,重点可以关注下delegate,delegate模块中,主要通过prot ...
- poj1065Wooden Sticks(dp——最长递减数列)
Description There is a pile of n wooden sticks. The length and weight of each stick are known in adv ...
- Android深度探索-卷1第八章心得体会
本章介绍了如何将Linux驱动分成多个实现文件和Linux常用的代码重用方式还有些强行卸载Linux驱动的方法 开发一个Linux驱动,可能会在init.exit等函数中发生错误导致Linux驱动安装 ...
- IOS-问题整理
安装包相关 安装包无法打开 通用中点击验证应用无反应 卸载-删除证书-重装
- 统计Git
公司需求统计Mos代码行数 方法一:用git #!/bin/bash read -p "输入你要统计mos的分支:" branch Mos_Project=(uusafe-prod ...
- CPU高速缓存行与内存关系 及并发MESI 协议(转载)
原文链接 http://www.cnblogs.com/jokerjason/p/9584402.html 先来一个整体图 一. 大致关系: CPU Cache --> 前端总线 FSB (下图 ...
- deepFreeze
obj1 = { internal: {} }; Object.freeze(obj1); obj1.internal.a = 'aValue'; obj1.internal.a // 'aVal ...
- Python 学习笔记20 自定义robot Framework 关键字
Robot Framework 自定义关键字 Robot framework 自定义了一些关键字我们可以把他们当作函数在设计测试用例的时候使用. 同时RF也提供了许多第三方的库,我们可以自己下载使用. ...
- android项目的目录结构讲解
参考书籍:<第一行代码Android> 一:android项目的目录结构讲解 1..gradle和.idea 这两个目录下放置的都是Android Studio自动生成的一 ...
- Codeforces 1166E(思维)
题面 有一个长度为n的序列a,有m次操作.每一次操作一个人选a的一个子集x,另一个人会选x的补集y.且x集合中的数的最小公倍数比y集合中的数的最小公倍数大.现在给出所有x,判断是否有一个序列a满足条件 ...