当前位置:网站首页>Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】
Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】
2022-07-15 16:06:00 【QuantAsk】
正题
题目链接:https://loj.ac/p/510
题目大意
给出一个代码
function add(x,v)
while x <= n do
s[x] = s[x] xor v
x = x + lowbit(x) //注意,这里是 lowbit,这也是两份代码唯一的区别
end while
end function
function query(x)
ans = 0
while x > 0 do
ans = ans xor s[x]
x = x - lowbit(x)
end while
return ans
end function
其中 lowbit(x) \text{lowbit(x)} lowbit(x)表示 x x x在 K K K进制下最低非零位的值。
现在给出 n , q , K n,q,K n,q,K, q q q次调用 a d d ( x , v ) add(x,v) add(x,v)或者 q u e r y ( x ) query(x) query(x)。
要求输出每次 q u e r y ( x ) query(x) query(x)调用的值。
1 ≤ n ≤ 1 0 9 , 2 ≤ q , K ≤ 2 × 1 0 5 1\leq n\leq 10^9,2\leq q,K\leq 2\times 10^5 1≤n≤109,2≤q,K≤2×105
解题思路
注意到询问的时候我们是可以一位一位的做的,主要是修改的时候。
我们先默认最低非零位就是个位,那么相当于每次 x = x + x % K x=x+x\% K x=x+x%K直到 x ∣ K x|K x∣K,如果只考虑个位的情况,也可以视为每次 x = 2 x % K x=2x\% K x=2x%K。
首先每个数只有两种到达它的情况,一个是 x 2 \frac{x}{2} 2x,另一个是 x + K 2 \frac{x+K}{2} 2x+K,那么如果 K K K是奇数的话,这两个中恰好有一个是整数,也就是每个数字的入边都是 1 1 1,出边也是 1 1 1,所以最终图肯定会形成若干个环。
那么考虑 K K K不是奇数的情况,如果 x x x的 2 2 2质因子个数不少于 K K K的,那么它们则可以表示为 x 2 p \frac{x}{2^p} 2px和 K 2 p \frac{K}{2^p} 2pK,这样的话 K K K又是奇数了,也会构成环。
否则 x x x一直乘二直到质因子个数不少于 K K K,也就是说这种情况走不超过 log K \log K logK步就一定能到达一个环或者 0 0 0。
那么我们就是先分位计算,最低位不在环上就暴力跳,在环上就考虑维护。
现在主要是环上怎么维护的问题,同一个最低位上,对于一个修改 x y xy xy(个位是 y y y,剩下的位是 x x x),会影响一个询问 x ′ y ′ x'y' x′y′的条件。
我们需要找到一个不关于这些点的个位的条件,那么我们就考虑对于每个环定义一个点作为环头,然后所有的操作询问都移动到环头上搞。
然后我们把每个修改拆成修改位置到环头一段和从环头开始不停绕环的一段,
那么第一个的一个限制是询问位置要在它后面并且它们都反着退到环头后值相等,可以用线段树维护位置关系。
第二个先把询问倒着移动到环头,那么限制就是它们对于环上进位次数和的余数相等并且询问的值大于修改的值,可以用权值线段树维护。
时间复杂度: O ( K log 2 n ) O(K\log^2 n) O(Klog2n)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=2e5+10,M=N<<7;
int n,q,K,cnt,lg[N],id[N],sum[N],noe[N],dis[N],len[N];
map<pair<int,int> ,int>rt[40],Rt[40];
map<int,int> g;
struct SegTree{
int cnt,w[M],ls[M],rs[M];
void Change(int &x,int L,int R,int pos,int val){
if(pos<L||pos>R)return;
if(!x)x=++cnt;w[x]^=val;
if(L==R)return;int mid=(L+R)>>1;
if(pos<=mid)Change(ls[x],L,mid,pos,val);
else Change(rs[x],mid+1,R,pos,val);
return;
}
int Ask(int x,int L,int R,int l,int r){
r=min(r,R);l=max(l,L);
if(l>r||!w[x])return 0;
if(L==l&&R==r)return w[x];
int mid=(L+R)>>1;
if(r<=mid)return Ask(ls[x],L,mid,l,r);
if(l>mid)return Ask(rs[x],mid+1,R,l,r);
return Ask(ls[x],L,mid,l,mid)^Ask(rs[x],mid+1,R,mid+1,r);
}
}T;
void dfs(int x,int pos,int one,int fr){
if(id[x]){
sum[fr]=one;return;}
noe[x]=one;id[x]=fr;dis[x]=pos;len[fr]++;
dfs(x*2%K,pos+1,one+(x*2>=K),fr);
return;
}
int main()
{
scanf("%d%d%d",&n,&q,&K);
for(int i=1;i<=K;i++)
if(i%2==0)lg[i]=lg[i/2]+1;
for(int i=1;i<K;i++)
if(lg[i]>=lg[K]&&!id[i])
++cnt,dfs(i,0,0,cnt);
while(q--){
int op;scanf("%d",&op);
if(op==1){
int x,w,i=0,pw=1;
scanf("%d%d",&x,&w);
while(x*pw<=n){
int p=x%K,y=x/K;
while(p&&x*pw<=n){
if(lg[p]>=lg[K]){
T.Change(rt[i][mp(id[p],y-noe[p])],0,len[id[p]]-1,dis[p],w);
T.Change(Rt[i][mp(id[p],(y-noe[p]+sum[id[p]])%sum[id[p]])],0,n/pw/K,y+sum[id[p]]-noe[p],w);
x=0;break;
}
else g[x*pw]^=w,x+=x%K,p=x%K,y=x/K;
}
if(!x||x*pw>n)break;
x=x/K;pw=pw*K;i++;
}
}
else{
int x;scanf("%d",&x);
int i=0,pw=1,ans=0;
while(x){
int p=x%K,y=x/K;
if(p!=0){
if(lg[p]>=lg[K]){
ans^=T.Ask(rt[i][mp(id[p],y-noe[p])],0,len[id[p]]-1,0,dis[p]);
ans^=T.Ask(Rt[i][mp(id[p],(y-noe[p]+sum[id[p]])%sum[id[p]])],0,n/pw/K,0,y-noe[p]);
}
else ans^=g[x*pw];
}
x/=K;i++;pw=pw*K;
}
printf("%d\n",ans);
}
}
return 0;
}
边栏推荐
- 【深度学习】YOLOv7速度精度超越其他变体,大神AB发推,网友:还得是你!|开源...
- SQL daily practice (Niuke new question bank) - day 2: condition query
- 哈工大讯飞联合实验室获得SemEval-2022最佳论文提名奖
- [dynamic planning] - state compression DP
- 3D reconstruction line structured light (1)
- Meiker Studio - liqinghao SQL statement notes
- If you don't want to step on those holes in SaaS, you must first understand the "SaaS architecture"
- Sql笔记
- Huawei cloud stack opens its framework to the south to help ecological partners enter the cloud efficiently
- Sword finger offer punch array and matrix
猜你喜欢

