虽然我过了,但是我还是很疑惑
查看原帖
虽然我过了,但是我还是很疑惑
97254
big_turkey楼主2021/8/23 20:42

我最后多写了一个求和函数来检验答案,因为找不出bug,就只能采取这样离谱的措施......

求大佬指出错误QAQ

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<set>
#include<vector>
#define ll long long
#define ld double
#define FOR(inum,st,ed) for(ll (inum)=(st),upnum=(ed);(inum)<=upnum;(inum)++)
#define ROF(inum,st,ed) for(ll (inum)=(st),donum=(ed);(inum)>=donum;(inum)--)
#define FORK(inum,st,ed,knum) for(ll (inum)=(st),upnum=(ed);(inum)<=upnum;(inum)+=knum)
#define FORE(x) for(ll ei=head[x],to=e[ei].to;ei;ei=e[ei].next,to=e[ei].to)
#define il inline
#define lowbit(x) (x&-x)

using namespace std;

inline ll read(){
	char c=getchar();ll ans=0,f=0;
	for(;c<'0'||c>'9';c=getchar()) f|=(c=='-');
	for(;c>='0'&&c<='9';c=getchar()) (ans*=10)+=c-'0';
	return f?-ans:ans;
} 

inline void chkmax(ll &x,ll y){x=x>y?x:y;}
inline void chkmin(ll &x,ll y){x=x<y?x:y;}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}

const ll maxn=2e6+50,mod=998244353,inf=1e15;

ll n,m,arr[maxn];
bool flag;

struct segment_tree{
	ll l,r,sum,mn;
	#define l(w) tree[w].l
	#define r(w) tree[w].r
	#define sum(w) tree[w].sum
	#define mn(w) tree[w].mn
}tree[maxn<<2];

#define ls (p<<1)
#define rs (p<<1|1)

void pushup(ll p){
	sum(p)=sum(ls)+sum(rs);
	mn(p)=min(mn(ls),mn(rs));
}

void build(ll p,ll l,ll r){
	l(p)=l;r(p)=r;
	if(l==r){
		mn(p)=(arr[l]==1?l:n+1);
		sum(p)=arr[l];
		return ;
	}
	ll mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(p);
}

void updata(ll p,ll x,ll val){
	if(l(p)==r(p)){
		mn(p)=(val==1?x:inf);
		sum(p)=val;
		return ;
	}
	ll mid=l(p)+r(p)>>1;
	if(x<=mid) updata(ls,x,val);
	else updata(rs,x,val);
	pushup(p);
}

ll query_sum(ll p,ll k){
	while(l(p)<r(p)){
		if(sum(ls)>=k) p=ls;
		else k-=sum(ls),p=rs;
	}
	flag=(k==sum(p));
	return l(p);
}

ll query_mn(ll p,ll l,ll r){
	if(l>r) return inf;
	if(l<=l(p)&&r(p)<=r) return mn(p);
	ll mid=l(p)+r(p)>>1,ans=inf;
	if(l<=mid) chkmin(ans,query_mn(ls,l,r));
	if(mid<r) chkmin(ans,query_mn(rs,l,r));
	return ans;
}

ll query(ll p,ll l,ll r){
	if(l<=l(p)&&r(p)<=r) return sum(p);
	ll mid=l(p)+r(p)>>1,sum=0;
	if(l<=mid) sum+=query(ls,l,r);
	if(mid<r) sum+=query(rs,l,r);
	return sum;
}

char str[5];

int main(){
	n=read();m=read();
	FOR(i,1,n) arr[i]=read();
	build(1,1,n);
	for(ll s,x,y,ansl,ansr;m;m--){
		scanf("%s",str);
		if(str[0]=='A'){
			flag=false;
			s=read();
			if(s>sum(1)||s==0){
				puts("none");
				continue;
			}
			x=query_sum(1,s);
			if(flag){
				printf("%lld %lld\n",1,x);
				continue;
			}
			ll l=query_mn(1,1,x-1),r=query_mn(1,x,n);
			if(l==inf&&r==inf){
				puts("none");
				continue;
			}
			if(l>=r-x+1)
				ansl=r-x+1,ansr=r;
			else
				ansl=l+1,ansr=l+x-1;
			if(query(1,ansl,ansr)==s)//就是这里,我采取的离谱措施......
				printf("%lld %lld\n",ansl,ansr);
			else puts("none");
		}
		else{
			x=read(),y=read();
			updata(1,x,y);
		}
	}
	return 0;
}
2021/8/23 20:42
加载中...