QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#516703#6815. Hysteretic Racingyjf1225TL 1ms5924kbC++144.9kb2024-08-12 20:42:142024-08-12 20:42:14

Judging History

你现在查看的是最新测评结果

  • [2024-08-12 20:42:14]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:5924kb
  • [2024-08-12 20:42:14]
  • 提交

answer

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
namespace Y{
	const long long N=2e5+10;
	
	long long d[N];
	struct Node{
		long long maxx,sum_max,sum_d,ans;
		long long flag,flag2;
	}tree[4*N];
	long long Sum,maxx,ans;
	
	long long find_sum_maxx(long long k,long long maxx,long long l,long long r){
		if(l==r) return max(maxx,tree[k].maxx);
		long long mid=(l+r)>>1;
		if(tree[2*k].maxx<=maxx){
			return (mid-l+1)*maxx+find_sum_maxx(2*k+1,maxx,mid+1,r);
		}
		else{
			return find_sum_maxx(2*k,maxx,l,mid)+tree[k].sum_max-tree[2*k].sum_max;
		}
	}
	
	long long find_ans(long long k,long long maxx,long long l,long long r){
		if(l==r) return max(tree[k].maxx,maxx)*tree[k].sum_d;
		long long mid=(l+r)>>1;
		if(tree[2*k].maxx<=maxx){
			return tree[2*k].sum_d*maxx+find_ans(2*k+1,maxx,mid+1,r);
		}
		else{
			return find_ans(2*k,maxx,l,mid)+tree[k].ans-tree[2*k].ans;
		}
	}
	
	void up(long long k,long long l,long long mid,long long r){
		tree[k].maxx=max(tree[2*k].maxx,tree[2*k+1].maxx);
		tree[k].sum_d=tree[2*k].sum_d+tree[2*k+1].sum_d;
		tree[k].ans=tree[2*k].ans+find_ans(2*k+1,tree[2*k].maxx,mid+1,r);
		tree[k].sum_max=tree[2*k].sum_max+find_sum_maxx(2*k+1,tree[2*k].maxx,mid+1,r);
	}
	
	void down_(long long k,long long d,long long l,long long r){
		if(d!=0){ //要区间赋值!!! 
			tree[k].ans=d*d*(r-l+1);
			tree[k].sum_max=(r-l+1)*d;
			tree[k].sum_d=(r-l+1)*d;
			tree[k].maxx=d;
			
			tree[k].flag=d;
			tree[k].flag2=0;
		}
	}
	
	void down_2(long long k,long long d,long long l,long long r){
		tree[k].ans+=(tree[k].sum_max+tree[k].sum_d)*d+d*d*(r-l+1);
		tree[k].sum_max+=(r-l+1)*d;
		tree[k].sum_d+=(r-l+1)*d;
		tree[k].maxx+=d;
		
		tree[k].flag2+=d;
	}
	
	void down(long long k,long long l,long long mid,long long r){
		down_(2*k,tree[k].flag,l,mid);
		down_(2*k+1,tree[k].flag,mid+1,r);
		tree[k].flag=0;
		down_2(2*k,tree[k].flag2,l,mid);
		down_2(2*k+1,tree[k].flag2,mid+1,r);
		tree[k].flag2=0;
	}
	
