NC21208. 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; }