Loj#510-「LibreOJ NOI Round #1」北校门外的回忆【线段树】

正题

题目链接:https://loj.ac/p/510


题目大意

给出一个代码

function add(x,v)while x <= n dos[x] = s[x] xor vx = x + lowbit(x) //注意,这里是 lowbit,这也是两份代码唯一的区别end while
end functionfunction query(x)ans = 0while x > 0 doans = ans xor s[x]x = x - lowbit(x)end whilereturn ans
end function

其中lowbit(x)\text{lowbit(x)}lowbit(x)表示xxxKKK进制下最低非零位的值。

现在给出n,q,Kn,q,Kn,q,Kqqq次调用add(x,v)add(x,v)add(x,v)或者query(x)query(x)query(x)

要求输出每次query(x)query(x)query(x)调用的值。

1≤n≤109,2≤q,K≤2×1051\leq n\leq 10^9,2\leq q,K\leq 2\times 10^51n109,2q,K2×105


解题思路

注意到询问的时候我们是可以一位一位的做的,主要是修改的时候。

我们先默认最低非零位就是个位,那么相当于每次x=x+x%Kx=x+x\% Kx=x+x%K直到x∣Kx|KxK,如果只考虑个位的情况,也可以视为每次x=2x%Kx=2x\% Kx=2x%K

首先每个数只有两种到达它的情况,一个是x2\frac{x}{2}2x,另一个是x+K2\frac{x+K}{2}2x+K,那么如果KKK是奇数的话,这两个中恰好有一个是整数,也就是每个数字的入边都是111,出边也是111,所以最终图肯定会形成若干个环。

那么考虑KKK不是奇数的情况,如果xxx222质因子个数不少于KKK的,那么它们则可以表示为x2p\frac{x}{2^p}2pxK2p\frac{K}{2^p}2pK,这样的话KKK又是奇数了,也会构成环。

否则xxx一直乘二直到质因子个数不少于KKK,也就是说这种情况走不超过log⁡K\log KlogK步就一定能到达一个环或者000

那么我们就是先分位计算,最低位不在环上就暴力跳,在环上就考虑维护。

现在主要是环上怎么维护的问题,同一个最低位上,对于一个修改xyxyxy(个位是yyy,剩下的位是xxx),会影响一个询问x′y′x'y'xy的条件。

我们需要找到一个不关于这些点的个位的条件,那么我们就考虑对于每个环定义一个点作为环头,然后所有的操作询问都移动到环头上搞。

然后我们把每个修改拆成修改位置到环头一段和从环头开始不停绕环的一段,

那么第一个的一个限制是询问位置要在它后面并且它们都反着退到环头后值相等,可以用线段树维护位置关系。

第二个先把询问倒着移动到环头,那么限制就是它们对于环上进位次数和的余数相等并且询问的值大于修改的值,可以用权值线段树维护。

时间复杂度:O(Klog⁡2n)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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用EFCore Lazy Loading实现Entity Split

α角 与 β角支持 现实生活 的 计算机系统&#xff0c;总有着两大偏差&#xff0c;第一个是 现实生活 与 计算机系统 的α角&#xff0c;另外一个是计算机系统的 逻辑设计 与 物理设计 的β角。举个栗子&#xff1a;α角&#xff1a;假设某个公司的商业流程&#xff0c;我们在做…

CodeForces:372(div1)div373(div2)

文章目录前言CF373A Collecting Beats is FunDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF373B Making Sequences is FunDescription\text{Description}DescriptionSolution\text{Solution}SolutionCF372A Counting Kangaro…

一二三系列之CodeChef分块——Chef and Churu,Chef and Problems,Children Trips

文章目录Chef and ChurusourcesolutioncodeChef and ProblemssourcesolutioncodeChildren TripssourcesolutioncodeChef and Churu source solution 对于单独的iii&#xff0c;查询可以用线段树/树状数组O(nlog⁡n)O(n\log n)O(nlogn)&#xff0c;这暗示可以平衡查询修改次数…

Bob‘s Problem

Bob’s Problem 题意&#xff1a; 一个有n个点的图&#xff0c;其中边分为白色和黑色&#xff0c;每个边都有边权&#xff0c;所选白边的数量的数量不能超过k&#xff0c;问现在选择一些边&#xff0c;使得所有点连通&#xff0c;问最大权值是多少&#xff1f; 题解&#xf…

.NET Core 开源项目 Anet 在路上

今天给大家介绍我刚开源的一个 .NET Core 项目&#xff1a;Anet。Anet 的目标是实现一个 .NET Core 通用库、通用框架和通用模板。我给它的定义是&#xff1a;A .NET Core Common Lib, Framework and Boilerplate.它的取名正是来自于这句话的前面四个字母&#xff1a;ANET。Ane…

Loj#2324-「清华集训 2017」小 Y 和二叉树

正题 题目链接:https://loj.ac/p/2324 题目大意 给出nnn个点的一棵树&#xff0c;每个点的度数不超过333。 你要求它的一个二叉树结构&#xff08;根任意选择&#xff09;使得其中序遍历的字典序最小。 1≤n≤1061\leq n\leq 10^61≤n≤106 解题思路 直接找根感觉比较麻烦&…

模板:后缀自动机(SAM)

所谓后缀自动机&#xff0c;就是通过后缀建立的自动机 &#xff08;逃&#xff09; 请允许我先介绍一下后缀家族&#xff1a; &#xff08;又逃&#xff09; 前言 OI生涯目前为止学习的最为难以理解的算法&#xff0c;没有之一。 到现在也没有完全的理解。 qwq 概念 定义&…

