2020 CCPC-Wannafly Winter Camp Day6 (Div.1&2) H. 异或询问


思路: 根据异或的性质,可以把 l r i x \sum_l^r i \oplus x lrix划分成一些连续的区间,对每个区间计算答案。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
int a[N],n,q;
int b[N];
LL sum[N];
int len;
LL qc[N];
const LL mod =998244353;
void init(){
  sort(a+1,a+1+n);
  for(int i=1;i<=n;i++)b[i]=a[i];
  len=unique(b+1,b+1+n)-b-1;
  for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+1+len,a[i])-b;
  for(int i=1;i<=n;i++){
    sum[a[i]]++;
  }
  for(int i=1;i<len;i++){
    sum[i]=(0ll+sum[i-1]+sum[i])%mod;
    qc[i]=(1ll*sum[i]*sum[i]%mod*(b[i+1]-b[i])%mod+qc[i-1])%mod;
  }
  sum[len]+=sum[len-1];
  sum[len]%=mod;
}
LL f(int r){
  int x=upper_bound(b+1,b+1+len,r)-b-1;
  if(!x)return 0;
  LL res=qc[x-1];
  return (res+sum[x]*sum[x]%mod*(r-b[x]+1)%mod)%mod;
}
LL g(int l,int r){
  return (f(r)-f(l-1)+mod)%mod;
}
LL get(int r,int x){
  if(r<0)return 0;
  LL tot=0;
  int res=0;
  for(int i=30;~i;i--){
    if(r&(1<<i)){
        if(!(x&(1<<i))){
          tot+=g(res,res+(1<<i)-1);
          res|=(1<<i);
        }else{
          tot+=g(res|(1<<i),(res|(1<<i))+(1<<i)-1);
        }
    }else{
      if((1<<i)&x)res|=(1<<i);
    }
    tot%=mod;
  }
  tot+=g(res,res);
  tot%=mod;
  return tot;
}
int main() {
  ios::sync_with_stdio(false);
  cin>>n>>q;
  for(int i=1;i<=n;i++)cin>>a[i];
  init();
  for(int i=1;i<=q;i++){
    int l,r,x;
    cin>>l>>r>>x;
    cout<<(get(r,x)-get(l-1,x)+mod)%mod<<'\n';
  }
  return 0;
}
全部评论

相关推荐

04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务