답안 #839269

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
839269 2023-08-29T13:04:57 Z 8pete8 Progression (NOI20_progression) C++17
57 / 100
843 ms 79304 KB
#include<iostream>
#include<stack>
#include<map>
#include<vector>
#include<string>
#include<unordered_map>
#include <queue>
#include<cstring>
#include<algorithm>
#include<limits.h>
#include<cmath>
#include<bitset>
using namespace std;
#define ll long long
#define f first
#define endl "\n"
#define s second
#define pii pair<int,int>
#define ppii pair<pii,int>
#define pb push_back
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#define int long long
#define mod 1000000007
const int mxn=4*1e5,lg=20,inf=1e18;
int n,m;
struct node{
    int as=0,ms=1,ls=0,rs=0,lv=0,rv=0,sum=0;
    //all size, max size, left size,right size,left val,right val;
};
void print(node a){
    cout<<a.as<<" "<<a.ms<<" "<<a.ls<<" "<<a.rs<<" "<<a.lv<<" "<<a.rv<<'\n';
}
node seg[4*mxn+10];
int add[4*mxn+10],change[4*mxn+10],v[mxn+10];
bool yes[4*mxn+10];
int h;//height of tree
node comb(node a,node b){
    node tmp;
    if(a.rv==inf)return b;
    if(b.rv==inf)return a;
    tmp.ms=max(a.ms,b.ms);
    if(a.rv==b.lv)tmp.ms=max(tmp.ms,a.rs+b.ls);
    tmp.lv=a.lv;
    tmp.rv=b.rv;
    if(a.ls==a.as&&b.lv==a.lv)tmp.ls=a.ls+b.ls;
    if(b.rs==b.as&&a.rv==b.rv)tmp.rs=b.rs+a.rs;
    tmp.ls=max(tmp.ls,a.ls);
    tmp.rs=max(tmp.rs,b.rs);
    tmp.as=a.as+b.as;
    tmp.sum=a.sum+b.sum;
    return tmp;
}
void build(int pos,int l,int r){
   // cout<<pos<<" "<<l<<" "<<r<<'\n';
   if(r<l)return;
    if(l==r){
        seg[pos].as=seg[pos].ls=seg[pos].rs=seg[pos].ms=1;
        seg[pos].lv=seg[pos].rv=seg[pos].sum=v[l];
    }
    else{
        int mid=l+(r-l)/2;
        build(pos*2,l,mid);
        build(pos*2+1,mid+1,r);
        seg[pos]=comb(seg[pos<<1],seg[(pos<<1)|1]);
    }
}
void app(int pos){
    if(yes[pos]){
        seg[pos].ms=seg[pos].ls=seg[pos].rs=seg[pos].as;
        seg[pos].lv=seg[pos].rv=change[pos];
        seg[pos].sum=seg[pos].as*change[pos];
    }
    if(add[pos]){
        seg[pos].lv+=add[pos];
        seg[pos].rv+=add[pos];
        seg[pos].sum+=(seg[pos].as*add[pos]);
    }
}
void push(int pos,int l,int r){
    if(add[pos]){
        app(pos);
        if(l!=r){
            add[pos*2]+=add[pos];
            add[pos*2+1]+=add[pos];
        }
    }
    if(yes[pos]){
        app(pos);
        if(l!=r){
            add[pos*2]=0;
            add[pos*2+1]=0;
            yes[pos*2]=true;
            yes[pos*2+1]=true;
            change[pos*2]=change[pos];
            change[pos*2+1]=change[pos];
        }
    }
    add[pos]=0;
    yes[pos]=false;
    change[pos]=0;
}
void update(int pos,int l,int r,int ql,int qr,int val){
    if(r<l)return;
    push(pos,l,r);
    //cout<<pos<<' '<<l<<" "<<r<<' '<<ql<<" "<<qr<<'\n';
    if(r<ql||l>qr)return;
    if(ql<=l&&r<=qr){
        add[pos]+=val;
        push(pos,l,r);
        return;
    }
    int mid=l+(r-l)/2;
    update(pos*2,l,mid,ql,qr,val);
    update(pos*2+1,mid+1,r,ql,qr,val);
    seg[pos]=comb(seg[pos*2],seg[pos*2+1]);
}
void update2(int pos,int l,int r,int ql,int qr,int val){
    if(r<l)return;
    if(r<ql||l>qr)return;
    //cout<<pos<<" "<<l<<" "<<r<<" "<<ql<<" "<<qr<<" "<<val<<'\n';
    if(ql<=l&&r<=qr){
        change[pos]=val;
        yes[pos]=true;
        add[pos]=0;
        push(pos,l,r);
        return;
    }
    push(pos,l,r);
    int mid=l+(r-l)/2;
    update2(pos*2,l,mid,ql,qr,val);
    update2(pos*2+1,mid+1,r,ql,qr,val);
    seg[pos]=comb(seg[pos<<1],seg[(pos<<1)|1]);
}
node query(int pos,int l,int r,int ql,int qr){
    node tmp;
    tmp.rv=inf;
    if(r<l)return tmp;
    if(r<ql||l>qr)return tmp;
    push(pos,l,r);
    if(ql<=l&&r<=qr)return seg[pos];
    int mid=l+(r-l)/2;
    if(l<=ql&&qr<=mid)return query(pos*2,l,mid,ql,qr);
    if(ql>=mid+1&&qr<=r)return query(pos*2+1,mid+1,r,ql,qr);
    return comb(query(pos*2,l,mid,ql,qr),query(pos*2+1,mid+1,r,ql,qr));
}
int32_t main(){
    fastio
    int n,m;cin>>n>>m;
    for(int i=0;i<n;i++)cin>>v[i];
    int val=v[0];
    n--;
    for(int i=0;i<n;i++)v[i]=v[i+1]-v[i];
    build(1,0,n-1);
    int diff;
    while(m--){
        int type;cin>>type;
        if(type==1){
            int l,r,x,c;cin>>l>>r>>x>>c;
            l--,r--;
            if(l)update(1,0,n-1,l-1,l-1,x);
            else val+=x;
            if(r<n)update(1,0,n-1,r,r,-((x+((r-l)*c))));
            if(l!=r)update(1,0,n-1,l,r-1,c);
        }
        else if(type==2){
            int l,r,x,c;cin>>l>>r>>x>>c;
            l--,r--;
            int suml,sumr;
            if(r<n){
                if(r)sumr=query(1,0,n-1,0,r-1).sum+val;
                else sumr=val;
                diff=sumr-(x+(r-l)*c);
                update2(1,0,n-1,r,r,diff);
            }
            if(l){
                suml=query(1,0,n-1,0,l-1).sum+val;
                diff=x-suml;
                update(1,0,n-1,l-1,l-1,diff);
            }
            else val=x;
            if(l!=r)update2(1,0,n-1,l,r-1,c);
        }
        else{
            int l,r;cin>>l>>r;
            l--;
            r--;
            cout<<((l==r)?0:query(1,0,n-1,l,r-1).ms)+1<<'\n';
        }
    }
 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 61260 KB Output is correct
2 Correct 67 ms 1068 KB Output is correct
3 Correct 64 ms 1124 KB Output is correct
4 Correct 69 ms 1080 KB Output is correct
5 Correct 66 ms 1176 KB Output is correct
6 Correct 63 ms 1176 KB Output is correct
7 Correct 65 ms 1152 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 133 ms 61004 KB Output is correct
12 Correct 130 ms 60884 KB Output is correct
13 Correct 139 ms 61304 KB Output is correct
14 Correct 134 ms 61220 KB Output is correct
15 Correct 146 ms 61216 KB Output is correct
16 Correct 130 ms 60988 KB Output is correct
17 Correct 130 ms 60904 KB Output is correct
18 Correct 131 ms 60864 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 468 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 273 ms 79056 KB Output is correct
2 Correct 69 ms 1180 KB Output is correct
3 Correct 63 ms 1292 KB Output is correct
4 Correct 58 ms 1228 KB Output is correct
5 Correct 86 ms 1356 KB Output is correct
6 Correct 69 ms 1304 KB Output is correct
7 Correct 68 ms 1312 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 325 ms 78664 KB Output is correct
12 Correct 275 ms 78944 KB Output is correct
13 Correct 322 ms 78612 KB Output is correct
14 Correct 325 ms 78540 KB Output is correct
15 Correct 255 ms 78840 KB Output is correct
16 Correct 311 ms 79180 KB Output is correct
17 Correct 334 ms 79152 KB Output is correct
18 Correct 330 ms 79304 KB Output is correct
19 Correct 251 ms 78444 KB Output is correct
20 Correct 263 ms 78528 KB Output is correct
21 Correct 257 ms 78540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 657 ms 78320 KB Output is correct
2 Incorrect 131 ms 968 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 273 ms 79056 KB Output is correct
2 Correct 69 ms 1180 KB Output is correct
3 Correct 63 ms 1292 KB Output is correct
4 Correct 58 ms 1228 KB Output is correct
5 Correct 86 ms 1356 KB Output is correct
6 Correct 69 ms 1304 KB Output is correct
7 Correct 68 ms 1312 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 325 ms 78664 KB Output is correct
12 Correct 275 ms 78944 KB Output is correct
13 Correct 322 ms 78612 KB Output is correct
14 Correct 325 ms 78540 KB Output is correct
15 Correct 255 ms 78840 KB Output is correct
16 Correct 311 ms 79180 KB Output is correct
17 Correct 334 ms 79152 KB Output is correct
18 Correct 330 ms 79304 KB Output is correct
19 Correct 251 ms 78444 KB Output is correct
20 Correct 263 ms 78528 KB Output is correct
21 Correct 257 ms 78540 KB Output is correct
22 Correct 758 ms 78216 KB Output is correct
23 Correct 138 ms 868 KB Output is correct
24 Correct 132 ms 860 KB Output is correct
25 Correct 131 ms 844 KB Output is correct
26 Correct 138 ms 852 KB Output is correct
27 Correct 137 ms 844 KB Output is correct
28 Correct 143 ms 972 KB Output is correct
29 Correct 1 ms 340 KB Output is correct
30 Correct 1 ms 340 KB Output is correct
31 Correct 1 ms 340 KB Output is correct
32 Correct 788 ms 78404 KB Output is correct
33 Correct 726 ms 78192 KB Output is correct
34 Correct 794 ms 78188 KB Output is correct
35 Correct 784 ms 78208 KB Output is correct
36 Correct 652 ms 78520 KB Output is correct
37 Correct 650 ms 78400 KB Output is correct
38 Correct 641 ms 78448 KB Output is correct
39 Correct 745 ms 78204 KB Output is correct
40 Correct 836 ms 78248 KB Output is correct
41 Correct 822 ms 78248 KB Output is correct
42 Correct 843 ms 78216 KB Output is correct
43 Correct 778 ms 78092 KB Output is correct
44 Correct 760 ms 78188 KB Output is correct
45 Correct 762 ms 78156 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 61260 KB Output is correct
2 Correct 67 ms 1068 KB Output is correct
3 Correct 64 ms 1124 KB Output is correct
4 Correct 69 ms 1080 KB Output is correct
5 Correct 66 ms 1176 KB Output is correct
6 Correct 63 ms 1176 KB Output is correct
7 Correct 65 ms 1152 KB Output is correct
8 Correct 1 ms 340 KB Output is correct
9 Correct 1 ms 340 KB Output is correct
10 Correct 1 ms 340 KB Output is correct
11 Correct 133 ms 61004 KB Output is correct
12 Correct 130 ms 60884 KB Output is correct
13 Correct 139 ms 61304 KB Output is correct
14 Correct 134 ms 61220 KB Output is correct
15 Correct 146 ms 61216 KB Output is correct
16 Correct 130 ms 60988 KB Output is correct
17 Correct 130 ms 60904 KB Output is correct
18 Correct 131 ms 60864 KB Output is correct
19 Incorrect 2 ms 468 KB Output isn't correct
20 Halted 0 ms 0 KB -