列表

详情


NC21677. Rabbit的数列

描述

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

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 295ms, 内存消耗: 6524K, 提交时间: 2019-01-07 16:38:23

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
int vis[maxn],tag[maxn*4],ans;
int mx[maxn*4],mn[maxn*4];
void pushdown(int o,int ls,int rs,int l,int r)
{
	if(tag[o])
	{
		mx[o]=mn[o]=tag[o];
		if(l!=r)
		{
			tag[ls]=tag[rs]=tag[o];	
			mx[ls]=mx[rs]=tag[o];
			mn[ls]=mn[rs]=tag[o];
		}
		tag[o]=0;
	}
}
void up(int o,int l,int r,int ql,int qr,int v)
{
	int ls=o*2,rs=o*2+1,m=(l+r)/2;
	pushdown(o,ls,rs,l,r);
	if(l>=ql&&r<=qr&&mx[o]==mn[o])
	{
		vis[mx[o]]-=(r-l+1);
		vis[v]+=(r-l+1);
		tag[o]=v;
		pushdown(o,ls,rs,l,r);
		return;
	}
	if(ql<=m)up(ls,l,m,ql,qr,v);
	if(qr>m)up(rs,m+1,r,ql,qr,v);
	mx[o]=max(mx[ls],mx[rs]);
	mn[o]=min(mn[ls],mn[rs]);
}
int main()
{
	int n,c,q,x,y;
	ll a,b;
	scanf("%d%d%d",&n,&c,&q);
	tag[1]=1;
	vis[1]=n;
	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);
		up(1,1,n,l,r,y);
	}
	for(int i=1;i<=c;i++)
	ans=max(ans,vis[i]);
	printf("%d\n",ans);
}

C++14(g++5.4) 解法, 执行用时: 183ms, 内存消耗: 3628K, 提交时间: 2020-08-04 23:53:14

#include<bits/stdc++.h>
using namespace std;

int y,Max[400005],Min[400005],T[400005]={0},V[100005]={0};
void down(int L,int R,int x)
{
	if(!T[x])return;
	Max[x]=Min[x]=T[x];
	if(L!=R)Max[x<<1]=Min[x<<1]=Max[x<<1|1]=Min[x<<1|1]=T[x<<1]=T[x<<1|1]=T[x];
	T[x]=0;
}
void update(int L,int R,int l,int r,int x)
{
	down(L,R,x);
	if(l<=L&&R<=r&&Max[x]==Min[x])
	{
		V[Max[x]]-=(R-L+1),V[y]+=R-L+1;
		T[x]=y,down(L,R,x);
		return;
	}
	int M=(L+R)>>1;
	if(M>=l)update(L,M,l,r,x<<1);
	if(M<r)update(M+1,R,l,r,x<<1|1);
	Max[x]=max(Max[x<<1],Max[x<<1|1]);
	Min[x]=min(Min[x<<1],Min[x<<1|1]);
}
int main()
{
    int i,n,c,q,x,p,l,r,ans=0;
    long long a,b;
    scanf("%d%d%d",&n,&c,&q);
	T[1]=1,V[1]=n;
    while(q--)
    {
    	scanf("%d%d%lld%lld",&x,&y,&a,&b);
    	p=V[x],l=(a+(p+b)*(p+b))%n+1,r=(a+b*b%n*p%n*p)%n+1;
		if(l>r)swap(l,r);
		update(1,n,l,r,1);
	}
	for(i=1;i<=c;i++)ans=max(ans,V[i]);
	printf("%d\n",ans);
    return 0;
}

上一题