题目描述
在N(1<=N<=100000)个数A1…An组成的序列上进行M(1<=M<=100000)次操作,操作有两种:
(1)1 L R C:表示把A[L]到A[R]增加C(C的绝对值不超过10000);
(2)2 L R:询问A[L]到A[R]之间的最大值。
输入
第一行输入N(1<=N<=100000),表示序列的长度,接下来N行输入原始序列;接下来一行输入M(1<=M<=100000)表示操作的次数,接下来M行,每行为1 L R C或2 L R
输出
对于每个操作(2)输出对应的答案。
样例输入
5 1 2 3 4 5 3 2 1 4 1 1 3 3 2 3 5
样例输出
4 6
不多解释,直接看代码
#include<bits/stdc++.h>
#pragma GCC optimize(2,"Ofast","inline")
#pragma GCC optimize(3,"Ofast","inline")
%:pragma GCC optimize("Ofast")
%:pragma GCC optimize("inline")
%:pragma GCC optimize("-fgcse")
%:pragma GCC optimize("-fgcse-lm")
%:pragma GCC optimize("-fipa-sra")
%:pragma GCC optimize("-ftree-pre")
%:pragma GCC optimize("-ftree-vrp")
%:pragma GCC optimize("-fpeephole2")
%:pragma GCC optimize("-ffast-math")
%:pragma GCC optimize("-fsched-spec")
%:pragma GCC optimize("unroll-loops")
%:pragma GCC optimize("-falign-jumps")
%:pragma GCC optimize("-falign-loops")
%:pragma GCC optimize("-falign-labels")
%:pragma GCC optimize("-fdevirtualize")
%:pragma GCC optimize("-fcaller-saves")
%:pragma GCC optimize("-fcrossjumping")
%:pragma GCC optimize("-fthread-jumps")
%:pragma GCC optimize("-funroll-loops")
%:pragma GCC optimize("-fwhole-program")
%:pragma GCC optimize("-freorder-blocks")
%:pragma GCC optimize("-fschedule-insns")
%:pragma GCC optimize("inline-functions")
%:pragma GCC optimize("-ftree-tail-merge")
%:pragma GCC optimize("-fschedule-insns2")
%:pragma GCC optimize("-fstrict-aliasing")
%:pragma GCC optimize("-fstrict-overflow")
%:pragma GCC optimize("-falign-functions")
%:pragma GCC optimize("-fcse-skip-blocks")
%:pragma GCC optimize("-fcse-follow-jumps")
%:pragma GCC optimize("-fsched-interblock")
%:pragma GCC optimize("-fpartial-inlining")
%:pragma GCC optimize("no-stack-protector")
%:pragma GCC optimize("-freorder-functions")
%:pragma GCC optimize("-findirect-inlining")
%:pragma GCC optimize("-fhoist-adjacent-loads")
%:pragma GCC optimize("-frerun-cse-after-loop")
%:pragma GCC optimize("inline-small-functions")
%:pragma GCC optimize("-finline-small-functions")
%:pragma GCC optimize("-ftree-switch-conversion")
%:pragma GCC optimize("-foptimize-sibling-calls")
%:pragma GCC optimize("-fexpensive-optimizations")
%:pragma GCC optimize("-funsafe-loop-optimizations")
%:pragma GCC optimize("inline-functions-called-once")
%:pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
int a[100001];
int main(){
int n,m;
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",a+i);
cin>>m;
while(m--){
int num,l,r,sum;
scanf("%d",&num);
//
if(num==1){
scanf("%d%d%d",&l,&r,&sum);
for(int i=l;i<=r;i++) a[i]+=sum;
}
else{
scanf("%d%d",&l,&r);
int maxn=-30000001;
for(int i=l;i<=r;i++){
maxn=a[i]>maxn? a[i]:maxn;
}
printf("%d\n",maxn);
}
}
return 0;
}
呵呵,搞错了!!!
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100010],c[100010];
char l;
int lowbit(int x)
{
return x & -x;
}
void build(int x,int num)
{
while(x<=n)
{
c[x]+=num;
x+=lowbit(x);
}
return;
}
int query(int p)
{
int tmp=0;
while (p)
{
tmp+=c[p];
p-=lowbit(p);
}
return tmp;
}
int main()
{
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
build(i,a[i]);
}
scanf("%lld",&m);
for(int i=1;i<=m;i++)
{
l=' ';
while(l!='C'&&l!='Q')
scanf("%c",&l);
if (l=='C')
{
long long j,k;
scanf("%lld%lld",&j,&k);
build(j,k-a[j]);
a[j]=k;
}
else
{
long long l,r;
scanf("%lld%lld",&l,&r);
long long sum=query(r)-query(l-1);
printf("%lld\n",sum);
}
}
return 0;
}
思路以后再出!!!