列表

详情


NC21208. msc的序列

描述

msc是个喜欢玩游戏的小女孩。
一天msc遇到了mas,msc取出了一个长度为n的序列a,并决定和mas一起玩游戏。
这个游戏是这样的:
1、一开始有一个给定的参数k.
2、mas选择一个区间[l,r],取出序列a的a[l..r]这一段,记为序列A,长度为m=r-l+1
3、msc开始操作,她会选择序列A中的连续k个数,然后将这k 个数同时加上一个实数x(更具体的,msc会选择一个i满足,然后选择一个实数,将A[i..i+k-1]这些数都加上x),msc会重复这一步若干次,直到A中的数都变成0(这个时候msc就赢了),当然如果无论msc如何操作,A都不可能变成全为0的序列,那么msc就输了。
mas希望msc可以开开心心的,所以mas希望msc赢。
但是他发现msc给出的序列中大部分的区间[l,r],msc都是会输掉游戏的,所以mas想知道,如果选出的区间是[l,r],那么自己至少需要修改多少个位置上的数字才能够使msc胜利。(**注意:这只是“如果”,这里的修改并不会真正改变a中的值,就是说不会对后面的询问或修改产生影响**)
当然,由于游戏不够刺激,mas会在某些时候修改某个ai
mas正忙于讨好msc,所以希望你能帮他求出答案

输入描述

第一行三个整数n,k和q,表示序列a的长度,给定的参数k,以及mas给出的询问+操作数。
第二行n个整数ai,表示序列a
接下来q行,每行第一个数ty。
如果ty=1,那么接下来同一行有两个整数l,r,表示一次询问,如果选出的区间是[l,r],那么mas至少需要修改多少个位置上的数字才能够使msc胜利。
如果ty=2,那么接下来同一行有两个整数x,v,表示一次修改,将ax修改为v
注意,询问不会对a产生影响。

输出描述

对于每次询问输出一行表示答案。

示例1

输入:

8 3 5
4 -1 -3 -3 1 -4 -1 1
1 1 8
2 4 0
1 4 5
1 2 7
1 2 5

输出:

2
1
2
1

说明:

对于第一次询问l=1,r=8,那么A={4,-1,-3,-3,1,-4,-1,1},mas将A[3]修改成4,A[5]修改成0,得到A'={4,-1,4,-3,0,-4,-1,1},然后可以通过给[3,5]加上-5,[4,6]加上3,[2,4]加上5,[5,7]加上2,[1,3]加上-4,[6,8]加上-1,使得A'变成全为0的序列。

原站题解

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

C++11(clang++ 3.9) 解法, 执行用时: 371ms, 内存消耗: 16888K, 提交时间: 2019-11-04 09:27:35

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<ctime>
#include<map>
#include<bitset>
#include<set>
#define LL long long
#define mp(x,y) make_pair(x,y)
#define pll pair<long long,long long>
#define pii pair<int,int>
using namespace std;
inline LL read()
{
	LL f=1,x=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int stack[20];
template<typename T>inline void write(T x)
{
	if(x<0){putchar('-');x=-x;}
    if(!x){putchar('0');return;}
    int top=0;
    while(x)stack[++top]=x%10,x/=10;
    while(top)putchar(stack[top--]+'0');
}
template<typename T>inline void pr1(T x){write(x);putchar(' ');}
template<typename T>inline void pr2(T x){write(x);putchar('\n');}
const int MAXN=100005;
LL s[25][MAXN];
LL a[MAXN],b[MAXN];int n,m,Q;
int lowbit(int x){return x&-x;}
void modify(int x,LL c,int o){for(;x<=n;x+=lowbit(x))s[o][x]+=c;}
LL qry(int x,int o){LL ret=0;for(;x>=1;x-=lowbit(x))ret+=s[o][x];return ret;}
int main()
{
	n=read();m=read();Q=read();
	for(int i=1;i<=n;i++)a[i]=read(),modify(i,a[i],i%m);
	while(Q--)
	{
		int o=read();int x=read();LL y=read();
		if(o==2)modify(x,-a[x],x%m),modify(x,a[x]=y,x%m);
		else
		{
			if(y-x+1<m)
			{
				int val=0;
				for(int i=x;i<=y;i++)val+=(a[i]!=0);
				pr2(val);
			}
			else
			{
				int ln=0;
				for(int i=0;i<m;i++)b[++ln]=qry(y,i)-qry(x-1,i);
				sort(b+1,b+1+ln);int val=0;
				for(int i=1,nxt;i<=ln;i=nxt+1)
				{
					nxt=i;while(b[nxt+1]==b[i]&&nxt+1<=ln)++nxt;
					val=max(val,nxt-i+1);
				}pr2(m-val);
			}
		}
	}
	return 0;
}

上一题