之前记得数据结构试卷上有这种题 就是判断某一出栈顺序 是不是满足以1.2。。。n为入栈顺序
a1,a2,a3..an;
对于任意相邻a[i],a[i+1] 如果a[i]>a[i+1]+1 那么它两之间的数肯定已经在前面出栈过了 不然中间的不出栈 a[i+1]不可能出来
这一个条件就可以判断了 用数状数组求下和 就行了
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 using namespace std; 7 #define N 100010 8 #define lowbit(x) x&(-x) 9 int f[N],a[N],re[N],n; 10 void add(int x) 11 { 12 while(x<=n) 13 { 14 re[x] += 1; 15 x+=lowbit(x); 16 } 17 } 18 int getsum(int x) 19 { 20 int s=0; 21 while(x) 22 { 23 s+=re[x]; 24 x-=lowbit(x); 25 } 26 return s; 27 } 28 int main() 29 { 30 int i,k=1; 31 scanf("%d",&n); 32 for(i = 1; i <= n ; i++) 33 { 34 scanf("%d",&a[i]); 35 } 36 add(1); 37 for(i = 1; i < n ; i++) 38 { 39 add(a[i]); 40 if(a[i]>a[i+1]+1) 41 { 42 int x = getsum(a[i])-getsum(a[i+1]); 43 if(x!=a[i]-a[i+1]) 44 { 45 k = 0; 46 break; 47 } 48 } 49 } 50 if(k) 51 puts("Not a proof"); 52 else 53 puts("Cheater"); 54 return 0; 55 }