結果

問題 No.973 余興
ユーザー RubikunRubikun
提出日時 2024-11-24 19:01:27
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 626 ms / 4,000 ms
コード長 4,170 bytes
コンパイル時間 2,467 ms
コンパイル使用メモリ 213,004 KB
実行使用メモリ 11,392 KB
最終ジャッジ日時 2024-11-24 19:01:51
合計ジャッジ時間 22,509 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 506 ms
11,264 KB
testcase_01 AC 537 ms
11,264 KB
testcase_02 AC 510 ms
11,244 KB
testcase_03 AC 509 ms
11,136 KB
testcase_04 AC 542 ms
11,264 KB
testcase_05 AC 525 ms
11,264 KB
testcase_06 AC 518 ms
11,264 KB
testcase_07 AC 495 ms
11,264 KB
testcase_08 AC 495 ms
11,264 KB
testcase_09 AC 532 ms
11,136 KB
testcase_10 AC 461 ms
10,948 KB
testcase_11 AC 136 ms
6,820 KB
testcase_12 AC 137 ms
6,816 KB
testcase_13 AC 139 ms
6,816 KB
testcase_14 AC 143 ms
6,816 KB
testcase_15 AC 13 ms
6,820 KB
testcase_16 AC 13 ms
6,816 KB
testcase_17 AC 9 ms
6,816 KB
testcase_18 AC 11 ms
6,816 KB
testcase_19 AC 10 ms
6,820 KB
testcase_20 AC 9 ms
6,816 KB
testcase_21 AC 13 ms
6,820 KB
testcase_22 AC 13 ms
6,816 KB
testcase_23 AC 11 ms
6,816 KB
testcase_24 AC 12 ms
6,816 KB
testcase_25 AC 6 ms
6,820 KB
testcase_26 AC 8 ms
6,820 KB
testcase_27 AC 15 ms
6,820 KB
testcase_28 AC 10 ms
6,816 KB
testcase_29 AC 10 ms
6,816 KB
testcase_30 AC 590 ms
11,264 KB
testcase_31 AC 624 ms
11,136 KB
testcase_32 AC 587 ms
11,264 KB
testcase_33 AC 575 ms
11,136 KB
testcase_34 AC 605 ms
11,264 KB
testcase_35 AC 573 ms
11,392 KB
testcase_36 AC 562 ms
11,136 KB
testcase_37 AC 585 ms
11,144 KB
testcase_38 AC 601 ms
11,264 KB
testcase_39 AC 625 ms
11,136 KB
testcase_40 AC 2 ms
6,816 KB
testcase_41 AC 2 ms
6,820 KB
testcase_42 AC 1 ms
6,816 KB
testcase_43 AC 1 ms
6,816 KB
testcase_44 AC 2 ms
6,816 KB
testcase_45 AC 2 ms
6,816 KB
testcase_46 AC 626 ms
11,392 KB
testcase_47 AC 612 ms
11,264 KB
testcase_48 AC 619 ms
11,264 KB
testcase_49 AC 528 ms
10,800 KB
testcase_50 AC 595 ms
11,264 KB
testcase_51 AC 589 ms
11,264 KB
testcase_52 AC 572 ms
11,136 KB
testcase_53 AC 603 ms
11,184 KB
testcase_54 AC 591 ms
11,264 KB
testcase_55 AC 596 ms
11,264 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pair<int,int>>
#define vll vector<pair<ll,ll>>
#define vvi vector<vector<int>>
#define vvl vector<vector<ll>>
#define vvii vector<vector<pair<int,int>>>
#define vvll vector<vector<pair<ll,ll>>>
#define vst vector<string>
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pb push_back
#define all(x) (x).begin(),(x).end()
#define mkunique(x) sort(all(x));(x).erase(unique(all(x)),(x).end())
#define fi first
#define se second
#define mp make_pair
#define si(x) int(x.size())
const int mod=998244353,MAX=300005,INF=15<<26;

