Description

天才麻将少女KPM立志要在日麻界闯出一番名堂。
KPM上周叒打了n场麻将,但她这次又没控分,而且因为是全市参与的麻将大赛,所以她的名次范围是0..10^5。
名次可能等于0是因为KPM那场没去打= =
没去打就意味着无限的可能性。
KPM叒想要让自己的名次严格递增。为了避免被妹子怀疑,她只能把没打的比赛的名次改成T..R中的整数
当然,n场全部严格递增是很难做到的。你只需要求出可能的最长递增子序列长度就好了。

Input

第一行三个整数n,T,R。
第二行n个整数,表示n场的排名。

Output

可能的最长递增子序列长度。

Sample Input

5 1 4
3 0 5 9 2

Sample Output

4

HINT

对于100%的数据: 

%%%来自yy的题解

自己的代码没有写差分,又丑又慢QAQ

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<iostream>
#define LL long long
using namespace std;
const int N=2e5+;
int n,L,R,a,tmp,cnt=1e5;
int root,rt1,rt2,rt3,st[N],ch[N][];
#define lc ch][0
#define rc ch][1
#define rnd ch][2
#define sz ch][3
#define v ch][4
#define tag ch][5
#define mx ch][6
#define mn ch][7
#define cov ch][8
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
void up(int w)
{
w[sz]=w[lc][sz]+w[rc][sz]+;w[mx]=w[mn]=w[v];
if(w[lc])w[mx]=max(w[mx],w[lc][mx]),w[mn]=min(w[mn],w[lc][mn]);
if(w[rc])w[mx]=max(w[mx],w[rc][mx]),w[mn]=min(w[mn],w[rc][mn]);
}
void dn(int w)
{
if(w[cov])
{
w[lc][v]=w[lc][cov]=w[lc][mx]=w[lc][mn]=w[cov];
w[rc][v]=w[rc][cov]=w[rc][mx]=w[rc][mn]=w[cov];
w[lc][tag]=w[rc][tag]=;
w[cov]=;
}
if(w[tag])
{
w[lc][v]+=w[tag];w[lc][tag]+=w[tag];
w[lc][mx]+=w[tag];w[lc][mn]+=w[tag];
w[rc][v]+=w[tag];w[rc][tag]+=w[tag];
w[rc][mx]+=w[tag];w[rc][mn]+=w[tag];
w[tag]=;
}
}
void dfs(int w){if(!w)return;dfs(w[lc]);dfs(w[rc]);up(w);}
int build()
{
int top=;
for(int w=;w<=1e5;w++)
{
w[rnd]=rand();
while(top&&st[top][rnd]>w[rnd])
{
st[top][rc]=w[lc];
w[lc]=st[top--];
}
st[top][rc]=w;st[++top]=w;
}
ch[][]=;dfs(st[]);
return st[];
}
void split(int w,int& l,int& r,int k)
{
if(!w){l=r=;return;}
dn(w);int lson=w[lc][sz];
if(k<=lson){r=w;split(w[lc],l,w[lc],k);}
else{l=w;split(w[rc],w[rc],r,k-lson-);}
up(w);
}
int merge(int a,int b)
{
if(!a||!b)return a+b;
if(a[rnd]<b[rnd]){dn(a);a[rc]=merge(a[rc],b);up(a);return a;}
else{dn(b);b[lc]=merge(a,b[lc]);up(b);return b;}
}
int rank(int w,int k)
{
if(!w)return ;dn(w);
int lson=w[lc][sz];
if(k==lson+)return w[v];
if(k<=lson)return rank(w[lc],k);
else return rank(w[rc],k-lson-);
}
void ins(int& w,int x,int k)
{
dn(w);
if(x[rnd]<w[rnd]||!w){split(w,x[lc],x[rc],k);w=x;up(w);return;}
int lson=w[lc][sz];
if(k<=lson)ins(w[lc],x,k);
else ins(w[rc],x,k-lson-);
up(w);
}
void del(int& w,int k)
{
dn(w);
int lson=w[lc][sz];
if(k==lson+){w=merge(w[lc],w[rc]);return;}
if(k<=lson)del(w[lc],k);
else del(w[rc],k-lson-);
up(w);
}
void add(int L,int R,int V)
{
rt1=rt2=rt3=;split(root,rt2,rt3,R);
root=rt2;rt2=;split(root,rt1,rt2,L-);
rt2[tag]+=V;rt2[v]+=V;rt2[mx]+=V;rt2[mn]+=V;
root=merge(rt1,rt2);root=merge(root,rt3);
}
void cover(int w,int V)
{
if(!w||w[mn]>=V)return;
dn(w);if(w[v]<V)w[v]=V;
if(w[mx]<=V){w[cov]=V;w[tag]=;up(w);return;}
cover(w[lc],V);cover(w[rc],V);
up(w);
}
void update(int L,int R,int V)
{
rt1=rt2=rt3=;split(root,rt2,rt3,R);
root=rt2;rt2=;split(root,rt1,rt2,L-);
cover(rt2,V);
root=merge(rt1,rt2);root=merge(root,rt3);
}
int main()
{
n=read();L=read();R=read();root=build();
for(int i=;i<=n;i++)
{
a=read();
if(a>)
{
tmp=rank(root,a-)+;
update(a,1e5,tmp);
}
else
{
del(root,R);cnt++;
tmp=rank(root,L-);
cnt[v]=tmp;cnt[rnd]=rand();
ins(root,cnt,L-);
add(L,R,);tmp=rank(root,R);
if(R!=1e5)update(R+,1e5,tmp);
}
}
printf("%d",root[mx]);
return ;
}

