这道题我的线段树用int过了,开longlong却WA了四个点,不知道为啥,求dalao解惑,(而且测试点上面显示都是应该输出QAQ而我输出的ice),是不是std爆int了,希望开放数据 我的码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e6+10;
struct Node{
int Max,id;
Node(){}
Node(int Ma,int I){
Max=Ma;
id=I;
}
};
Node maxx(Node aa,Node bb){
if(aa.Max>bb.Max)return aa;
else return bb;
}
int n,m,Finalans;
int a[maxn],Max[maxn],lazy[maxn],ID[maxn];
bool mark[maxn];
void pushup(int rt){
if(Max[rt<<1]>Max[rt<<1|1]){
Max[rt]=Max[rt<<1];
ID[rt]=ID[rt<<1];
}else{
Max[rt]=Max[rt<<1|1];
ID[rt]=ID[rt<<1|1];
}
}
void build(int rt,int l,int r){
if(l==r){
ID[rt]=l;
Max[rt]=a[l];
return;
}
int mid=l+r>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void pushdown(int rt,int l,int r){
if(lazy[rt]){
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
Max[rt<<1]+=lazy[rt];
Max[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
}
void modify(int rt,int l,int r,int s,int t,int w){
if(s<=l&&t>=r){
Max[rt]=Max[rt]+w;
lazy[rt]=lazy[rt]+w;
return;
}
pushdown(rt,l,r);
int mid=l+r>>1;
if(s<=mid)modify(rt<<1,l,mid,s,t,w);
if(t>mid)modify(rt<<1|1,mid+1,r,s,t,w);
pushup(rt);
}
Node query(int rt,int l,int r,int s,int t){
if(s<=l&&t>=r){
return Node(Max[rt],ID[rt]);
}
pushdown(rt,l,r);
int mid=l+r>>1;
if(s>mid)return query(rt<<1|1,mid+1,r,s,t);
if(t<=mid)return query(rt<<1,l,mid,s,t);
return maxx(query(rt<<1,l,mid,s,t),query(rt<<1|1,mid+1,r,s,t));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
build(1,1,n);
int mode,pos,val,s,t;
for(int i=1;i<=m;i++){
scanf("%d",&mode);
if(mode==1){
scanf("%d%d",&pos,&val);
mark[pos]=1;
int nowans=query(1,1,n,pos,pos).Max;
modify(1ll,1ll,n,pos,pos,100000000+val-2*nowans);
}else if(mode==2){
scanf("%d%d",&s,&t);
Node nowans=query(1ll,1ll,n,s,t);
if(mark[nowans.id]){
mark[nowans.id]=0;
Finalans+=nowans.Max-100000000;
printf("%d\n",nowans.Max-100000000);
modify(1,1,n,nowans.id,nowans.id,-nowans.Max);
}else{
Finalans+=nowans.Max;
printf("%d\n",nowans.Max);
modify(1,1,n,nowans.id,nowans.id,-nowans.Max);
}
}else{
scanf("%d%d%d",&s,&t,&val);
modify(1,1,n,s,t,val);
}
}
if(Finalans<10000)puts("QAQ");
else if(Finalans<10000000)puts("Sakura");
else puts("ice");
return 0;
}
这是能ac的代码。 但是把里面的所有int换成longlong,%d换成%lld就WA了#8、9、10、11四个点