Submission #1281440

#TimeUsernameProblemLanguageResultExecution timeMemory
1281440huyngodzzFire (BOI24_fire)C++20
53 / 100
211 ms18560 KiB
///huynhocute123///
#include<bits/stdc++.h>
using namespace std;
#define S second
#define F first
#define pii pair<long long ,long long >
#define piii pair<int,pair<int,int>>
#define pb push_back
#define FOR(i, a, b) for(int i = a; i <= b; ++i)
#define REP(i, a, b) for(int i = b; i >= a; --i)
#define ALL(v) v.begin(),v.end()
#define inp(name) if(fopen(name, "r")) freopen(name, "r", stdin);
#define out(name) if(fopen(name, "w")) freopen(name, "w", stdout);
//random_device rd;
//mt19937 rng(rd());
//#pragma GCC optimize ("O3")
//#pragma GCC optimize ("unroll-loops")
//#pragma GCC target("popcnt")
//#define int long long
const int MAX = 1e9+9;
const long long  MAXLL = 1e18+9;
const double pi = 3.14159265358979323846;
const double rad = 3.14159265358979323846 /180;
bool minimize(int &u, int v){
    if(v < u){
        u = v;
        return 1;
    }
    return 0;
}
bool maximize(int &u, int v){
    if(v > u){
        u = v;
        return 1;
    }
    return 0;
}
bool maximizell(long long &u, long long v){
    if(v > u){
        u = v;
        return 1;
    }
    return 0;
}
bool minimizell(long long &u, long long v){
    if(v < u){
        u = v;
        return 1;
    }
    return 0;
}
const int  mod = 1e9 + 7;
inline int fastPow(int a, int n){
    if(n == 0) return 1;
    int t = fastPow(a, n >> 1);
    t = 1ll * t * t % mod;
    if(n & 1) t = 1ll * t * a % mod;
    return t;
}
inline void Add(int& x ,int y){
    x += y;
    if(x >= mod)x -=mod;
}
inline void Sub(int& x, int y){
    x-= y;
    if(x < 0)x += mod;
}
const int maxN = 8 * 1e5 + 999 ;
long long  n , m ;
pii shift[maxN];
vector<int> ar;
namespace sub1{
    bool check(){
        return (n <= 20);
    }
    struct sweep{
        long long  pos, kk;
        bool operator <(const sweep& rhs)const{
            if(pos != rhs.pos)return pos < rhs.pos;
            return kk < rhs.kk;
        }
    };
    vector<sweep>line;
    bool lmao(){
        sort(ALL(line));
//        for(auto [x , y] : line )cout << x << " " << y << '\n';
//        cout << '\n';
        int cnt =0 ;
        if(line[0].pos != 0)return 0;
        for(auto x : line){
            cnt += x.kk;

            if(cnt == 0)return 0;
        }
        return (cnt >= 1);
    }
    void solve(){
        int ans = MAX;
        FOR(mask , 1 , (1 << n) - 1){
            line.clear();
            FOR(i, 1, n){
                if( ((mask >> (i - 1)) & 1) == 1){
                    if(shift[i].F < shift[i].S){
                        line.pb({shift[i].F , 1});
                      if(shift[i].S + 1 <= m)line.pb({shift[i].S + 1 , -1});
                    }else{
                        line.pb({0  ,1});
                        line.pb({shift[i].S + 1 , -1});
                        line.pb({shift[i].F , 1});
                    }
                }
            }
//            cout << mask << '\n';
            if(lmao())minimize(ans, __builtin_popcount(mask));
        }
        cout << (ans == MAX ? -1 : ans);
    }
}
namespace sub2{
    long long  start = MAXLL, End;
    struct sweep{
        long long  pos, kk;
        bool operator <(const sweep& rhs)const{
            return pos < rhs.pos;
        }
    };
    vector<sweep>line;
    int mn[4 * maxN];
    int lazy[4 * maxN];