对话印奇:我们所坚持的不会改变,旷视跳出企业科研“周期律”

在线问题反馈模块实战(三):自动生成所有Controller、Service、Mapper等文件

Pychart tutorial: 5 very useful tips

3D reconstruction line structured light (1)
![[dynamic planning] - digital statistics DP](/img/cc/86d961150a4d163b846191ae6ac733.png)
[dynamic planning] - digital statistics DP

The data transmission mode and online monitoring management system of multi-channel vibrating wire wireless acquisition instrument for engineering monitoring instruments
![[dynamic planning] - state compression DP](/img/26/a713f5606b915cb4bb69b23a6a0748.png)
[dynamic planning] - state compression DP

OpenGL learning (I) understanding OpenGL and various libraries

i7-12700H 和 R7-6800H,这两个 CPU 差距有多大?

xiamarin整合Braze实现送信和端末通知
随机推荐
【用户文章】P4合并实践指南之实例拆解Resolve
裁员吵架散摊子, 马斯克:我太难了;狠心开源了一个舆情获取项目;取特征工程跟调参一样简单了?!NeRF大佬直呼卷不动了;前沿论文 | ShowMeAI资讯日报
海外休闲游戏的网络连接方案
The software supply chain security risk that makes enterprise digitalization and it executives bear the brunt of the cauldron points to the north
SQL daily practice (Niuke new question bank) - day 2: condition query
代码合规性:开发人员使用Helix QAC的5大原因
Qdu summer training - warm up match
抢先体验! 在浏览器里写 Flutter 是一种什么体验?
Beihang & Institute of Information Technology & meituan proposed lbdt, which is based on spatiotemporal interaction of language bridging to accurately segment directional video objects, with performan
运维-技能大杂烩
vi编辑器命令
Where can I find the computer network speed detection
网上开期货账户安全不安全?
单视图重构—影消点、影消线与相机内参、平面法向量的推导
Dimitra and ocean protocol interpret the secrets behind agricultural data
利用 JMeter 压测上传和下载接口实战
Network connection scheme of overseas leisure games
A new UI testing method: visual perception test
Using JMeter pressure test upload and download interface practice
Huawei cloud stack opens its framework to the south to help ecological partners enter the cloud efficiently