萌新刚学莫队 0.114514 秒,玄关求调!
查看原帖
萌新刚学莫队 0.114514 秒,玄关求调!
1296826
lcfollower楼主2024/8/28 14:50

rt,输出 2 1 4 2 1,交换奇偶顺序 4 2 1 2 1,过样例但是 0pts0\texttt{pts}。

#include<bits/stdc++.h>

# define int long long
# define rint register int
# define ME ;
# define AK 0
# define IOI return

inline int read();
inline void write(int x);
inline void writesp(int x);
inline void writeln(int x);

using namespace std;

const int N = 1e5 + 10 ,NUM = 2e5 + 10;
int n ,res ,Q ,k ,a[N] ,vis[NUM] ,ans[N] ,block[N];

struct queries{
  int l ,r ,id;
  inline bool operator <(const queries &b) const{
    return (block[l] ^ block[b.l] ? block[l] < block[b.l] : (block[l] & 1 ? r < b.r : r > b.r));
  }
}q[N];
inline void add(int x){
  //a[x]
  res += vis[a[x] ^ k];
  vis[a[x]] ++;
} inline void del(int x){
  vis[a[x]] --;
  res -= vis[a[x] ^ k];
} signed main(){
  n = read() ,Q = read() ,k = read();
  for(rint i = 1; i <= n;i ++)
    a[i] = read() ,a[i] ^= a[i - 1];
  int len = N / sqrt(Q);
  for(rint i = 1 ;i <= n;i ++) block[i] = (i - 1) / len + 1;
  for(rint i = 1 ;i <= Q;i ++){
    q[i].l = read() ,q[i].r = read();
    q[i].id = i;
  } sort(q + 1, q + 1 + Q);
  int l = 0 ,r = 0;
  vis[0] = 1;
  for(rint i = 1 ; i <= Q; i ++){
    q[i].l --;
    while(l > q[i].l) add(-- l);
    while(r < q[i].r) add(++ r);
    while(l < q[i].l) del(l ++);
    while(r > q[i].r) del(r --);
    ans[q[i].id] = res;
  } for(rint i = 1; i <= Q;i ++) writeln(ans[q[i].id]);
  IOI AK ME
}



inline int read(){
  int s = 0 ,w = 0;
  char c = getchar();
  while(!isdigit(c)){
    w |= (c == '-');
    c = getchar ();
  } while(isdigit(c)){
    s = (s << 1) + (s << 3) + (c ^ 48);
    c = getchar();
  } return w ? -s : s;
} inline void write(int x){
  if(x < 0) x = -x ,putchar('-');
  if(x > 9) write(x / 10);
  putchar(x % 10 | 48);
} inline void writesp(int x){
  write(x) ,putchar(' ');
} inline void writeln(int x){
  write(x) ,putchar('\n');
}
2024/8/28 14:50
加载中...