int过longlong不过?
查看原帖
int过longlong不过?
332686
liu_yi_tong楼主2020/11/23 14:48

这道题我的线段树用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四个点

2020/11/23 14:48
加载中...