ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

联考20200525 T2 「雅礼集训 2018 Day7」B

2020-05-25 22:05:17  阅读:311  来源: 互联网

标签:include int Day7 T2 mid num 区间 now 联考


题目传送门

分析:
对于\(T_i=1\)的情况,对于\(S_{p+i} \not= T_i\),我们发现

\(S_{p+i}\in[0,c)\)
\(S_p\in[0-ai,c-ai)\)

对于\(T_i=0\)的情况,区间取个反就可以了
于是我们知道了对于每一个\(T_i\),能做出贡献的区间,做区间加
这个区间是取模意义下的,所以可能会是两个
动态开点线段树维护\(O(mlogn)\)(其实也可以离线\(O(mlogm)\),但是好麻烦就没有写了2333)
询问时的值直接单点求和就好了
当\(T_i\)取反时,把对应区间取反就好了

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<queue>
#include<algorithm>

#define maxn 100005
#define INF 0x3f3f3f3f

using namespace std;

inline int getint()
{
	int num=0,flag=1;char c;
	while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;
	while(c>='0'&&c<='9')num=num*10+c-48,c=getchar();
	return num*flag;
}

int n,m,a,b,c;
int Rt,lc[maxn<<6],rc[maxn<<6],sum[maxn<<6],tot;
int T[maxn];
int L[maxn],R[maxn];

inline void update(int &now,int l,int r,int ql,int qr,int num)
{
	if(qr<l||r<ql)return;
	if(!now)now=++tot;
	if(ql<=l&&r<=qr){sum[now]+=num;return;}
	int mid=(l+r)>>1;
	update(lc[now],l,mid,ql,qr,num),update(rc[now],mid+1,r,ql,qr,num);
}

inline int query(int now,int l,int r,int p)
{
	if(!now)return 0;
	if(l==r)return sum[now];
	int mid=(l+r)>>1;
	if(p<=mid)return sum[now]+query(lc[now],l,mid,p);
	else return sum[now]+query(rc[now],mid+1,r,p);
}

inline void solve(int i,int num)
{
	if(T[i])
	{
		if(L[i]<R[i])update(Rt,0,n-1,L[i],R[i]-1,num);
		else update(Rt,0,n-1,L[i],n-1,num),update(Rt,0,n-1,0,R[i]-1,num);
	}
	else
	{
		if(L[i]<R[i])update(Rt,0,n-1,0,L[i]-1,num),update(Rt,0,n-1,R[i],n-1,num);
		else update(Rt,0,n-1,R[i],L[i]-1,num);
	}
}

int main()
{
	n=getint(),a=getint(),b=getint(),c=getint(),m=getint();
	for(int i=0;i<m;i++)T[i]=(getchar()-48);
	L[0]=0,R[0]=c,solve(0,1);
	for(int i=1;i<m;i++)L[i]=(L[i-1]-a+n)%n,R[i]=(R[i-1]-a+n)%n,solve(i,1);
	int q=getint();
	while(q--)
	{
		int op=getint(),p=getint();
		if(op&1)
		{
			p=(1ll*a*p+b)%n;
			printf("%d\n",query(Rt,0,n-1,p));
		}
		else solve(p,-1),T[p]^=1,solve(p,1);
	}
}

标签:include,int,Day7,T2,mid,num,区间,now,联考
来源: https://www.cnblogs.com/Darknesses/p/12961101.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有