Submission #1290853

#TimeUsernameProblemLanguageResultExecution timeMemory
1290853uocgiInspections (NOI23_inspections)C++20
77 / 100
1741 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define pb push_back
#define ii pair<int,int>
#define int long long
#define TASK "Inspections"
const int maxn = 3e5+5;
const int mod = 1e9+7;
int m,n,q;
ii a[maxn];
namespace sub1{
    vector<int> b;
    int pos[maxn];
    int calc(int x){
        int cnt = 0;
        for (int i = 1;i<=n;i++) pos[i] = -1;
        for (int i = (int)b.size()-1;i>=0;i--){
//            cout << i << " " << pos[b[i]] << "\n";
            if (pos[b[i]]!=-1){
                if (pos[b[i]]-i-1>=x) cnt++;
            }
            pos[b[i]] = i;
        }
        return cnt;
    }
    void solve(){
        for (int i = 1;i<=m;i++){
            for (int j = a[i].fi;j<=a[i].se;j++){
                b.pb(j);
            }
        }
//        for (int x : b) cout << x << " ";
//        cout << "\n";
        while (q--){
            int x; cin >> x;
            cout << calc(x) << " ";
        }
    }
}
namespace sub2{
    vector<int> b;
    int pos[maxn];
    int calc(int x){
        int cnt = 0;
        for (int i = 1;i<=n;i++) pos[i] = -1;
        for (int i = (int)b.size()-1;i>=0;i--){
//            cout << i << " " << pos[b[i]] << "\n";
            if (pos[b[i]]!=-1){
                if (pos[b[i]]-i-1>=x) cnt++;
            }
            pos[b[i]] = i;
        }
        return cnt;
    }
    vector<int> diff;
    void prepare(){
        for (int i = 1;i<=n;i++) pos[i] = -1;
        for (int i = (int)b.size()-1;i>=0;i--){
//            cout << i << " " << pos[b[i]] << "\n";
            if (pos[b[i]]!=-1){
                diff.pb(pos[b[i]]-i-1);
            }
            pos[b[i]] = i;
        }
        sort(diff.begin(),diff.end());
    }
    void solve(){
        for (int i = 1;i<=m;i++){
            for (int j = a[i].fi;j<=a[i].se;j++){
                b.pb(j);
            }
        }
//        for (int x : b) cout << x << " ";
        prepare();
        while (q--){
            int x; cin >> x;
            int lb = lower_bound(diff.begin(),diff.end(),x)-diff.begin();
            cout << diff.size()-lb << " ";
        }
    }
}
namespace sub3{
    map<int,int> mp;
    bool check(){
        for (int i = 1;i<=m;i++) if (a[i].fi!=1) return 0;
        return 1;
    }
    int pre[maxn];
    void solve(){
        stack<int> st;
        for (int i = 1;i<=m;i++){
            pre[i] = pre[i-1]+a[i].se;
        }
        for (int i = m;i>=1;i--){
            int cur = i;
            while (st.size() && a[st.top()].se<=a[i].se){
                if (cur == i) mp[a[i].se-1]+= a[st.top()].se;
                else {
//                    cout << i << " " << st.top() << " " << cur << "\n";
//                    cout << i << ' ' << st.top() << " " << a[i].se-1+pre[st.top()-1]-pre[cur] <<  "\n";
                    mp[a[i].se-1+pre[st.top()-1]-pre[i]]+=a[st.top()].se-a[cur].se;
                }
                cur = st.top();
                st.pop();
            }
            if (st.size()){
//                cout << i << " " << st.top() << "\n";
                if (cur == i){
                    mp[a[i].se-1]+=a[i].se;
                }
                else {
                    mp[a[i].se-1+pre[st.top()-1]-pre[i]]+=a[i].se-a[cur].se;
                }
            }
            st.push(i);
        }
        vector<int> val,tt;
        int tmpp = 0;
        for (ii x : mp){
            tmpp+= x.se;
            val.pb(tmpp);
            tt.pb(x.fi);
//            cout << x.fi << " " << x.se << "\n";
        }
        for (int i = 1;i<=q;i++){
            int x; cin >> x;
            int ub = lower_bound(tt.begin(),tt.end(),x)-tt.begin();
            if (ub == tt.size()){
                cout << 0 << " ";
            }
            else {
                if (!ub) cout << tmpp << " ";
                else cout << tmpp-val[ub-1] << " ";
            }
        }
    }
}
namespace sub4{
    struct segtree{
        int st[maxn*4],lz[maxn*4];
        void init(){
            for (int i = 1;i<=n*4;i++) lz[i] = -1;
        }
        void push(int id, int l, int r){
            if (lz[id]!=-1 && l!=r){
                int m = l+r>>1;
                st[id*2] = (m-l+1)*lz[id];
                st[id*2+1] = (r-m)*lz[id];
                lz[id*2] = lz[id];
                lz[id*2+1] = lz[id];
                lz[id] = -1;
            }
        }
        void up(int id, int l, int r, int u, int v, int val){
            if (u>r || l>v) return;
            push(id,l,r);
            if (l>=u &&r<=v) {
                st[id]=(r-l+1)*val;
                lz[id]=val;
                push(id,l,r);
                return;
            }
            int m= l+r>>1;
            up(id*2,l,m,u,v,val);
            up(id*2+1,m+1,r,u,v,val);
            st[id] = st[id*2]+st[id*2+1];
        }
        int get(int id, int l, int r, int u, int v){
            if (u>r || l>v) return 0;
            push(id,l,r);
            if (l>=u && r<=v) return st[id];
            int m = l+r>>1;
            return get(id*2,l,m,u,v)+get(id*2+1,m+1,r,u,v);
        }
    } it;
    unordered_map<int,int> mp;
    int pre[maxn];
    void solve(){
        it.init();
        for (int i = 1;i<=m;i++){
            pre[i]+= pre[i-1]+a[i].se-a[i].fi+1;
        }
        for (int i = 1;i<=m;i++){
            it.up(1,1,n,1,n,0);
            it.up(1,1,n,a[i].fi,a[i].se,1);
            int cur = a[i].se-a[i].fi+1;
            for (int j = i+1;j<=m;j++){
                if (cur== 0) break;
                if (a[i].se-a[j].fi+pre[j-1]-pre[i]<0) continue;
//                cout << a[i].se-a[j].fi+1+pre[j-1]-pre[i]  << " " << i <<  " " << j<< "\n";
                int sum = it.get(1,1,n,a[j].fi,a[j].se);
                mp[a[i].se-a[j].fi+pre[j-1]-pre[i]]+= sum;
                cur-=sum;
                it.up(1,1,n,a[j].fi,a[j].se,0);
            }
        }
//        cout << pre[2]-pre[1] << "\n";
//        cout << it.get(1,1,n,1,n);
//        for (ii x : mp){
//            cout << x.fi << " " << x.se << "\n";
//        }
        vector<int> val,tt;
        vector<ii> b;
        int tmpp = 0;
        for (ii x : mp){
            b.pb(x);
//            tmpp+= x.se;
//            val.pb(tmpp);
//            tt.pb(x.fi);
//            cout << x.fi << " " << x.se << "\n";
        }
        sort(b.begin(),b.end());
        for (ii x : b){
            tmpp+=x.se;
            val.pb(tmpp);
            tt.pb(x.fi);
        }
        for (int i = 1;i<=q;i++){
            int x; cin >> x;
            int ub = lower_bound(tt.begin(),tt.end(),x)-tt.begin();
            if (ub == tt.size()){
                cout << 0 << " ";
            }
            else {
                if (!ub) cout << tmpp << " ";
                else cout << tmpp-val[ub-1] << " ";
            }
        }
    }
}
signed main(){
    ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    if (fopen(TASK".inp","r")){
        freopen(TASK".inp","r",stdin);
        freopen(TASK".out","w",stdout);
    }
    cin >> n >> m >> q;
    for (int i = 1;i<=m;i++) cin >> a[i].fi >> a[i].se;
//    sub1::solve();
//    sub2::solve();
//    sub4::solve();
    if (sub3::check()) sub3::solve();
    else if (m<=2000) sub4::solve();
    else sub2::solve();
//    sub3::solve();
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:237:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  237 |         freopen(TASK".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Main.cpp:238:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  238 |         freopen(TASK".out","w",stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...