QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#516703 | #6815. Hysteretic Racing | yjf1225 | TL | 1ms | 5924kb | C++14 | 4.9kb | 2024-08-12 20:42:14 | 2024-08-12 20:42:14 |
Judging History
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 ...