//fastset

// https://www.dropbox.com/s/1zxohqaxrb87uft/Gifted_Infants_The_University_of_Tokyo___erated_files-job_14.pdf?dl=0

using uint = unsigned int ; using ll = long long ; using ull = unsigned long long ; template < class T > using V = vector <T>; template < class T > using VV = V <V<T>>;

int popcnt ( uint x ) { return __builtin_popcount(x); } int popcnt ( ull x ) { return __builtin_popcountll(x); } int bsr ( uint x ) { return 31 - __builtin_clz(x); } int bsr ( ull x ) { return 63 - __builtin_clzll(x); } int bsf ( uint x ) { return __builtin_ctz(x); } int bsf ( ull x ) { return __builtin_ctzll(x); }

struct FastSet {
    static constexpr uint B = 64 ;
    int n, lg;
    VV<ull> seg;
    FastSet( int _n) : n(_n) {
        do {
            seg.push_back(V<ull>((_n + B - 1 ) / B));
            _n = (_n + B - 1 ) / B;
        }while (_n > 1 );
        lg = seg.size();
    }
    bool operator []( int i) const {
        return (seg[ 0 ][i / B] >> (i % B) & 1 ) != 0 ;
    }
    void set ( int i) {
        for ( int h = 0 ; h < lg; h++) {
            seg[h][i / B] |= 1ULL << (i % B); i /= B;
        }
    }
    void reset ( int i) {
        for ( int h = 0 ; h < lg; h++) {
            seg[h][i / B] &= ~( 1ULL << (i % B));
            if (seg[h][i / B]) break ;
            i /= B;
        }
    }
    int next ( int i) {
        if (i < 0) i = 0;
        if (i > n) i = n;
        for ( int h = 0 ; h < lg; h++) {
            if (i / B == seg[h].size()) break ;
            ull d = seg[h][i / B] >> (i % B);
            if (!d) {
                i = i / B + 1 ;
                continue ;
            }
            i += bsf(d);
            for ( int g = h - 1 ; g >= 0 ; g--) {
                i *= B; i += bsf(seg[g][i / B]);
            }
            return i;
        }
        return n;
    }
    // i以上
    int prev ( int i) {
        if (i < 0) i = 0;
        if (i > n) i = n;
        i--;
        for ( int h = 0 ; h < lg; h++) {
            if (i == -1 ) break ;
            ull d = seg[h][i / B] << ( 63 - i % 64 );
            if (!d) {
                i = i / B - 1 ;
                continue ;
            }
            i += bsr(d) - (B - 1 );
            for ( int g = h - 1 ; g >= 0 ; g--) {
                i *= B;
                i += bsr(seg[g][i / B]);
            }
            return i;
        }
        return -1 ;
    }
    // i未満
};

int main(){
    
    std::ifstream in("text.txt");
    std::cin.rdbuf(in.rdbuf());
    cin.tie(0);
    ios::sync_with_stdio(false);
    
    ll N;cin>>N;
    ll X;cin>>X;
    vl S(N+1);
    for(int i=0;i<N;i++){
        ll x;cin>>x;
        S[i+1]=S[i]+x;
    }
    
    vector<FastSet> L(N+1,FastSet(N+1)),R(N+1,FastSet(N+1));
    for(int i=0;i<N;i++){
        L[i].set(i+1);
        R[i+1].set(i);
    }
    for(int len=2;len<=N;len++){
        for(int l=0;l+len<=N;l++){
            int r=l+len;
            bool ok=false;
            {
                int x=L[l].prev(r);
                if(x>=l&&S[r]-S[x]<=X) ok=true;
            }
            {
                int x=R[r].next(l);
                if(x<=r&&S[x]-S[l]<=X) ok=true;
            }
            
            if(!ok){
                L[l].set(r);
                R[r].set(l);
            }
        }
    }
    
    if(L[0][N]) cout<<"B\n";
    else cout<<"A\n";
}


0