.NET 开源项目 Anet 介绍

使用 Anet 有一段时间了&#xff0c;已经在我的个人网站&#xff08;如 bookist.cc&#xff09;投入使用&#xff0c;目前没有发现什么大问题&#xff0c;所以才敢写篇文章向大家介绍。GitHub 地址&#xff1a;https://github.com/anet-team/anetAnet 是一个 .NET Core 通用框架…

线性代数问卷调查反馈——Find The Determinant III,Takahashi‘s Basics in Education and Learning

文章目录Find The Determinant IIIsourcecodeTakahashis Basics in Education and LearningsourcecodeFind The Determinant III source 高斯消元求行列式的模板题 code #include <cstdio> #include <iostream> using namespace std; #define maxn 205 #define…

L - Who is the Champion

L - Who is the Champion 计蒜客 - 42587 题意&#xff1a; 给出一个N阶矩阵&#xff0c;&#xff08; i , j &#xff09; &#xff08;i, j&#xff09;&#xff08;i,j&#xff09;处的数字表示这场比赛球队i ii踢进球队j jj多少球。两支球队平局则各加一分&#xff0c;一…

CF1037H Security(SAM)

解析 算是一个比较高级的SAM的应用了 对fail树的dfs序建立维护右端点最大值的线段树 考虑把所有的询问离线&#xff0c;按照右端点排序 每次动态把当前询问右端点左侧的前缀插入线段树 处理询问时&#xff0c;先贪心的尝试和询问串填法一样&#xff0c;如果不行就往下一个字母…

AT5147-[AGC036D]Negative Cycle【dp,模型转换】

正题 题目链接:https://www.luogu.com.cn/problem/AT5147 题目大意 有nnn个点的一张图&#xff0c;其中i→i1(i<n)i\rightarrow i1(i< n)i→i1(i<n)有一条边权值为000。 对于其他i,j(i≠j)i,j(i\neq j)i,j(ij)存在一条边i→ji\rightarrow ji→j&#xff0c;若i&l…

栈/队列/分块问卷调查反馈——Weak in the Middle,Cutting Plants,最小公倍数

文章目录Weak in the MiddlesourcesolutioncodeCutting Plantssourcesolutioncode[HNOI2016]最小公倍数sourcesolutioncodeWeak in the Middle source solution 栈模拟。 天数的计算&#xff0c;可以发现与其参与三元比较的次数有关 对于栈顶&#xff0c;如果被弹出&#…

我的十年创业路

记十年创业的心路历程和我的创业思辨导读1 为什么写这篇文章2 详细的总结和思辨 2.01 感恩 2.02 为什么创业 2.03 十年流水账 2.04 经历了哪些失败 2.05 重要的职场基础 2.06 持续的学习和进步 2.07 创业与兴趣 2.08 价值观的碰撞和选择 2.09 合作与…

C - And and Pair

C - And and Pair 题意&#xff1a; 问有多少组(i,j)满足要求。 要求为&#xff1a; 0<j<i<n i&ni i&j0 答案mod 1e97 题解&#xff1a; 这个和我的思路时一样的&#xff0c;且讲的更清楚 i&ni说明n为0的地方&#xff0c;i必须为0&#xff1b;n为1的地…

CF850F Rainbow Balls(数学、期望)

解析 二倍相邻项&#xff0c;就要想裂项 纯数学题 一道黑色的小凯的疑惑 设总球数为 sss 我们先钦定一种颜色留到最后&#xff0c;那么其他颜色可以等价考虑 设 fif_{i}fi​ 为钦定的颜色的球有 iii 个&#xff0c;涂完需要的期望次数 则有&#xff1a; fi(fi−1fi1)pfi(1−2p…

pjudge#21652-[PR #4]到底有没有九【数位dp】

正题 题目链接:http://pjudge.ac/problem/21652 题目大意 给出一个正整数kkk&#xff0c;求第nnn个xxx满足x(10k−1)x\times (10^k-1)x(10k−1)中没有一个数位为999。 1≤n≤1018,1≤k≤181\leq n\leq 10^{18},1\leq k\leq 181≤n≤1018,1≤k≤18 解题思路 首先是从高位到低…

专题突破二之优先队列、st表——,Running Median,Sequence,Buy Low Sell High,数据备份,超级钢琴,ZQC的手办

文章目录Running MedianSequenceBuy Low Sell High[APIO/CTSC 2007] 数据备份[NOI2010] 超级钢琴「LibreOJ β Round」ZQC 的手办Running Median source 对顶栈 用大根堆和小根堆一起维护 若元素小于等于大根堆栈顶&#xff0c;放入大根堆否则放入小根堆 大根堆维护的就是…

G - Eating Plan

G - Eating Plan 题意&#xff1a; 一个1到n组成的排列&#xff0c;每个数的价值为其阶乘&#xff0c;有m个询问ki&#xff0c;要求你在排列中选取连续的一块&#xff0c;使得价值和mod 998857459 后&#xff0c;大于ki&#xff0c;问最短区间长度&#xff0c;如果不存在输出…

P4770:你的名字(SAM、线段树合并)

文章目录前言解析前言 1000A快乐&#xff01;&#xff01;&#xff01;awa 没有想象中的那么恶心。 解析 先考虑每次都询问 [1,n][1,n][1,n] 如何做。 正难则反&#xff0c;用T所有本质不同串数量减去是S串子串又是T的子串的数量 前者很好求&#xff0c;关键是后者 首先可以…