2018雅礼 折射

  雅礼题好难啊。 

  这个DP题思路好强。

  

  这个东西首先一眼就知道按y排的DP怎么写,大概就是设$f(i,j,k)$表示考虑到y坐标从大到小排名为i的点,这线上一次转是j,上上次转是k的数量,直接二维限制转移就行了。

  考虑这东西怎么优化。

  前缀和能搞时间,woc空间也被卡了???

  打出来表看一看????

  这个DP数组有好多都是空的。。。

  因为越往后x限制的越少。

  然后我就不会了。

  正经:设$f(i,0/1)$表示从x坐标排名为i,出门左转还是右转的线的数量。

  我一开始就否掉了这东西因为好像转移顺序会出问题。

  但是仔细考虑一下。

  对于一个点i,如果它的左侧有一个点j比他低,那么j能把自己的右转数量转移给i的左转数量。

  如果有一个点j比它高,那么应该是把i的左转转移给j的右转。

  但是这时i的左转不能转的比j还靠左否则不合题意。

  但是我们可以在转移i的时候先不转移i的右转,然后去枚举左侧j用i去给j做他的右转贡献(先后问题。有人会给i做贡献)。

  当我们从大到小枚举比i高的j的时候恰好就有,此时加到的i左转没有比j还小的点的贡献。

  那么就可以给j做右转贡献。

  所以它很对。

  还很快。

  还很省空间。

  

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int N=6020,mod=1e9+7;
 7 int f[N][N];
 8 inline int rd()
 9 {
10     int s=0,w=1;
11     char cc=getchar();
12     for(;cc<‘0‘||cc>‘9‘;cc=getchar()) if(cc==‘-‘) w=-1;
13     for(;cc>=‘0‘&&cc<=‘9‘;cc=getchar()) s=(s<<3)+(s<<1)+cc-‘0‘;
14     return s*w;
15 }
16 struct node{int x,y;}p[N];
17 bool cmp(node a,node b){return a.x<b.x;}
18 int main()
19 {
20     int n=rd();
21     for(int i=1;i<=n;i++)p[i].x=rd(),p[i].y=rd();
22     sort(p+1,p+n+1,cmp);
23     for(int i=1;i<=n;i++)
24     {
25         f[i][0]=f[i][1]=1;
26         for(int j=n;j;j--)
27         {
28             if(p[j].x>=p[i].x)continue;
29             if(p[j].y<p[i].y)f[i][0]=(f[i][0]+f[j][1])%mod;
30             else f[j][1]=(f[j][1]+f[i][0])%mod;
31         }
32     }
33     long long ans=0;
34     for(int i=1;i<=n;i++)
35         ans=((ans+f[i][0])%mod+f[i][1])%mod;
36     printf("%lld\n",(ans-n+mod)%mod);
37 }
38 /*
39 g++ 1.cpp -o 1
40 ./1
41 4
42 2 2
43 3 1
44 1 4
45 4 3
46 */

原文地址:https://www.cnblogs.com/starsing/p/11575105.html

时间: 2024-10-08 14:26:24

2018雅礼 折射的相关文章

[2018雅礼集训1-16]方阵

[题目描述]: 给出一个 \(n×m\) 大小的矩形,每个位置可以填上$ [1,c]$中的任意一个数,要求填好后任意两行互不等价且任意两列互不等价,两行或两列等价当且仅当对应位置完全相同,求方案数 . \(n,m\le 5000\) 确实是一道神仙题. 对这种行列都有限制的题我们可以先只考虑一边. 我们先只考虑让行之间互不等价,一个\(n行m列\)且行互不等价的矩形的方案数为\((C^m)^{\underline{n}}\). 我们设\(g(m)\)表示行互不等价的情况下,\(m\)列的矩形的方

#6030. 【雅礼集训 2017 Day1】矩阵

#6030. 「雅礼集训 2017 Day1」矩阵 题目描述 有一个 n×n  的矩阵,每个位置 (i,j) 如果是 . 表示为白色,如果是 # 表示为黑色. 初始时,每个位置可以是黑色或白色的,(i,j)  位置的值会作为 ai,j 给你. 现在有一种操作,选择两个整数 i,j∈[1,n],记 (i,1),(i,2),…,(i,n) (i, 1), (i, 2)的颜色为 C1,C2,…Cn ??,将 (1,j),(2,j),…,(n,j)  的颜色赋为 C1,C2,…,Cn ??. 你的任务是

2017雅礼省选集训做题记录

