[JZOJ1901] 【2010集训队出题】光棱坦克

题目

题目大意

给你个平面上的一堆点,问序列\({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 <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真是太鬼畜了……
彭大爷牛逼!!!
%%%

原文地址:https://www.cnblogs.com/jz-597/p/11423155.html

时间: 2024-10-04 19:05:34

[JZOJ1901] 【2010集训队出题】光棱坦克的相关文章

【2010集训队出题】小Z的袜子

Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜色相同的袜子.当然,小Z希望这个概率尽量高,所以他可能会询问多个(L,R)以方便自己

[JZOJ1904] 【2010集训队出题】拯救Protoss的故乡

题目 题目大意 给你一个树形的网络,每条边从父亲流向儿子.根节点为原点,叶子节点流向汇点,容量为无穷大. 可以给一些边扩大容量,最多总共扩大\(m\)容量.每条边的容量有上限. 求扩大容量后最大的最大流. 思考历程 隐隐约约地猜到正解跟树链剖分有什么关系,可是没有打,也没有时间打. 只能暴力DP来水分. 设\(h_{i,j}\)为\(i\)的父亲到\(i\)的最大流,扩大了\(j\)次容量.\(g_{i,j}\)为\(i\)到子树的最大流,扩大了\(j\)次容量.前者由后者和边的容量取最小值后得

【JZOJ1899】【2010集训队出题】剪枝

题目大意 给出一个有根树,\(1\)为根,若某个节点的儿子全是叶子,你可以将该节点的儿子全部剪掉,这样的操作可以进行多次.定义这棵树的价值为:将树上所有叶子按照\(dfs\)序排序后,所有叶子点权之和-相邻两叶子路径上点权最大值.现在你要通过剪枝使得这棵树价值最大. \(n\leq 100000\) 分析 设\(f_i\)表示\(i\)作为最后一个叶子时的最大价值.暴力枚举原树(没有剪枝)相邻的两个叶子,显然左链上每个点的\(f\)都可以转移到右链上,我们暴力处理出这条路径,分类讨论点权最大值在

JZOJ 1981. 【2011集训队出题】Digit

JZOJ 1981. [2011集训队出题]Digit Time Limits: 1000 ms Memory Limits: 128000 KB Description 在数学课上,小T又被老师发现上课睡觉了.为了向全班同学证明小T刚才没有好好听课,数学老师决定出一道题目刁难一下小T,如果小T答不出,那么-- 情节就按照俗套的路线发展下去了,小T显然无法解决这么复杂的问题,可怜的小T只能向你求助: 题目是这样的: 求一个满足条件的n位数A(不能有前导0),满足它的数字和为s1,并且,A*d的数

【JZOJ1914】【2011集训队出题】最短路

题目大意 给你一个带权无向图,满足图上任意一条边最多属于一个环,有\(q\)个询问,求\(u,v\)之间的最短路. \(n,q\leq 10000\) Solution 首先用Tarjan建一棵以\(1\)为根的搜索树,找出每个环,记录环的总长,将环内每个点\(u\)连向环内\(dfs\)序最小的点\(v\),边权为\(u\)到\(v\)的最短路,然后把不在环上的边照旧连上,这样我们就得到了一棵树. 现在要求\(a\)到\(b\)的最短路,我们考虑倍增,若两个点在一条链上,它们的最短路就是树上的

装饰模式(Decorate)-今天你要秀你的哪一面?

装饰模式可以动态的加入程序功能,避免因为过度子类化带来的耦合,相比较用继承方式的静态,装饰更为灵活. 意图 动态地给一个对象增加一些额外的职责.就增加功能而言,Decorator模式比生成子类更为灵活. --GOF 动态是指在程序运行时来决定,而静态则是在编译时就已经确定,例如使用组合的方式,可以动态决定功能,但如果使用继承,则是在编译时就要确定,这也就是在一些场景中推荐使用组合的原因.装饰模式与我们上一篇所讲的桥接模式,都是用了组合方式来解决因为多个变化维度导致的多继承的问题. 解决的是什么问

QualNet/EXata的发展贯穿在美军网络中心战演进的始终

QualNet/EXata的发展贯穿在美军网络中心战演进的始终 赵玉亭 1.   QualNet/EXata的前身GloMoSim是美国防部高级计划研究局(DARPA)在1994年启动的全球移动信息系统(GloMo)项目开发中,由美国加州大学洛杉矶分校(UCLA)并行计算Rajive Bagrodia教授小组研制的世界上第一个高保真无线移动分组网研究工具.QualNet/EXata制造商SNT公司的董事之一是美空军少将(已退休)George W. "Nordie" Norwood. 2

圆方树小结

圆方树 jzoj 1914. [2011集训队出题]最短路 这是道圆方树+倍增LCA裸题. 圆方树,顾名思义,就是圆点和方点所组成的树. 而方点就是一个圆的根,一般都是\(dfs\)时第一个到这个圆的那个位置,然后另附一个点当做方点.然后圆所组成的点都连向方点. 而对于这种圆方边的边权,则为它到根的最近值. 从而将一个仙人掌转成了一棵树. 然后对于这棵树,我们就可以用倍增来求出两两点之间的最短路了. 注意的是,对于最后走到的位置,我们要看看它是从上面绕近还是直接从下面走更优!!! 就这样子了.

[国家集训队2010]小Z的袜子

★★★   输入文件:hose.in   输出文件:hose.out   简单对比 时间限制:1 s   内存限制:512 MB [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便