Codeforces Round #365 (Div. 2)

  A题,水题。

  B题,题意挺简单的,但是要仔细。

  C题,以前做过一次,不过这次还是不会= =。具体方法见代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <vector>
 6 using namespace std;
 7 const int N = 100000 + 5;
 8 typedef long long ll;
 9 
10 int n,w,v,u;
11 
12 int main()
13 {
14     cin >> n >> w >> v >> u;
15     int flag1 = 1, flag2 = 1;
16     double ans = 0.0;
17     for(int i=1;i<=n;i++)
18     {
19         double x,y;
20         cin >> x >> y;
21         if(x / v > y / u) flag1 = 0;
22         if(x / v < y / u) flag2 = 0;
23         ans = max(ans, x / v + (w-y) / u);
24     }
25     if(flag1 || flag2) printf("%.15f
",(double)w / u);
26     else printf("%.15f
",ans);
27     return 0;
28 }
C

  D题,好题。求区间内出现偶数次数字的异或和。奇数次的话好做,前缀和一下即可。那么现在如果知道了出现过的数字的异或和,那么很显然前两者异或一下就是答案了。那么怎么求出现过的数字的异或和呢?这里的方法是离线+树状数组。每次需要记录a[i]这个数字上一次出现在哪里,把上一次出现的数字拿掉再在当前位置放上这个数字,再做区间求和即可。具体见代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <vector>
 6 #include <map>
 7 using namespace std;
 8 const int N = 1000000 + 5;
 9 typedef long long ll;
10 typedef pair<int,int> pii;
11 
12 int c[N];
13 int a[N],n,m;
14 vector<pii> query[N];
15 int ans[N];
16 int pre[N];
17 int lowbit(int x) {return x & (-x);}
18 int add(int x,int val)
19 {
20     for(int i=x;i<=n;i+=lowbit(i)) c[i] ^= val;
21 }
22 int get(int x)
23 {
24     int ans = 0;
25     for(int i=x;i;i-=lowbit(i)) ans ^= c[i];
26     return ans;
27 }
28 
29 int main()
30 {
31     cin >> n;
32     for(int i=1;i<=n;i++) scanf("%d",&a[i]),pre[i] = pre[i-1] ^ a[i];
33     cin >> m;
34     for(int i=1;i<=m;i++)
35     {
36         int l,r;
37         scanf("%d%d",&l,&r);
38         query[r].push_back(pii(l,i));
39     }
40     map<int,int> pos;
41     for(int i=1;i<=n;i++)
42     {
43         if(pos[a[i]]) add(pos[a[i]],a[i]);
44         add(i,a[i]);
45         pos[a[i]] = i;
46         for(int j=0;j<query[i].size();j++)
47         {
48             pii Q = query[i][j];
49             int L = Q.first, R = i;
50             int id = Q.second;
51             ans[id] = pre[R] ^ pre[L-1] ^ get(R) ^ get(L-1);
52         }
53     }
54     for(int i=1;i<=m;i++) printf("%d
",ans[i]);
55     return 0;
56 }
D
原文地址:https://www.cnblogs.com/zzyDS/p/6390716.html