牛客想开了大赛2——C

 

 链接:原题题址

题目描述

Rabbit得到了一个长度为N的数列(数列编号从0到N−1)。数列中每个数vali满足1<=vali<=C。
初始时数列中每个数均为1,现在Rabbit要对这个数列进行Q次操作,每次操作给出四个数:X Y A B,首先查询数列中值为X的个数P,然后计算出L,R:
L=(A+(P+B)2)mod N
R=(A+(P∗B)2)mod N
并将范围[min(L,R),max(L,R)]内的所有数改为Y。
最后询问经过Q次操作后数列中出现次数最多的那个数出现了几次。 
 

输入描述:

第一行三个整数N,C,Q。

接下来Q行,每行四个整数X,Y,A,B,表示一个操作。

输出描述:

输出一个整数,表示经过Q次操作后数列中出现次数最多的那个数出现的次数。

示例1

输入

 

4 2 1
2 2 1 1

输出

 

2

备注:

1<=N,C,Q<=10^5

1<=X,Y<=C,1<=A,B<=10^8

A,B通过随机产生

 

 

 

 我想说说,这题的区间维护方式,不由地让我想起了线段树,当我pie见了AC代码的那个千言万语道不尽的懒标记和线段树的标准的k<<2和k<<2|1时,我果断关掉网页,自己不停地修改线段树的板子,但依旧是“红橙作伴”,忍不住又打开了一个网页,才恍然明白,要是维护的是单点值而不维护区间最值的话,不超时才怪。(代码不是本人原创,要我写肯定不会这么清楚,注释还得稍稍加一下吧,这个代码我jio得美中不足的是,下标和区间都在以参数的形式变化,我更偏向于把区间写在其中,最后组合成一个结构体,看着这个update函数jio得参数过多,可以考虑下我说的,不过建树多出来的时间可能导致超时)

#include
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
int vis[maxn];
int lazy[maxn*4],mx[maxn*4],mn[maxn*4];//mn为最小值,mx为最大值
void pushdown(int id,int l,int r)//懒标记下传
{
	if(lazy[id])
	{
		mx[id]=mn[id]=lazy[id];
		if(l!=r)
		{
			lazy[id<<1|1]=lazy[id<<1]=lazy[id];
			mx[id<<1]=mx[id<<1|1]=lazy[id];
			mn[id<<1]=mn[id<<1|1]=lazy[id];
		}
		lazy[id]=0;
	}
}
void update(int id,int l,int r,int ql,int qr,int v)
{
	pushdown(id,l,r);//下传懒标记,由于开始没有建树,下传有必要,而且只是下传了标记,没有改变cnt[]中的值,所以没有影响,这不同于一般的维护区间和的线段树。
	if(ql<=l&&r<=qr&&mx[id]==mn[id])//mx[id] == mn[id]意为id管辖区间内所有值相同,ql<=l&&r<=qr控制寻得的区间或点在要修改的范围内。
	{
		vis[mx[id]]-=(r-l+1);//区间内的值全部改变
		vis[v]+=(r-l+1);
		lazy[id]=v;
		pushdown(id,l,r);
		return ;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) update(id<<1,l,mid,ql,qr,v);
	if(qr>mid) update(id<<1|1,mid+1,r,ql,qr,v);
	mx[id]=max(mx[id<<1],mx[id<<1|1]);//维护最值
	mn[id]=min(mn[id<<1],mn[id<<1|1]);
}
int main()
{
	int n,c,q,x,y;
	ll a,b;
	scanf("%d%d%d",&n,&c,&q);
	vis[1]=n;
	lazy[1]=1;//不建树切记要标记
	while(q--)
	{
		scanf("%d%d%lld%lld",&x,&y,&a,&b);
		int p=vis[x];
		int l=(a+(p+b)%n*(p+b)%n)%n+1;
		int r=(a+p*b%n*p%n*b%n)%n+1;
		if(l>r) swap(l,r);
		update(1,1,n,l,r,y);
	}
	int ans=0;
	for(int i=1;i<=c;i++)
	ans=max(ans,vis[i]);
	printf("%d\n",ans);
    return 0;
}

 

你可能感兴趣的:(牛客想开了大赛2——C)