結果

問題 No.2735 Demarcation
ユーザー FplusFplusFFplusFplusF
提出日時 2024-04-15 16:22:55
言語 C++23
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,666 bytes
コンパイル時間 2,986 ms
コンパイル使用メモリ 255,692 KB
実行使用メモリ 18,816 KB
最終ジャッジ日時 2024-10-11 11:53:58
合計ジャッジ時間 6,864 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 2 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 61 ms
18,688 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 AC 251 ms
17,280 KB
testcase_09 AC 58 ms
8,848 KB
testcase_10 AC 73 ms
10,956 KB
testcase_11 AC 25 ms
6,356 KB
testcase_12 AC 20 ms
5,248 KB
testcase_13 AC 43 ms
5,248 KB
testcase_14 AC 115 ms
13,888 KB
testcase_15 AC 40 ms
5,248 KB
testcase_16 AC 97 ms
15,856 KB
testcase_17 AC 84 ms
10,624 KB
testcase_18 AC 38 ms
6,400 KB
testcase_19 AC 124 ms
17,564 KB
testcase_20 AC 136 ms
16,812 KB
testcase_21 AC 67 ms
13,568 KB
testcase_22 AC 90 ms
18,048 KB
testcase_23 AC 30 ms
7,552 KB
testcase_24 AC 50 ms
10,624 KB
testcase_25 AC 77 ms
15,232 KB
testcase_26 AC 71 ms
14,336 KB
testcase_27 AC 66 ms
12,544 KB
testcase_28 AC 100 ms
18,688 KB
testcase_29 AC 104 ms
18,816 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using pll=pair<ll,ll>;
using tll=tuple<ll,ll,ll>;
using ld=long double;
const ll INF=(1ll<<60);
#define rep(i,n) for (ll i=0;i<(ll)(n);i++)
#define all(v) v.begin(),v.end()
template<class T> inline bool chmin(T &a,T b){
    if(a>b){
        a=b;
        return true;
    }
    return false;
}
template<class T> inline bool chmax(T &a,T b){
    if(a<b){
        a=b;
        return true;
    }
    return false;
}
ll cnt[1000001];
ll f_linear(vector<ll> a,ll n,ll k){  //O(n)
    if(k==0) return 0;
    
    vector<ll> vr(n,0);
    ll r=0,sz=0;
    rep(l,n){
        auto g=[&](ll idx){
            ll p=0;
            if(cnt[a[idx]]==0) p=1;
            return (sz+p)<=k;
        };
        while(r<n&&g(r)){
            if(cnt[a[r]]==0) sz++;
            cnt[a[r]]++;
            r++;
        }
        vr[l]=r;
        cnt[a[l]]--;
        if(cnt[a[l]]==0) sz--;
    }
    vector<__int128> dp(n+1,0),sum(n+2,0);
    dp[0]=1;
    rep(i,n+1){
        dp[i]+=sum[i];
        if(INF<dp[i]) return INF*2;
        if(i==n) break;
        sum[i+1]+=dp[i];
        sum[1+vr[i]]-=dp[i];
        sum[i+1]+=sum[i];
    }
    return dp[n];
}
void solve_linear(vector<ll> a,ll s,auto &f){  //O(N)
    ll n=(ll)a.size();
    ll ok=0;
    rep(i,n+1){
        if(f(a,n,i)<=s) chmax(ok,i);
        else break;
    }
    cout << ok << '\n';

}
void solve_b(vector<ll> a,ll s){  //O(M^2)
    return solve_linear(a,s,f_linear);
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll n;
    cin >> n;
    vector<ll> x(n);
    rep(i,n) cin >> x[i];
    x.push_back(INF);
    vector<ll> li,ri;
    ll cnt=1;
    rep(i,n){
        if(x[i]==x[i+1]) cnt++;
        else{
            if(cnt!=1){
                li.push_back(i-cnt+1);
                ri.push_back(i+1);
            }
            cnt=1;
        }
    }
    ll q;
    cin >> q;
    while(q--){
        ll l,r,s;
        cin >> l >> r >> s;
        l--;
        ll sz=r-l;
        if((1ll<<min(61ll,sz-1))<=s){
            cout << "-1\n";
            continue;
        }else if(sz<87){
            vector<ll> a;
            for(ll i=l;i<r;i++) a.push_back(x[i]);
            solve_b(a,s);
        }else{
            ll i=lower_bound(all(li),l)-li.begin();
            i=max(0ll,i-1);
            __int128 now=1;
            for(;i<(ll)li.size();i++){
                ll a=max(li[i],l),b=min(ri[i],r);
                ll k=b-a;
                if(k<=0) continue;
                now*=(1ll<<min(61ll,k-1));
                if(s<now) break;
            }
            if(s<now) cout << "0\n";
            else cout << "1\n";
        }
    }
}
0