【SRM-07 D】天才麻将少女KPM的更多相关文章

  1. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

  2. CH暑假欢乐赛 SRM 07 天才麻将少女KPM(DP+treap)

    首先LIS有个$O(n^2)$的DP方法 $f(i,j)$表示前i个数,最后一个数<=j的LIS 如果$a_i!=0$则有 如果$a_i=0$则有 注意因为$f(i-1,j)\leq f(i-1 ...

  3. 汕头市队赛 SRM 07 B 好玩的麻将

    B 好玩的麻将 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周又打了n场麻将,又控了分使得自己的排名是1..n的一个排列.     但她 ...

  4. 汕头市队赛 SRM 07 C 整洁的麻将桌

    C 整洁的麻将桌 SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周双打了n场麻将,但她这次没控分,而且因为是全民参与的麻将大赛,所以她的名 ...

  5. 汕头市队赛 SRM 07 A 你的麻将会排序吗

    A 你的麻将会排序吗 SRM 07 曾经有过一些沉迷日麻的小孩纸,后来呀,他们都去寻找自己的世界了. kpm也是这样的小孩纸.他想有一只自动整理牌的机器.当麻将以给定的顺序进入机器时,通过机器的运转, ...

  6. csps-s模拟测试60嘟嘟噜,天才绅士少女助手克里斯蒂娜,凤凰院凶真题解

    题面:https://www.cnblogs.com/Juve/articles/11625190.html 嘟嘟噜: 约瑟夫问题 第一种递归的容易re,但复杂度较有保证 第二种适用与n大于m的情况 ...

  7. 【CSP模拟赛】天才绅士少女助手克里斯蒂娜(线段树&读入优化&输出优化)

    题面描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响.选取显像管的任意一个平面,一开始平面内有个n电子,初始速度分别为vi,定义飘升系数为 $$\sum_{1\leqsl ...

  8. [CSP-S模拟测试]:天才绅士少女助手克里斯蒂娜(数学+树状数组)

    题目描述 红莉栖想要弄清楚楼下天王寺大叔的显像管电视对“电话微波炉(暂定)”的影响. 选取显像管的任意一个平面,一开始平面内有个$n$电子,初始速度分别为$v_i$,定义飘升系数为$$\sum \li ...

  9. 汕头市队赛 SRM 06 B 起伏的排名

    B 起伏的排名 SRM 06 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     在上个星期她打了n场麻将,每场麻将都有n名玩家.KPM自然记得自己的n次排名.   ...

随机推荐

  1. mysql5.6做单向主从复制Replication

    原理场景:MySQL从3.23版本开始提供复制功能.指的是将主数据库的DDL和DML操作通过二进制日志传到从服务器(也叫从库),然后在从库上对这些日志重新执行, 从而使得从库和主库的数据保持同步. 优 ...

  2. ajax访问服务器的基础格式写法

    $("#submit").click(function( $.ajax({ url: "server/deleteHandler.ashx",//选择路径, d ...

  3. 洛谷P4362 贪吃的九头龙

    大意就是把一棵树的点染成m种颜色,其中1号点的颜色必须染恰好k个节点. 总代价是所有两端点颜色相同的边的边权. 求最小代价. 解:可以分为m == 2和m > 2两个题. m > 2时有代 ...

  4. LOJ#2541 猎人杀

    解:step1:猎人死了之后不下台,而是继续开枪,这样分母不变...... 然后容斥,枚举猎人集合s,钦定他们在1之后死.定义打到1的时候结束,枚举游戏在i轮时结束. 发现式子是一个1 + x + x ...

  5. Java基本类型占用字节数(或 bit数)

    背景:面试时候问到int类型占用几个字节,以及表示的大小,居然一脸懵逼,任何细节都不能放过. Java基本类型占用字节数(或 bit数) java是跨平台的语言,所以不论在什么系统中这些东西在内存中所 ...

  6. 奇怪的跨域访问:No 'Access-Control-Allow-Origin' header

    代码是几个月前写的,之前的几个月一直运行正常. 可今天使用的时候运行失败了,提示:No 'Access-Control-Allow-Origin' header 使用 chrome.firefox 都 ...

  7. react-native中的图片

    静态图片资源 React Native 提供了一个统一的方式来管理 iOS 和 Android 应用中的图片.要往 App 中添加一个静态图片, 只需把图片文件放在代码文件夹中某处,然后像下面这样去引 ...

  8. 第六节,Neural Networks and Deep Learning 一书小节(下)

    4.神经网络可以计算任何函数的可视化证明 神经网络拥有一定的普遍性,即包含一个隐藏层的神经网络可以被用来按照任意给定的精度来近似任何连续函数. 这一章使用一个实例来阐述神经网络是如何来近似一个一元函数 ...

  9. TestNg 8.参数化测试 - xml

    有的时候,case需要参数,那么,传餐怎么传? 我的目录结构:首先建一个包叫做parameter,然后在resource里面新建一个parameter.xml文件 看以下代码: ParameterTe ...

  10. CSUST 1011 神秘群岛 (Dijkstra+LCA)

    神秘群岛   Description 小J继续着周游世界的旅程,这次他来到了一个神奇的群岛.这片群岛有n个岛屿,同时这些岛屿被标上了1-n的编号. 每个岛屿上面都有神奇的传送门,传送门可以把小J从当前 ...