1001
考虑前半组数,我们只需要标记每个数出现的次数,再加上这个数之前的数出现的次数,即为这个数在m次操作中总共需要翻转的次数(即求前缀和),再根据翻转的奇偶性判断最后这个位置上的数有没有翻转即可。后半组数的处理方法类似。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<string> 8 #include<vector> 9 using namespace std; 10 int s[1000005]; 11 int m,n,vis[200010]={0},d[100010]={0}; 12 int main() 13 { 14 15 while(scanf("%d%d",&n,&m)!=EOF) 16 { 17 memset(vis,0,sizeof(vis)); 18 for(int i=0;i<n;i++) 19 scanf("%d",&s[i]); 20 for(int i=0;i<m;i++) 21 { 22 scanf("%d",&d[i]); 23 } 24 sort(d,d+m); 25 for(int i=0;i<m;i++) 26 { 27 vis[d[i]-1]++; 28 vis[n-d[i]]++; 29 } 30 for(int i=1;i<n/2;i++) 31 { 32 vis[i]+=vis[i-1]; 33 vis[n-i-1]+=vis[n-i]; 34 } 35 for(int i=0;i<n;i++) 36 { 37 if(i>0) 38 printf(" "); 39 if(vis[i]%2==0) 40 printf("%d",s[i]); 41 else 42 printf("%d",s[n-i-1]); 43 } 44 printf("\n"); 45 } 46 return 0; 47 }