제출 #25152

#제출 시각아이디문제언어결과실행 시간메모리
25152tlwpdusSterilizing Spray (JOI15_sterilizing)C++14
15 / 100
5000 ms5568 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n, q;
ll arr[100100];
ll k;

ll tree[270000];
int key = 131072;
void upd(int idx, ll val) {
    idx+=key;
    tree[idx] = val;
    idx>>=1;
    while(idx>0) {
        tree[idx] = tree[idx*2]+tree[idx*2+1];
        idx>>=1;
    }
}
ll getv(int s, int e) {
    ll res = 0;
    s+=key; e+=key;
    while(s<=e) {
        if (s&1) res += tree[s++];
        if (~e&1) res += tree[e--];
        s>>=1;e>>=1;
    }
    return res;
}
void solve1() {
    int i;
    for (i=0;i<n;i++) upd(i,arr[i]);
    for (i=0;i<q;i++) {
        int a, b, c;
        scanf("%d%d%d",&a,&b,&c);
        if (a==1) upd(b-1,c);
        else if (a==3) printf("%lld\n",getv(b-1,c-1));
    }
}

ll power[40];
int maxcnt;
const int SZ = 55;
int nb;
ll sum[2000], rem[2000][40], cnt[2000];

void recalc(int i) {
    int j, l;
    sum[i] = cnt[i] = 0;
    for (j=0;j<maxcnt;j++) rem[i][j] = 0;
    for (j=0;j<SZ&&i*SZ+j<n;j++) {
        int idx = i*SZ+j;
        sum[i] += arr[idx];
        for (l=0;l<maxcnt;l++) {
            rem[i][l] += (arr[idx]/power[l])%k;
        }
    }
}
void doupd(int i, int s, int e) {
    int j;
    for (j=0;j<SZ&&i*SZ+j<n;j++) {
        int idx = i*SZ+j;
        arr[idx] /= power[cnt[i]];
    }
    for (j=s;j<=e&&j<SZ&&i*SZ+j<n;j++) {
        int idx = i*SZ+j;
        arr[idx] /= k;
    }
}
void solve() {
    int i, j, l;
    power[0] = 1;
    for (i=1;power[i-1]<=1000000000LL;i++) power[i] = power[i-1]*k;
    maxcnt = i;
    nb = (n-1)/SZ+1;
    for (i=0;i<nb;i++) {
        for (j=0;j<SZ&&i*SZ+j<n;j++) {
            int idx = i*SZ+j;
            sum[i] += arr[idx];
            for (l=0;l<maxcnt;l++) {
                rem[i][l] += (arr[idx]/power[l])%k;
            }
        }
    }
    for (i=0;i<q;i++) {
        int a, b, c;
        scanf("%d%d%d",&a,&b,&c);
        if (a==1) {
            b--;
            int bl = b/SZ;
            doupd(bl,-1,-2);
            arr[b] = c;
            recalc(bl);
        }
        else if (a==2) {
            b--; c--;
            int bl = b/SZ, cl = c/SZ;
            for (j=bl+1;j<cl;j++) {
                sum[j] = (sum[j]-rem[j][cnt[j]])/k;
                cnt[j]++;
                if (cnt[j]>=maxcnt) cnt[j] = maxcnt-1;
            }
            if (bl!=cl) {
                doupd(bl,b%SZ,SZ-1);
                recalc(bl);
                doupd(cl,0,c%SZ);
                recalc(cl);
            }
            else {
                doupd(bl,b%SZ,c%SZ);
                recalc(bl);
            }
        }
        else if (a==3) {
            b--; c--;
            int bl = b/SZ, cl = c/SZ; ll res = 0;
            for (j=bl+1;j<cl;j++) {
                res += sum[j];
            }
            if (bl!=cl) {
                doupd(bl,-1,-2);
                recalc(bl);
                for (j=b;j/SZ==bl;j++) res += arr[j];
                doupd(cl,-1,-2);
                recalc(cl);
                for (j=cl*SZ;j<=c;j++) res += arr[j];
            }
            else {
                doupd(bl,-1,-2);
                recalc(bl);
                for (j=b;j<=c;j++) res+=arr[j];
            }
            printf("%lld\n",res);
        }
    }
}

int main() {
    int i;

    //freopen("input","r",stdin);

    scanf("%d%d%d",&n,&q,&k);
    for (i=0;i<n;i++) scanf("%lld",&arr[i]);
    if (k==1) solve1();
    else solve();

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

sterilizing.cpp: In function 'int main()':
sterilizing.cpp:145:28: warning: format '%d' expects argument of type 'int*', but argument 4 has type 'll* {aka long long int*}' [-Wformat=]
     scanf("%d%d%d",&n,&q,&k);
                            ^
sterilizing.cpp: In function 'void solve1()':
sterilizing.cpp:37:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&a,&b,&c);
                                 ^
sterilizing.cpp: In function 'void solve()':
sterilizing.cpp:89:33: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d",&a,&b,&c);
                                 ^
sterilizing.cpp: In function 'int main()':
sterilizing.cpp:145:29: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d",&n,&q,&k);
                             ^
sterilizing.cpp:146:44: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     for (i=0;i<n;i++) scanf("%lld",&arr[i]);
                                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...