답안 #201218

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
201218 2020-02-09T20:24:15 Z brcode Nekameleoni (COCI15_nekameleoni) C++14
140 / 140
1903 ms 494200 KB
#include <iostream>
#include <bits/stdc++.h>
#define INF 1e9
using namespace std;
const int MAXN = 1e5;
int n,k,q;
int v[MAXN+2];

struct node{
    int len;
    pair<long long,int> suff[52],pref[52];
    int ans;
};

node seg[3*MAXN + 2];
bool check(long long a,long long b){
    return (a&b) == a;
}
void upd(int a,int b){
    a+=(1LL<<17);
    seg[a].len = 1;
    seg[a].pref[0] = make_pair(1LL<<b,a-(1LL<<17));
    seg[a].suff[0] = seg[a].pref[0];
    seg[a].ans = INF;
    for(a/=2;a;a>>=1){
        int lp,r1;
        lp = 0;
        //setting prefixes to child prefixes
        for(int i=0;i<seg[a*2].len;i++){
            seg[a].pref[lp++] = seg[a*2].pref[i];
        }
        for(int i=0;i<seg[a*2+1].len;i++){
            if(lp==0||!check(seg[a*2+1].pref[i].first,seg[a].pref[lp-1].first)){
                seg[a].pref[lp] =seg[a*2 + 1].pref[i];
                if(lp>0){
                    seg[a].pref[lp].first|=seg[a].pref[lp-1].first;
                }
                lp++;
            }
        }
        //setting suffixes to child suffixes
        r1 = 0;
        for(int i=0;i<seg[a*2+1].len;i++){
            seg[a].suff[r1++] = seg[a*2 + 1].suff[i];
        }
        for(int i=0;i<seg[a*2].len;i++){
            if(r1 == 0||!check(seg[a*2].suff[i].first,seg[a].suff[r1-1].first)){
                seg[a].suff[r1] = seg[a*2].suff[i];
                if(r1){
                    seg[a].suff[r1].first|=seg[a].suff[r1-1].first;
                }
                r1++;
            }
        }
        seg[a].len = lp;
        seg[a].ans = INF;
        int prefpos = 0;
        //set the whole suffix to be the answer at the start, then decrease the suffix and accordingly increase the prefix
        for(int suffpos = seg[a*2].len-1;suffpos>=0;suffpos--){
            while(prefpos<seg[a*2+1].len && (seg[a*2].suff[suffpos].first|seg[a*2+1].pref[prefpos].first)!=(1LL<<k)-1){
                prefpos++;
            }
            if(prefpos<seg[a*2 + 1].len){
                long long currmask = (seg[a*2].suff[suffpos].first|seg[a*2+1].pref[prefpos].first);
                if(currmask==(1LL<<k)-1){
                    seg[a].ans = min(seg[a].ans,seg[a*2+1].pref[prefpos].second -seg[a*2].suff[suffpos].second+1);
                }
            }
            seg[a].ans = min(seg[a].ans,min(seg[2*a].ans,seg[a*2+1].ans));
        }
    }
}
int main() {
    cin>>n>>k>>q;
    for(int i=0;i<=280000;i++){
        seg[i].ans = INF;
    }
    for(int i=0;i<n;i++){
        cin>>v[i];
        upd(i,v[i]-1);
    }
    while(q--){
        int type;
        cin>>type;
        if(type == 2){
            if(seg[1].ans == INF){
                cout<<-1LL<<endl;
            }else{
                cout<<seg[1].ans<<endl;
            }
        }else{
            int a,b;
            cin>>a>>b;
            a--;
            b--;
            upd(a,b);
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 429 ms 493552 KB Output is correct
2 Correct 301 ms 493432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 319 ms 493424 KB Output is correct
2 Correct 313 ms 493536 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 339 ms 493648 KB Output is correct
2 Correct 327 ms 493564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 684 ms 493688 KB Output is correct
2 Correct 1290 ms 493812 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 984 ms 493744 KB Output is correct
2 Correct 1397 ms 494108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1112 ms 493796 KB Output is correct
2 Correct 1466 ms 493952 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1467 ms 493816 KB Output is correct
2 Correct 1508 ms 493924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1323 ms 493944 KB Output is correct
2 Correct 1443 ms 494200 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1665 ms 493968 KB Output is correct
2 Correct 1477 ms 494092 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1903 ms 494072 KB Output is correct
2 Correct 1450 ms 494072 KB Output is correct