「LibreOJ β Round #2」计算几何瞎暴力
https://loj.ac/problem/517
题解
首先我们如果没有排序这个骚操作的话,可以直接记一下各个数位的前缀和,然后异或标记给全局打,查询的时候先把区间信息提取出来然后整体异或就好了。
对于排序,我们考虑对所有排好序的节点建\(trie\)树,这样即使有全局异或标记,我们也可以在\(trie\)树上完成前缀信息的查询。
然后就做完了。
代码
#include<bits/stdc++.h>
#define N 200009
#define ls ch[cnt][0]
#define rs ch[cnt][1]
using namespace std;
typedef long long ll;
const int maxn=30;
int a[N],n,q;
int ch[N*maxn][2],ct[N*maxn][maxn],size[N*maxn],sm[N][maxn];
int tot,rot;
int tag,nowtag;
ll ton[32],nw;
inline ll rd(){ll x=0;char c=getchar();bool f=0;while(!isdigit(c)){if(c=='-')f=1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}return f?-x:x;
}
void ins(int &cnt,int x,int p){if(!cnt)cnt=++tot;size[cnt]++;for(int i=0;i<=29;++i)if((1<<i)&x)ct[cnt][i]++;if(p<0)return;int o=(x&(1<<p))!=0;if(o)ins(rs,x,p-1);else ins(ls,x,p-1);
}
inline ll getsum(int now){memset(ton,0,sizeof(ton));if(now>=nw){for(int i=0;i<=29;++i)ton[i]+=sm[now][i];}else{int cnt=rot,siz=now;for(int i=29;i>=0;--i){int lson=ls,rson=rs;if(nowtag&(1<<i))swap(lson,rson);if(size[lson]>=siz)cnt=lson;else{for(int j=0;j<=29;++j)ton[j]+=ct[lson][j];siz-=size[lson];cnt=rson;}}if(siz){for(int i=0;i<=29;++i)ton[i]+=(ct[cnt][i]!=0)*siz;}}ll ans=0;for(int i=0;i<=29;++i){ll ss;if(tag&(1<<i))ss=now-ton[i];else ss=ton[i];// cout<<ss<<" ";ans+=ss*(1ll<<i);}//cout<<"??\n";return ans;
}
int main(){
// freopen("1.txt","r",stdin);
// freopen("out","w",stdout);n=rd();nw=1;for(int i=1;i<=n;++i){a[i]=rd();for(int j=0;j<=29;++j)sm[i][j]=sm[i-1][j]+((a[i]&(1<<j))!=0);}q=rd();int opt,x,l,r;while(q--){opt=rd();if(opt==1){x=rd();x^=tag;++n;a[n]=x;for(int j=0;j<=29;++j)sm[n][j]=sm[n-1][j]+((a[n]&(1<<j))!=0);}else if(opt==2){l=rd();r=rd();printf("%lld\n",getsum(r)-getsum(l-1));}else if(opt==3)tag^=rd();else if(opt==4){nowtag=tag;while(nw<=n)ins(rot,a[nw],29),nw++;}}return 0;
}
转载于:https://www.cnblogs.com/ZH-comld/p/11093089.html
「LibreOJ β Round #2」计算几何瞎暴力相关推荐
- [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
[LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机) 试题描述 IOI 的比赛开始了.Jsp 和 Rlc 坐在一个角落,这时他们听到了一个异样的声音 -- 接着他们发现自己收 ...
- 「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)
#572. 「LibreOJ Round #11」Misaka Network 与求和 推式子 ∑i=1n∑j=1nf(gcd(i,j))k∑d=1nf(d)k∑i=1nd∑j=1nd[gcd(i,j ...
- #530. 「LibreOJ β Round #5」最小倍数 二分 + 数论
传送门 文章目录 题意: 思路: 题意: 思路: 本来想刷数位dpdpdp,无意间碰到了这个题来水水. 我们知道n!n!n!中质因子ppp的个数为∑i=1npi\sum_{i=1} \frac{n}{ ...
- [LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)
#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一 ...
- LibreOJ545. 「LibreOJ β Round #7」小埋与游乐场【网络流】
545. 「LibreOJ β Round #7」小埋与游乐场 [题目描述] 传送门 [题解] 网络流,我们发现lowbit之后相同的点连出的边是相同的,所以可以缩点. [代码如下] #include ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
- LOJ #516. 「LibreOJ β Round #2」DP 一般看规律
题目描述 给定一个长度为 n 的序列 a,一共有 m 个操作. 每次操作的内容为:给定 x,y,序列中所有 x 会变成 y. 同时我们有一份代码: int ans = 2147483647; for ...
- loj534. 「LibreOJ Round #6」花团
题意 一个物品集合\(S\)初始为空,按时间递增顺序依次给出\(q\)次操作,操作如下: 1 v w e 表示在\(S\)中加入一个体积为\(v\)价值为\(w\)的物品,第\(e\)次操作结束之后移 ...
- 「LibreOJ β Round #4」子集
https://loj.ac/problem/526 题目描述 qmqmqm有一个长为 n 的数列 a1,a2,--,an,你需要选择集合{1,2,--,n}的一个子集,使得这个子集中任意两个元素 i ...
最新文章
- 空空排错日志:OCS错误日志14501等解决办法
- JAVA语法——汉诺塔问题
- 基于Ubuntu Hadoop的群集搭建Hive
- Angular compiler报的一个错误消息:Component XX is not part of any NgModule
- post 表单中常见的四种表单请求方式
- 测者的测试技术手册:揭开java method的一个秘密--巨型函数
- kernel shell bash简介
- 高等数学下-赵立军-北京大学出版社-题解-练习9.1
- C#取真实IP地址及分析
- 真正认识 realloc 的工作方式(转载)
- 各种格式PPC手机软件的安装方法
- java经纬度转平面坐标_经纬度到平面坐标的相互转换
- 关于新浪微博开放平台第三方登录接口问题
- BOTTON控件介绍及程序基本框架与皮肤自定义
- win7电脑无线网变身WiFi热点,让手机、笔记本共享上网
- 《魔鬼搭讪学》《魔鬼约会学》读后感
- py实现高斯列选主元消元法
- 工具分享:图片水印工具(WaterMarker)
- 【树莓派不吃灰】基础篇⑮ SSH远程访问安全,涉及/etc/hosts.allow白名单 和 /etc/hosts.deny黑名单、ufw防火墙、密钥登录
- BZOJ_P1123 [POI2008]BLO(无向图割点)