原题链接:
http://codeforces.com/problemset/problem/811/B
题意:
给你一个序列,截取一段该序列的子序列以升序方式排列,判断重新排序前后某位(该为属于子序列)值是否改变;
思路:
最开始时只是简单的对子序列sort排序,超时;后来看了大神的博客:数字不变,当且仅当 x 在 [ l , r ] 中的左边比 x 大的数字个数与 x 右边比 x 小的数字个数相等;
测试数据比较大,不建议流输入,可能会超时(尽管本人没试验);
ps:大神博客链接:http://blog.csdn.net/joovo/article/details/72787899
代码:
1 #include<cstdio> 2 #include<string> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 7 using namespace std; 8 9 int main() 10 { 11 int a[10002]; 12 int n,m,l,r,x,i; 13 cin>>n>>m; 14 for(i=0;i<n;i++) 15 { 16 scanf("%d",&a[i]); 17 } 18 while(m--) 19 { 20 int p=0,q=0; 21 scanf("%d%d%d",&l,&r,&x); 22 for(i=l-1;i<r;i++) 23 { 24 // printf("i=%d,x=%d,a[i]=%d,a[x-1]=%d\n",i,x,a[i],a[x-1]); 25 if(i<(x-1)&&a[i]>a[x-1]) 26 p++; 27 else if(i>(x-1)&&a[i]<a[x-1]) 28 q++; 29 } 30 // printf("p=%d,q=%d\n",p,q); 31 if(p==q) 32 printf("Yes\n"); 33 else 34 printf("No\n"); 35 } 36 return 0; 37 }