雅礼集训 Day1 T2 折射
折射
题目描述
小\(\mathrm{Y}\)十分喜爱光学相关的问题,一天他正在研究折射.
他在平面上放置了\(n\)个折射装置,希望利用这些装置画出美丽的折线.
折线将从某个装置出发,并且在经过一处装置时可以转向,若经过的装置坐标依次为\((x_1, y_1),(x_2,y_2),\dots (x_k, y_k)\), 则必须满足:
- \(\forall j\in (1,k],y_j<y_{j-1}\)
- \(\forall j\in (2,k],x_{j-2}<x_j<x_{j-1}\ \mathrm{or}\ x_{j-1}<x_j<x_{j-2}\)
现在他希望你能告诉他,一共有多少种不同的光线能被他画出来,两种光线不同当且仅当经过的折射装置的集合不同.你只需要告诉他答案对\(10^9+7\)取模后的结果.
输入输出格式
输入格式
第一行一个正整数\(n\),表示折射装置的数量.
接下来\(n\)行,每行两个整数\(x_i,y_i\)表示折射装置的坐标.
输出格式
输出一行一个整数,表示答案对\(10^9+7\)取模后的结果.
说明
对于\(10\%\)的数据:\(n\le 700,1\le x_i,y_i\le n\)
对于\(20\%\)的数据:\(n\le 1000,1\le x_i, y_i\le n\)
对于\(50\%\)的数据:\(n\le 4000,|x_i|,|y_i|\le 10^9\)
对于\(100\%\)的数据:\(n\le 6000,|x_i|,|y_i|\le 10^9\)
所有数据满足\(\forall i\not=j,x_i\not=x_j\ \mathrm{and}\ y_i\not=y_j\).
最后五分钟发现题目看错了emm,爆0嘞
后来发现STD的做法简直玄妙至极
有很多空间\(O(n^2)\),时间\(O(n^2)\)的50pts做法,不多提了
正解\(dp_{i,0/1}\)代表按\(x\)排序以\(i\)为入射点的光线,像左下方0/右下方1入射,注意这里前\(i\)并不是状态,因为后面可以更改这个\(dp_i\)状态,按\(x\)排序只是为了方便处理
转移呢?
\(\forall y_j<y_i,dp_{i,0} \leftarrow \ dp_{j,1}\)
\(\forall y_j>y_i,dp_{j,1} \leftarrow \ dp_{k,0}|y_k<y_i \ and \ x_k>x_j\)
这里直接借用题解里面说的了
写法也很妙
总结:对于给了一些单调限制条件的\(dp\),不妨根据限制条件设计方程
Code:
#include <cstdio>
#include <algorithm>
const int N=6010;
const int mod=1e9+7;
struct node
{
int x,y;
bool friend operator <(node n1,node n2){return n1.x<n2.x;}
}dx[N];
int n,dp[N][2],ans;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&dx[i].x,&dx[i].y);
std::sort(dx+1,dx+1+n);
dp[1][0]=dp[1][1]=1;
for(int i=2;i<=n;i++)
{
dp[i][0]=dp[i][1]=1;
for(int j=i-1;j;j--)
if(dx[j].y>dx[i].y)
(dp[j][1]+=dp[i][0])%=mod;
else
(dp[i][0]+=dp[j][1])%=mod;
}
for(int i=1;i<=n;i++) (ans+=dp[i][0])%=mod,(ans+=dp[i][1]-1)%=mod;
printf("%d\n",ans);
return 0;
}
2018.10.1
雅礼集训 Day1 T2 折射的更多相关文章
- 雅礼集训 Day1 T1 养花
养花 题目描述 小\(C\)在家种了\(n\)盆花,每盆花有一个艳丽度\(a_i\). 在接下来的\(m\)天中,每天早晨他会从一段编号连续的花中选择一盆摆放在客厅, 并在晚上放回. 同时每天有特定的 ...
- 【2017-10-1】雅礼集训day1
今天的题是ysy的,ysy好呆萌啊. A: 就是把一个点的两个坐标看成差分一样的东西,以此作为区间端点,然后如果点有边->区间没有交. B: cf原题啊.....均摊分析,简单的那种. 线段树随 ...
- 雅礼集训 Day1 T3 画作 解题报告
画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...
- 雅礼集训 Day6 T2 Equation 解题报告
Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...
- 雅礼集训 Day3 T2 u 解题报告
u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...
- 雅礼集训 Day3 T2 v 解题报告
v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...
- 「雅礼集训 2017 Day1」 解题报告
「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...
- [LOJ 6031]「雅礼集训 2017 Day1」字符串
[LOJ 6031] 「雅礼集训 2017 Day1」字符串 题意 给定一个长度为 \(n\) 的字符串 \(s\), \(m\) 对 \((l_i,r_i)\), 回答 \(q\) 个询问. 每个询 ...
- [LOJ 6030]「雅礼集训 2017 Day1」矩阵
[LOJ 6030] 「雅礼集训 2017 Day1」矩阵 题意 给定一个 \(n\times n\) 的 01 矩阵, 每次操作可以将一行转置后赋值给某一列, 问最少几次操作能让矩阵全为 1. 无解 ...
随机推荐
- finddler的安装与设置
这是抓取手机包的设置 过滤 新安装的,可能还需要证书问题
- pycharm快捷键一览
编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + Alt + Space 快速导入任意类Ctrl + Shift + Enter 语句完成Ctrl + P ...
- my share
网盘一: username:3a1bd0f6634d72a0423aa21c7d2dee1a password:adaa0dfa36f537a4469fcc6e78823e1c 网盘二: userna ...
- B1081 检查密码 (15分)
B1081 检查密码 (15分) 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母 ...
- B1071 小赌怡情 (15分)
B1071 小赌怡情 (15分) 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计 ...
- filter() 函数的使用
Python3 filter() 函数 描述 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换. 该接收两个参数,第一个 ...
- 笔记-python-built-in functions-eval,exec,compile
笔记-python-built-in functions-eval,exec,compile 1. python代码执行函数 有时需要动态改变代码,也就是说代码需要是字符串格式,然后在按需要 ...
- php 升级php5.5 、php7
rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm yum install php55w php55w-opcache yum install ...
- 从事IT业一个8年老兵转行前的自我总结2——从《易经》说开来
近些年一直在读<易经>,收获颇多.以前看不贯的人或物现在可以淡然看定,以前看不开的一些事现在也安然放下,以前看不透的某些事现在也都可看透八九不离十. 古人云:不读<易>不可为将 ...
- sentry
https://docs.sentry.io/quickstart/?platform=javascript