結果

問題 No.2421 entersys?
ユーザー FplusFplusFFplusFplusF
提出日時 2023-08-12 14:29:57
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 744 ms / 3,000 ms
コード長 4,286 bytes
コンパイル時間 3,040 ms
コンパイル使用メモリ 240,044 KB
実行使用メモリ 76,548 KB
最終ジャッジ日時 2024-11-19 19:47:20
合計ジャッジ時間 13,905 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
5,248 KB
testcase_01 AC 2 ms
5,248 KB
testcase_02 AC 4 ms
5,248 KB
testcase_03 AC 2 ms
5,248 KB
testcase_04 AC 2 ms
5,248 KB
testcase_05 AC 3 ms
5,248 KB
testcase_06 AC 3 ms
5,248 KB
testcase_07 AC 3 ms
5,248 KB
testcase_08 AC 3 ms
5,248 KB
testcase_09 AC 5 ms
5,248 KB
testcase_10 AC 3 ms
5,248 KB
testcase_11 AC 510 ms
58,332 KB
testcase_12 AC 540 ms
58,488 KB
testcase_13 AC 515 ms
58,484 KB
testcase_14 AC 524 ms
58,468 KB
testcase_15 AC 524 ms
58,480 KB
testcase_16 AC 517 ms
63,024 KB
testcase_17 AC 536 ms
62,788 KB
testcase_18 AC 530 ms
62,864 KB
testcase_19 AC 535 ms
62,856 KB
testcase_20 AC 534 ms
62,776 KB
testcase_21 AC 369 ms
46,716 KB
testcase_22 AC 466 ms
58,564 KB
testcase_23 AC 744 ms
76,548 KB
testcase_24 AC 733 ms
76,512 KB
testcase_25 AC 727 ms
76,496 KB
testcase_26 AC 275 ms
38,480 KB
testcase_27 AC 286 ms
38,468 KB
testcase_28 AC 287 ms
38,424 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> void chmin(T &a,T b){
    if(a>b){
        a=b;
    }
}
template<class T> void chmax(T &a,T b){
    if(a<b){
        a=b;
    }
}
template<class T> unordered_map<ll,ll> compress(vector<T> x){
    vector<T> unique_v=x;
    int n=x.size();
    sort(all(unique_v));
    unordered_map<ll,ll> mp;
    unique_v.erase(unique(all(unique_v)),unique_v.end());
    for(int i=0;i<n;i++){
        mp[x[i]]=lower_bound(all(unique_v),x[i])-unique_v.begin();
    }
    return mp;
}
struct segment_tree{
    vector<ll> v,lazy;
    ll n;
    segment_tree(ll x){
        ll s=1;
        while(s<x) s*=2;
        n=s;
        v.assign(s*2-1,0);
        lazy.assign(s*2-1,0);
    }
    void eval(ll k,ll l,ll r){
        if(lazy[k]!=0){
            v[k]+=lazy[k];
            if(1<r-l){
                lazy[2*k+1]+=lazy[k]/2;
                lazy[2*k+2]+=lazy[k]/2;
            }
        }
        lazy[k]=0;
    }
    void add(ll a,ll b,ll x){
        add_sub(a,b,x,0ll,0ll,n);
    }
    void add_sub(ll a,ll b,ll x,ll k,ll l, ll r){
        eval(k,l,r);
        if(r<=a||b<=l){
            return;
        }else if(a<=l&&r<=b){
            lazy[k]+=(r-l)*x;
            eval(k,l,r);
            return;
        }else{
            add_sub(a,b,x,k*2+1,l,(l+r)/2);
            add_sub(a,b,x,k*2+2,(l+r)/2,r);
            v[k]=v[k*2+1]+v[k*2+2];
            return;
        }
    }
    ll query(ll a,ll b){
        return query_sub(a,b,0ll,0ll,n);
    }
    ll query_sub(ll a,ll b,ll k,ll l,ll r){
        if(r<=a||b<=l){
            return 0;
        }
        eval(k,l,r);
        if(a<=l&&r<=b){
            return v[k];
        }else{
            ll vl=query_sub(a,b,k*2+1,l,(l+r)/2);
            ll vr=query_sub(a,b,k*2+2,(l+r)/2,r);
            return vl+vr;
        }
    }
};
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    ll n;
    cin >> n;
    vector<ll> v;
    unordered_map<string,set<pll>> mp;
    vector<ll> vl(n),vr(n);
    rep(i,n){
        string x;
        ll l,r;
        cin >> x >> l >> r;
        mp[x].insert({r,l});
        v.push_back(l);
        v.push_back(r);
        vl[i]=l;
        vr[i]=r;
    }
    for(auto &[k,st]:mp) st.insert({INF,INF});
    ll q;
    cin >> q;
    vector<vector<ll>> que(q);
    vector<string> str(q);
    rep(i,q){
        ll z;
        cin >> z;
        if(z==1){
            string x;
            ll t;
            cin >> x >> t;
            str[i]=x;
            que[i]={1,t};
        }
        if(z==2){
            ll t;
            cin >> t;
            que[i]={2,t};
            v.push_back(t);
        }
        if(z==3){
            string x;
            ll l,r;
            cin >> x >> l >> r;
            str[i]=x;
            que[i]={3,l,r};
            v.push_back(l);
            v.push_back(r);
        }
    }
    v.push_back(INF);
    unordered_map<ll,ll> z=compress(v);
    ll m=z.size();
    segment_tree st(m);
    rep(i,n) st.add(z[vl[i]],z[vr[i]]+1,1);
    rep(i,q){
        if(que[i].front()==1){
            string x=str[i];
            ll t=que[i][1];
            if(!mp.count(x)){
                cout << "No\n";
                continue;
            }
            auto itr=mp[x].upper_bound({t,t});
            ll l,r;
            tie(r,l)=(*itr);
            if(l<=t&&t<=r){
                cout << "Yes\n";
                continue;
            }
            if(itr!=mp[x].begin()){
                itr--;
                tie(r,l)=(*itr);
                if(l<=t&&t<=r){
                    cout << "Yes\n";
                    continue;
                }
            }
            cout << "No\n";
        }
        if(que[i].front()==2){
            ll t=que[i][1];
            if(!z.count(t)) assert(0);
            cout << st.query(z[t],z[t]+1) << '\n';
        }
        if(que[i].front()==3){
            string x=str[i];
            ll l=que[i][1],r=que[i][2];
            mp[x].insert({r,l});
            mp[x].insert({INF,INF});
            if(!z.count(l)||!z.count(r)) assert(0);
            st.add(z[l],z[r]+1,1);
        }
    }
}
0