嘛,最近在补雅礼省选前集训的题.都是我会做的题..那一定是最水的那些题啦 题目在loj.ac上都有.过段时间如果搬了雅礼NOI集训的题应该也会做做的吧.. Day1 T1 一道经典套路题,做法跟UOJ #228基础数据结构练习题类似. 使用线段树维护.考虑相邻两个数的差值最多变化log次.也就是说,对于每个区间,只要操作二进行大概log次就能使得这个区间内所有数完全一样.所以对于操作二,只要记录一下区间最大最小值,就能直接打标记或者暴力DFS下去. 和UOJ那个题一样,注意一个特殊情况,就是一个

雅礼学习10.2

雅礼学习10.2 上午考试解题报告 各题状况(爆零) T1 想了10多分钟,暴力只有一个极大复杂度的想法,显然不可过,但还是写了,然后就全TLE也是...意料之中 T2 暴力很好写,但是错误理解了Tim给的部分分的意思:先给了一个\(a_i\le 10^9\),然后部分分里面没有提到\(a_i\)的情况,我就忽略了\(a_i\)的大小对答案统计的影响... 换句话说,我当时要是写了离散化,就是\(43\)分到手. T3 题目要求的输出可以分成三个问题,第一个问题正确 的话可以得到这个点的\(25

雅礼学习10.4

雅礼学习10.4 上午考试 各题状况 T1 莫名其妙20分了. 考场上一眼秒掉了这个题目:这不就是个并查集捆绑+快速幂么 然后开开心心这个点如果有这个质因子的话\(fa\)就指向这个质因子,而每个数字有多个质因子... 多个质因子在相互指\(fa\)的时候指乱套了.... 对拍的时候看出来的,然后用\(1\)个多小时来调这份代码,最后自己都不知道这东西在干嘛了,就凉了. T2 写了个暴力枚举,期望\(20\)实际\(20\) T3 看到成绩之后:这题怎么会爆\(long long\)的??? 然

雅礼学习10.5

雅礼学习10.5 上午考试 各题状况 T1 模拟挂成\(10\)分?? 每次更新答案的时候位置搞错了. 想到了可能是线段树动态开点,但没写出来,因为标记下传不会... T2 理解错了题目含义. 选出的\(m\)个物品中,至少要有\(k\)个是\(A\)喜欢的,至少\(k\)个是\(B\)喜欢的 那么很显然只要满足了上面的限制条件,俩人都不喜欢的也能选... 但考场上没想到这层 就凉了 正解变骗分,\(15\)分 T3 搞完上面两个题目之后没剩多少时间,就随便扔了个东西上去.. 也不知道写的是个啥

雅礼学习10.7

雅礼学习10.7 上午考试 各题状况 全TM神仙题... \(T1\) \(35\)分暴力 \(T2\) 我\(n=1\)的时候直接输出了\(1\),连这个格子上是否有方块都没判,当时是感觉...难道这个部分分也会卡么 结果出题人就这么卡了..就一分都没有了 太毒瘤了. \(T3\) 成功骗\(8\)分 做了一段时间之后去做牛客网的来着. 跟人要了份暴力 然后我TM..从紫名变成灰名了???? 题目及考场代码 T1 /* * 暴力思路:从初始位置开始进行bfs */ #include<queue

雅礼学习10.6

雅礼学习10.6 上午考试 各题状况 T1 二分答案 应该有反例,就是说,答案应该不是单调的 但是不会写其他的算法了啊... T2 我TM... 第二个红框圈出来的部分应该是 if(x1+x1!=s) 写错了,就没了\(18\)分.. T3 写了个\(n^4\)的暴力 最后发现题目中的矩形的四个顶点不一定是给定的顶点.. 那就GG了 各题题目及考场代码 T1 /* * 二分答案.. * 复杂度O(20(N+NlogN+M))的,感觉很悬 * 排序应该可以优化掉,但是不太会哎. */ #inclu

雅礼集训——day1、day2

day1: 嗯上午考试拿了100分.第一题40,第二题60.看完题的时候我就觉得第二题的部分分是最好得到的,因为数据范围只有300,而且一眼看上去就是网络流的二分图多重匹配模型?然后就建了个网络流写了些,期望得分是70分,但是第1组数据有点劲,被卡掉了,就拿了60分.正解是map+set的贪心...并不会STL 写完T2去看T1,先用DFS乱搞了一下,结果样例都没过去,我手推了一下样例,得到了一个公式,就是从一个点出发需要加上的边数=这个点通过DFS能够遍历到的点的个数-与这个点直接相连的点的个