首页 > 其他分享 >P11071 「QMSOI R1」 Distorted Fate题解

P11071 「QMSOI R1」 Distorted Fate题解

时间:2024-11-13 12:08:34浏览次数:1  
标签:loc le R1 Fate int 题解 mid 维护 ql

题意:
给定一个序列,给定两种操作:

  1. 将一个区间异或上一个给定的值。

  2. 给定 \(l,r\) 求

\[{\large (\sum_{i=l}^r\bigcup_{j=l}^i A_j) \bmod 2^{30}} \]

\(0\le a_i,x< 2^{30}\),\(1\le l\le r\le n\)

思路

  • 由于操作数以及区间过大,一位一位地去模拟肯定是不行的。因此考虑去离线下来拆位,对于每一个操作的每一位单独维护贡献。

  • 由于是前缀或,因此对于每一位而言,只要有一个数在这一位上是1,那后面的所有值也一定都是1。
    因此问题就转化成了维护区间第一个1所在的位置,答案就是这个位置与右端点的距离。

  • 考虑如何去维护这个东西。显然去查找不可能直接找,需要去二分。但同时还要维护操作1,因此考虑用线段树去维护。
    那怎么在线段树上查找呢?考虑维护节点所代表的区间是不是全为零,如果全为零的话就向右儿子搜,否则向左儿子搜。
    但由于异或操作,还可以维护一个是否全是1方便修改。需要修改的时候将两个标记交换就可以了。

code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int p=1073741824;
const int N=2e5+7;
int n,m,a[N],loc;bool s1[N<<2],s2[N<<2],b[N],sign,tag[N<<2];
struct ques
{
	int opt,l,r,x;long long ans=0;
}q[N];
#define ls (u<<1)
#define rs ((u<<1)|1)
void push_up(int u)
{
	s1[u]=s1[ls]|s1[rs];s2[u]=s2[ls]|s2[rs];
}
void push_down(int u)
{
	if(!tag[u]) return;
	swap(s1[ls],s2[ls]),swap(s1[rs],s2[rs]);
	tag[ls]^=1,tag[rs]^=1;
	tag[u]=0;
}
void build(int u,int l,int r)
{
	tag[u]=0;if(l==r){s1[u]=b[l],s2[u]=b[l]^1;return;}
	int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);
	push_up(u);
}
void modify(int u,int l,int r,int ql,int qr)
{
	if(l>=ql&&r<=qr) {swap(s1[u],s2[u]),tag[u]^=1;return;}
	int mid=(l+r)>>1;push_down(u);
	if(mid>=ql) modify(ls,l,mid,ql,qr);if(mid<qr) modify(rs,mid+1,r,ql,qr);
	push_up(u);
}
void query(int u,int l,int r,int ql,int qr)
{
	if((!s1[u])||sign||r<ql||l>qr) return;
	if(l==r) {if(s1[u]&&l<loc&&l>=ql)loc=l,sign=1;return;}
	int mid=(l+r)>>1;push_down(u);
	if(mid>=ql) query(ls,l,mid,ql,qr);
	if(sign) return;
	if(mid<qr) query(rs,mid+1,r,ql,qr);
}
int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++) {cin>>q[i].opt>>q[i].l>>q[i].r;if(q[i].opt==1) cin>>q[i].x;}
	for(int k=0;k<=30;k++)
	{
		for(int i=1;i<=n;i++) b[i]=(a[i]>>k)&1;build(1,1,n);
		for(int i=1;i<=m;i++)
		{
			if(q[i].opt==1) {if(((q[i].x>>k)&1)==1) modify(1,1,n,q[i].l,q[i].r);}
			else
			{
				sign=0;loc=q[i].r+1;query(1,1,n,q[i].l,q[i].r);
				q[i].ans=(q[i].ans+1ll*(q[i].r-loc+1ll)*(1ll<<k)%p)%p;
			}
		}
	}
	for(int i=1;i<=m;i++) if(q[i].opt==2) cout<<q[i].ans<<'\n';
	return 0;
}

标签:loc,le,R1,Fate,int,题解,mid,维护,ql
From: https://www.cnblogs.com/allforgod/p/18543635

相关文章

  • [题解]CF1407D Discrete Centrifugal Jumps
    思路注意到第二个条件和第三个条件本质相似,可以用相同的维护方式处理,因此这个只讨论第二个条件的维护方式。定义\(dp_i\)表示走到\(i\)的最少步数。第一个条件的转移显然为\(dp_i\leftarrowdp_{i-1}\)。对于第二个条件,\(i\)能向\(j\)转移,当且仅当\(h_{i+1\sim......
  • Codeforces Round 985 div1+2 个人题解(A~E)
    CodeforcesRound985div1+2个人题解(A~E)Dashboard-Refact.aiMatch1(CodeforcesRound985)-Codeforces火车头#include<bits/stdc++.h>usingnamespacestd;#defineftfirst#definesdsecond#defineyescout<<"yes\n"#definenoc......
  • pytorch简单识别CIFAR10彩色图片的卷积神经网络
    环境:python3.11.10pytorch2.3.0一、前期准备1.设置GPUimporttorchimporttorch.nnasnnimportmatplotlib.pyplotaspltimporttorchvisiondevice=torch.device("cuda"iftorch.cuda.is_available()else"cpu")device2.导入数据使用dataset下载CI......
  • [CF1935E] Distance Learning Courses in MAC 题解
    [CF1935E]DistanceLearningCoursesinMAC难度正常的一道题。首先我们发现“挑选若干个区间”就是一句废话,因为按位或只会贡献答案而不会减小答案。所以我们需要在\([L,R]\)的每个区间都挑一个数,使得最终的按位或最大。想办法让尽可能多的二进制位都变成\(1\),且越是高......
  • [USACO06NOV] Corn Fields G 题解
    题目链接[USACO06NOV]CornFieldsG题解这是一道典型的状压dp,对于\(M\)行\(N\)列的图,由于每个点只有\(1\)和\(0\)两种状态,我们将其压缩为一个长度为\(M\)的数组,数组(\(g\))的每一项\(g_{i}\)表示状态的二进制表示法表示的数(如\(101\)表示为\(5\)),我们预先处......
  • [CEOI2023] A Light Inconvenience 题解
    Description今年CEOI的开幕式上有一场精彩的火炬表演。表演者们站成一排,从\(1\)开始从左往右编号。每个表演者举着一根火炬,初始只有一个举着点燃的火炬的表演者。表演分为\(Q\)幕。在第\(a\)幕开始之前,要么\(p_a>0\)个表演者从右侧加入表演,他们的火炬是熄灭的;要么最......
  • gym103102H AND = OR 题解
    非常巧妙的一个题。我们首先考虑单组询问该怎么做。首先需要注意到一个结论,即设答案为\(x\),那么对于\(\forally<x\),\(y\)都应该放在与组;同样的,对于\(\forally>x\),\(y\)都应该放在与组。进一步的,我们观察在\(\text{popcount}\)上也有同样的性质,即对于\(\forally,......
  • 好题记录 [集训队互测 2023] 优惠购物 题解
    首先发现这个过程的限制比较多,那么考虑重新描述这个过程。令\(x_i\)表示在第\(i\)个物品上使用了\(x_i\)张券,那么一组\(x_{1\simn}\)就描述了一个方案。方便起见,令\(s_i\)为前i个物品买完后剩了几张券,那么有:\(s_0=m\)\(s_i=s_{i-1}+\lfloor\frac{a_i-......
  • 【题解】洛谷P7287: 「EZEC-5」魔法
    P7287「EZEC-5」魔法感觉好题有思维,但是我没认真读题,看到样例就我以为了,他让任意一个区间满足大于\(S\)即可不是全部。我们手搓一下样例就可以发现,对于加法我们不加白不加的话肯定全部的数都加上,乘法肯定要等到加完后才开始,这些都是贪心思路。然后就是开始搭配操作了,我遇到......
  • 题解:「2017 山东一轮集训 Day7」逆序对
    LibreOJ6077前置知识:生成函数、组合数先考虑平方怎么做。\(f_{i,j}\)表示处理了前\(i\)个值,逆序对有\(j\)个。显然可以转移到\(f_{i+1,j},f_{i+1,j+1},f_{i+1,j+2},...,f_{i+1,j+i}\)。然后发现这个东西是个很简单的递推,而且长得很生成函数,于是可以很自然的写成\[1\t......