    void init(int id ,int l ,int r){
        mn[id] = MAX;
        lazy[id] =MAX;
        if(l == r)return;
        int mid = (l + r)/2;
        init(id << 1 , l ,mid);
        init(id<< 1 | 1, mid + 1, r);
    }
    void push(int id){
        if(lazy[id] >= MAX)return;
        minimize(lazy[id << 1] , lazy[id]);
        minimize(lazy[id << 1 | 1] , lazy[id]);
        minimize(mn[id << 1] , lazy[id]);
        minimize(mn[id << 1 | 1] , lazy[id]);
        lazy[id] = MAX;
    }
    void upd(int id ,int l ,int r, int u ,int v ,int val){
        if(v < l || u > r)return;
        if(u <= l && r <= v){
            minimize(mn[id] ,val);
            minimize(lazy[id] , val);
            return;
        }
        int mid = (l +r)/2;
        push(id);
        upd(id << 1 ,l ,mid ,u ,v, val);
        upd(id << 1 | 1,mid + 1, r, u ,v , val);
        minimize(mn[id], mn[id << 1 ]);
        minimize(mn[id], mn[id << 1 | 1]);
    }
    int get(int id ,int l ,int r , int u ,int v){
        if(v < l || u > r)return MAX;
        if(u <= l &&r <= v)return mn[id];
        int mid = (l + r)/2;
        push(id);
        return min(get(id << 1 , l,mid ,u ,v ) , get(id << 1 | 1,mid + 1, r, u ,v));
    }
    void solve(){
        FOR(i, 1, n){
           if(shift[i].F > shift[i].S){
                shift[i].S += m;
           }else{
                shift[i].S += m;
                shift[i].F += m;
           }
           assert(shift[i].F < shift[i].S);
           minimizell(start , shift[i].F);
//           cout << shift[i].F << " " << shift[i].S << '\n';
        }
        End = start + m;
//        cerr << start << " "<< End << '\n';
        FOR(i, 1, n){
            line.pb({shift[i].F , i});
            ar.pb(shift[i].F);
            ar.pb(shift[i].S);
        }
        ar.pb(start);
        ar.pb(End);
        sort(ALL(line));
        sort(ALL(ar));
        ar.erase(unique(ALL(ar)),ar.end());
        int sz = ar.size()  + 2;
        init(1 , 1 , sz);
        int id = lower_bound(ALL(ar) , start) - ar.begin() + 1;
        upd(1, 1, sz, id, id,  0);
        for(auto [tick , id] : line){
            int r = shift[id].S;
            r = lower_bound(ALL(ar), shift[id].S) - ar.begin() + 1;
            int l = lower_bound(ALL(ar), shift[id].F) - ar.begin() + 1;
            int val = get(1, 1 , sz, l , sz);
            upd(1, 1, sz , l , r ,val + 1);
        }
        int pos = lower_bound(ALL(ar) , End) - ar.begin() + 1;
        int ans = get(1, 1, sz , pos, sz);
        cout << (ans > n ? -1 : ans);
        cerr << (ans > n ? -1 : ans);
//        cout << start << '\n';
    }
}
inline void solve(){
    cin >> n >> m ;
    FOR(i, 1, n){
        long long  u ,v;cin >> u >> v;
        shift[i] = {u ,v};
    }
//    if(sub1::check())return sub1::solve();
//    if(sub2::check())return sub2::solve();
    return sub2::solve();
}
#define NAME "task"
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    if(fopen(NAME".inp", "r")){
        freopen(NAME".inp", "r" ,stdin);
        freopen(NAME".out", "w" ,stdout);
    }
    int tc = 1;
   // cin >> tc;
    while( tc-- )solve();
    cerr << '\n' << "Time elapsed: " << (1.0 * clock() / CLOCKS_PER_SEC) << " s\n" ;


}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:225:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  225 |         freopen(NAME".inp", "r" ,stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:226:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  226 |         freopen(NAME".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...
#Verdict Execution timeMemoryGrader output
Fetching results...