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\n",(double)w / u); 26 else printf("%.15f\n",ans); 27 return 0; 28 }
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\n",ans[i]); 55 return 0; 56 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步