【BZOJ4282】慎二的随机数列
Description
Input
Output
Sample Input
K 1
N
K 2
K 3
Sample Output
HINT
题解:一开始想得极其复杂,看了Claris的题解后也觉得极不可做,然而直到看到了这个做法:
先统计有多少个N,然后将N去掉,然后对于每个k,我们令它的值-=它前面N的个数,最后跑最长上升子序列即可。
不要问我为什么是正确的。。。如果两个K之间N的个数比这两个数的差要多,那么为什么不直接将这个K扔掉呢。。。
#include
#include
#include
using namespace std;
const int maxn=100010;
int n,m,sum;
int s[maxn];
char str[5];
inline int rd()
{int ret=0,f=1; char gc=getchar();while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd();int i,v,l,r,mid;for(i=1;i<=n;i++){scanf("%s",str);if(str[0]=='K'){v=rd()-sum;l=1,r=m+1;while(l>1;if(s[mid]m) m++;s[l]=v;}else sum++;}printf("%d",m+sum);return 0;
}