第三次校赛链接:戳我

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 }
View Code

相关文章: