首页 > 其他分享 >题解:B3646 数列前缀和 3

题解:B3646 数列前缀和 3

时间:2024-07-17 17:10:17浏览次数:12  
标签:ch 前缀 int 题解 mid ans ask B3646

分析

板子题,线段树维护矩阵区间积,除了难写没什么思维难度。

所以直接放代码吧。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return x*f;
}
const int maxn=1e6+10;
const int mod=1145141;
int n,Q,ans=0,k;
struct no
{
	int num[4][4];
	int* operator [] (int i) 
	{
		return num[i]; 
	}
	no()
	{
		memset(num,0,sizeof num);
		for(int i=1;i<=k;i++)
		{
			num[i][i]=1;
		}
	}
	inline void _read()
	{
		for(int i=1;i<=k;i++)
		{
			for(int j=1;j<=k;j++)
			{
				num[i][j]=read();
			}
		}
	}
	inline void clear()
	{
		memset(num,0,sizeof num);
	}
	inline friend no operator * (no aa,no b)
	{
		no c;
		c.clear();
		for(int i=1;i<=k;i++)
		{
			for(int j=1;j<=k;j++)
			{
				for(int q=1;q<=k;q++)
				{
					c[i][j]=(c[i][j]+aa[i][q]*b[q][j]%mod)%mod;
				}
			}
		}
		return c;
	}
	inline int xor_()
	{
		int res=0;
		for(int i=1;i<=k;i++)
		{
			for(int j=1;j<=k;j++)
			{
				res=res^num[i][j];
			}
		}
		return res;
	}
}a[maxn];
struct Segment_Tree
{
	int l,r;
	no d;
}t[2001000];
void build(int p,int l,int r)
{
	t[p].l=l,t[p].r=r;
	if(l==r)
	{
		t[p].d=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].d=t[p*2].d*t[p*2+1].d;
}
no ask(int p,int l,int r)
{
	if(t[p].l>=l&&t[p].r<=r)return t[p].d;
	int mid=(t[p].l+t[p].r)>>1;
	no ans;
	if(mid>=l)ans=ans*ask(p*2,l,r);
	if(mid<r)ans=ans*ask(p*2+1,l,r);
	return ans;
}
signed main()
{
	cin>>n>>k>>Q;
	for(int i=1;i<=n;i++)
	{
		a[i]._read();
	}
	build(1,1,n);
	while(Q--)
	{
		int l=read(),r=read();
		no z=ask(1,l,r);
		ans=ans^z.xor_();
	}
	cout<<ans;
	return 0;
}

标签:ch,前缀,int,题解,mid,ans,ask,B3646
From: https://www.cnblogs.com/fengyixuan2027/p/18307834

相关文章

  • Masked Popcount 题解
    背景罚了一发,太菜了。为什么我终于有时间的时候她要考试?题意给你\(n,m\),问\(\sum_{i=0}^{n}popcount(i\&m)\)。其中\(\&\)代表位运算,\(popcount\)代表一个数字二进制下\(1\)的个数。分析两个数字在二进制下根据数据范围有\(60\)位。所以我们考虑每一位对答案的贡......
  • 题解:AT_abc359_c [ABC359C] Tile Distance 2
    背景去中考了,比赛没打,来补一下题。分析这道题让我想起了这道题(连题目名称都是连着的),不过显然要简单一些。这道题显然要推一些式子。我们发现,和上面提到的那道题目一样,沿着对角线走台阶,纵坐标走到以后再走横坐标显然是最优策略。这时候的答案就是横纵坐标差的和的一半(这就不用......
  • 题解:AT_abc357_f [ABC357F] Two Sequence Queries
    题意维护一个数据结构,支持两个数列的区间求和,和查询区间内两数列各元素积的和。分析线段树万岁!这道题要维护两个序列,所以线段树中要同时存储两个区间和。但还要在维护一个信息,是该区间内两序列元素积的和。大概长这样:structno{ intl,r; intda,db,ab; intta,tb;}t[m......
  • ABC357-C题解
    最近一直掉分,谔谔。分析发现机房里面除了我以外都用递归写的,那我就来讲一种非递归的吧。考虑第\(i\)级地毯拆成九块以后其实就是八块第\(i-1\)级地毯与一块大小为\(3^{i-1}\times3^{i-1}\)大小的白色地毯。所以用一个三维数组记录每一级地毯的状态,然后循环往上跑,每一级......
  • 题解:P10417 [蓝桥杯 2023 国 A] 第 K 小的和
    分析这道题不是板子么。先对序列排序,然后二分答案,设当前答案为\(x\),枚举\(a\)中的数,然后二分查找\(b\)中不大于\(x-a\)的元素个数,累加判断是否不大于\(k\)。然后稍微调一调端点就过了。Code#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#incl......
  • 题解:AT_abc359_e [ABC359E] Water Tank
    背景中考结束了,但是暑假只有一天,这就是我现在能在机房里面写题解的原因……分析这道题就是个单调栈。题目上问你第一滴水流到每个位置的时间。我们考虑,答案其实就是比当前木板高且距离当前木板最近的那一个位置的答案加上当前木板的高度与那一个位置的距离构成的矩形面积再减......
  • 题解:P10672 【MX-S1-T1】壁垒
    暑期集训=依托答辩。分析种类数是奇数一定无解。否则每种数字先输出一次,在此过程中每增加两个数时,因为每个数字种类数都不一样,所以前缀种类数也同时增加\(2\),保证一定为偶数。然后输出完以后,设总种类数为\(m\),无论以后再怎么加入新数字,前缀种类数一定为\(m\)不变,后面数字......
  • 题解:AT_arc173_b [ARC173B] Make Many Triangles
    背景前几天打了比赛,崩麻了,所以来水一篇题解。LC真睿智题意给你\(n\)个点,问最多能组成几个三角形。分析听说可以随机化。这道题就是一个简单贪心。我们考虑,如果没有共线的点,那么答案显然就是\(\frac{n}{3}\)了。如果有共线,我们容易想到一个贪心思路:既然同一直线上的点不......
  • Divide Interval 题解
    背景太逊了,调了三次才调出来,所以写篇题解寄念。LC好睿智题意给你两个数\(a,b\),现在要从\(a\)跑到\(b\),每次可以将当前的\(a\)拆分成\(2^n\timesm(n,m\inN)\)的形式,并将它变成\(2^n\times(m+1)\)。问最少变几次能跑到\(b\),输出次数和每次变化前后\(a\)的值。分......
  • 题解:AT_abc352_d [ABC352D] Permutation Subsequence
    虽然比赛没打,但是想来水估值发表思路。题意给你一个\(1\simn\)的排列,让你从中找一段长为\(k\)的子序列,使得这个子序列中的元素排序后数值连续。分析题意转换一下,先用结构体存储每个元素的编号和数值,按照数值排序。于是这道题就成了:一个序列,让你求所有长\(k\)的子段中......