	void build(long long k,long long l,long long r){
		if(l==r){
			tree[k].sum_max=tree[k].sum_d=tree[k].maxx=d[l];
			tree[k].ans=d[l]*d[l];
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		build(2*k,l,mid);
		build(2*k+1,mid+1,r);
		up(k,l,mid,r);
	}
	
	void dd(long long k,long long l,long long r){
		if(l==r){
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		dd(2*k,l,mid);
		dd(2*k+1,mid+1,r);
		up(k,l,mid,r);
	}
	
	void modify1(long long k,long long l,long long r,long long L,long long R,long long d){
		if(r<L || R<l) return ;
		if(L<=l && r<=R){
			down_2(k,d,l,r);
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		modify1(2*k,l,mid,L,R,d);
		modify1(2*k+1,mid+1,r,L,R,d);
		up(k,l,mid,r);
	}
	
	void modify2(long long k,long long l,long long r,long long L,long long R,long long d){
		if(r<L || R<l) return ;
		if(L<=l && r<=R){
			down_(k,d,l,r);
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		modify2(2*k,l,mid,L,R,d);
		modify2(2*k+1,mid+1,r,L,R,d);
		up(k,l,mid,r);
	}
	
	void query2(long long k,long long l,long long r){
		long long tmp=find_ans(k,maxx,l,r);
		if(Sum-tmp>=0){
			Sum-=tmp;
			maxx=max(maxx,tree[k].maxx);
			return ;
		}
		if(l==r){
			Sum-=tmp;
			ans=l;
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		query2(2*k,l,mid);
		if(Sum<0) return ;
		query2(2*k+1,mid+1,r);
//		up(k,l,mid,r);
	}
	
	void query(long long k,long long l,long long r,long long L,long long R){
		if(r<L || R<l) return ;
		if(L<=l && r<=R){
			query2(k,l,r);
			return ;
		}
		long long mid=(l+r)>>1;
		down(k,l,mid,r);
		query(2*k,l,mid,L,R);
		if(Sum<0) return ;
		query(2*k+1,mid+1,r,L,R);
//		up(k,l,mid,r);
	}
	
	signed main(){
		long long n,t;
		cin>>n>>t;
		
		for(long long i=0;i<n;i++){
			scanf("%lld",&d[i]);
		}
		
		build(1,0,n-1);
		
		char op[2];long long x,y,z;
		while(t--){
			scanf("%s",op);
			if(op[0]=='P'){
				scanf("%lld%lld%lld",&x,&y,&z);
//				for(int i=x;;i=(i+1)%n){
//					d[i]+=z;
//					if(i==y) break;
//				}
				if(x<=y) modify1(1,0,n-1,x,y,z);
				else modify1(1,0,n-1,x,n-1,z),modify1(1,0,n-1,0,y,z);
				dd(1,0,n-1);
			}
			else if(op[0]=='R'){
				scanf("%lld%lld%lld",&x,&y,&z);
//				for(int i=x;;i=(i+1)%n){
//					d[i]=z;
//					if(i==y) break;
//				}
				if(x<=y) modify2(1,0,n-1,x,y,z);
				else modify2(1,0,n-1,x,n-1,z),modify2(1,0,n-1,0,y,z);
				dd(1,0,n-1);
			}
			else{
				scanf("%lld%lld",&x,&y);
				Sum=y;maxx=0;
				query(1,0,n-1,x,n-1);
//				cout<<"???"<<Sum<<' '<<maxx<<'\n';
				if(Sum<0){
					printf("%lld\n",ans);
					continue;
				}
				query(1,0,n-1,0,n-1);
				if(Sum<0){
					printf("%lld\n",ans);
					continue;
				}
				Sum%=tree[1].maxx*tree[1].sum_d;
//				cout<<"!!!"<<Sum<<'\n';
				query(1,0,n-1,0,n-1);
				printf("%lld\n",ans);
			}
		}
		
		return 0;
	}
}
signed main(){
	return Y::main();
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5924kb

input:

2 4
1 2
Q 0 0
Q 0 1
Q 0 4
Q 0 5

output:

0
1
1
0

result:

ok 4 tokens

Test #2:

score: 0
Accepted
time: 0ms
memory: 5920kb

input:

5 7
2 5 1 4 3
Q 3 28
Q 0 39
P 4 0 3
Q 2 60
R 4 1 2
Q 1 22
Q 3 19260817

output:

0
3
0
4
1

result:

ok 5 tokens

Test #3:

score: -100
Time Limit Exceeded

input:

200000 200000
613996 961471 536170 309149 407021 455240 358488 991078 61893 884024 149317 850785 867113 399303 403939 212239 258081 876122 195526 807123 889530 372732 596978 400631 815703 133663 994909 547857 947107 647857 602092 850543 843740 124903 157661 328300 638794 447455 172285 834119 422682 ...

output:

81822
121278
143252
126362
16581
178856
86671
68469
127057
595
81954
27570
175272
76862
154335
70499
188960
109086
44202
54592
99958
28255
119474
25525
164979
170755
139359
142050
34314
173021
79557
84051
50564
17355
29642
129463
6727
14150
199031
28186
18816
123494
15312
166472
130176
61250
180831
...

result: