打卡2
Posted littlepear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打卡2相关的知识,希望对你有一定的参考价值。
这个题能改变成加法。
第三个while始终觉得区间变长了,看了一下午还是很难理解。
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 50; typedef long long ll; int a[maxn]; struct node { int l, r; int block; int id; }; node q[maxn]; bool cmp(node A, node B) { if(A.block == B.block) return A.r < B.r; else return A.l < B.l; } ll out[maxn]; int sum[maxn]; ll cnt[1 << 20]; int main() { int n, m, k; scanf("%d %d %d", &n, &m, &k); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); for(int i = 1; i <= n; i++) { sum[i] = sum[i - 1] ^ a[i]; } int block = sqrt(n); for(int i = 1; i <= m; i++) { scanf("%d %d", &q[i].l, &q[i].r); q[i].block = q[i].l / block; q[i].id = i; } sort(q + 1, q + m + 1, cmp); memset(cnt, 0, sizeof(cnt)); int l = 1, r = 0; ll ans = 0; cnt[0]++; for(int i = 1; i <= m; i++) { while(r < q[i].r) { r++; ans += cnt[sum[r] ^ k]; // printf("%d %d %d ", sum[r], sum[r] ^ k, cnt[sum[r] ^ k]); cnt[sum[r]]++; } //printf("%d ", ans); while(r > q[i].r) { cnt[sum[r]]--; ///先把我自己去掉,以免产生影响 ans -= cnt[sum[r] ^ k]; r--; } while(l < q[i].l) { cnt[sum[l - 1]]--; ///也是先把我自己去掉 ans -= cnt[sum[l - 1] ^ k]; l++; } while(l > q[i].l) { l--; ans += cnt[sum[l - 1] ^ k]; cnt[sum[l - 1]]++; } out[q[i].id] = (ans >= 0LL ? ans : 0LL); } for(int i = 1; i <= m; i++) { printf("%lld ", out[i]); } return 0; } /* 6 1 3 1 2 1 1 0 3 3 4 */
今天各种保研事情,没做上,明天继续补。
以上是关于打卡2的主要内容,如果未能解决你的问题,请参考以下文章