답안 #581344

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
581344 2022-06-22T13:48:02 Z Lobo Alternating Current (BOI18_alternating) C++17
0 / 100
54 ms 13156 KB
#include<bits/stdc++.h>
using namespace std;

const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()

const int maxn = 2e5+10;

int n, m, pai[maxn], ps[maxn], ans[maxn], bit[maxn];

void att(int pos) {
    for(int i = pos; i <= 2*n; i+= i&-i) bit[i]++;
}
int qrr(int pos) {
    int val = 0;
    for(int i = pos; i > 0; i-=i&-i) val+=bit[i];
    return val;
}

bool cmp(pair<pair<int,int>,int> a, pair<pair<int,int>,int> b) {
    if(a.fr.fr == b.fr.fr) {
        return a.fr.sc > b.fr.sc;
    }
    return a.fr.fr < b.fr.fr;
}

void solve() {
    cin >> n >> m;
    vector<pair<pair<int,int>,int>> segs;
    vector<pair<int,int>> vec;
    for(int i = 0; i < m; i++) {
        int a,b; cin >> a >> b;
        vec.pb(mp(a,b));
        pai[i] = i;
        if(b >= a) {
            ps[a]++;
            ps[b+1]--;
            ps[a+n]++;
            ps[b+n+1]--;

            segs.pb(mp(mp(a,b),i));
            segs.pb(mp(mp(a+n,b+n),i));
        }
        else {
            ps[a]++;
            ps[b+n+1]--;
            ps[1]++;
            ps[b+1]--;
            ps[a+n]++;
            ps[2*n+1]--;
            segs.pb(mp(mp(a,b+n),i));
        }
    }

    sort(all(segs),cmp); //menor L, maior R
    priority_queue<pair<pair<int,int>,int>,vector<pair<pair<int,int>,int>>,greater<pair<pair<int,int>,int>>> pq;
    for(auto X : segs) {
        int l = X.fr.fr;
        int r = X.fr.sc;
        int id = X.sc;

        if(qrr(2*n-r+1) != 0) {
            pai[id] = -1;
        }
        att(2*n-r+1);
    }

    segs.clear();
    for(int i = 0; i < m; i++) {
        // cout << i << " " << pai[i] << endl;
        if(pai[i] == i) {
            int a = vec[i].fr;
            int b = vec[i].sc;
            if(b >= a) {
                segs.pb(mp(mp(a,b),i));
            }
            else {
                segs.pb(mp(mp(a,b+n),i));
            }
        }
    }
    sort(all(segs));

    for(int i = 0; i < m; i++) {
        if(pai[i] == i) continue;
        int l1 = vec[i].fr;
        int r1 = vec[i].sc;
        //ve o ultimo com l menor ou igual a l1
        auto it = lower_bound(all(segs),mp(mp(l1,inf),0LL));
        if(it != segs.begin()) {
            it--;
            int l2,r2,id;
            l2 = it->fr.fr;
            r2 = it->fr.sc;
            id = it->sc;
            //ve se da certo com esse
            if(l1 >= l2 && r1 <= r2) {
                pai[i] = id;
                continue;
            }
        }

        //tenta com l1+n e r1+n
        l1+= n;
        r1+= n;
        it = lower_bound(all(segs),mp(mp(l1,inf),0LL));
        if(it != segs.begin()) {
            it--;
            int l2,r2,id;
            l2 = it->fr.fr;
            r2 = it->fr.sc;
            id = it->sc;
            //ve se da certo com esse
            if(l1 >= l2 && r1 <= r2) {
                pai[i] = id;
                continue;
            }
        }
    }

    bool ok = true;
    for(int i = 1; i <= 2*n; i++) {
        ps[i]+=ps[i-1];
        if(ps[i] < 2) ok = false;
    }
    if(!ok) {
        cout << "impossible" << endl;
        return;
    }

    if((((int) segs.size())&1) == 0) {
        for(int i = 0; i < segs.size(); i++) {
            int id = segs[i].sc;
            ans[id] = i&1;
        }
        for(int i = 0; i < m; i++) {
            if(pai[i] == i) continue;
            ans[i] = ans[pai[i]]^1;
        }

        for(int i = 0; i < m; i++) {
            cout << ans[i];
        }cout << endl;
    }
    else {
        if(segs.size() == 1) {
            ans[segs[0].sc] = 1;

            int ps0[maxn], ps1[maxn];
            for(int i = 0; i <= n; i++) {
                ps0[i] = ps1[0] = 0;
            }
            for(auto x : segs) {
                // cout << x.fr.fr << " " << x.fr.sc << " " << x.sc << endl;
            }

            for(int i = 0; i < m; i++) {
                // cout << i << " -> " << vec[pai[i]].fr << " " << vec[pai[i]].sc << endl;
                int a = vec[i].fr;
                int b = vec[i].sc;
                if(b >= a) {
                    if(ans[i] == 0) {
                        ps0[a]++;
                        ps0[b+1]--;
                    }
                    else {
                        ps1[a]++;
                        ps1[b+1]--;
                    }
                }
                else {
                    if(ans[i] == 0) {
                        ps0[b]++;
                        ps0[1]++;
                        ps0[a+1]--;
                    }
                    else {
                        ps1[b]++;
                        ps1[1]++;
                        ps1[a+1]--;
                    }
                }
            }

            bool okk = false;
            for(int i = 1; i <= n; i++) {
                ps0[i]+= ps0[i-1];
                ps1[i]+= ps1[i-1];
                if(ps0[i] == 0 || ps1[i] == 0) {
                    okk = true;
                }
            }
            if(okk) {
                cout << n<<"--"<<m<<"---";
                cout << segs[0].fr.fr<<"--"<<segs[0].fr.sc;
                return;
            }

            for(int i = 0; i < m; i++) {
                cout << ans[i];
            }cout << endl;
            return;
        }
        bool ok = false;
        for(int i = 0; i+1 < segs.size(); i++) {
            int l1 = segs[i].fr.fr;
            int r1 = segs[i].fr.sc;
            int l2 = segs[i+1].fr.fr;
            int r2 = segs[i+1].fr.sc;

            //a area coberta por dois é l2 até r1
            int l = l2;
            int r = r1;
            bool ok1 = true;
            for(int i = l; i <= r; i++) {
                if(ps[i] < 3) {
                    ok1 = false;
                    break;
                }
            }
            if(ok1) {
                int cnt = 0;
                for(int j = i+1; j < segs.size(); j++) {
                    int id = segs[j].sc;
                    ans[id]=cnt;
                    cnt^=1;
                }
                for(int j = 0; j <= i; j++) {
                    int id = segs[j].sc;
                    ans[id]=cnt;
                    cnt^=1;
                }
                ok = true;
                break;
            }
        }

        if(ok == false) {
            //ultimo com o primeiro
            int l1 = segs.back().fr.fr;
            int r1 = segs.back().fr.sc;
            int l2 = segs[0].fr.fr+n;
            int r2 = segs[0].fr.sc+n;
            int l = l2;
            int r = r1;
            bool ok1 = true;
            for(int i = l; i <= r; i++) {
                if(ps[i] < 3) {
                    ok1 = false;
                    break;
                }
            }
            if(ok1) {
                int cnt = 0;
                for(int j = 0; j < segs.size(); j++) {
                    int id = segs[j].sc;
                    ans[id]=cnt;
                    cnt^=1;
                }
                ok = true;
            }
 
        }
        if(ok == false) {
            cout << "impossible" << endl;
            return;
        }
        for(int i = 0; i < m; i++) {
            if(pai[i] == i) continue;
            ans[i] = ans[pai[i]]^1;
        }
        for(int i = 0; i < m; i++) {
            cout << ans[i];
        }cout << endl;

    }






    int ps0[maxn], ps1[maxn];
    for(int i = 0; i <= n; i++) {
        ps0[i] = ps1[0] = 0;
    }
    for(auto x : segs) {
        // cout << x.fr.fr << " " << x.fr.sc << " " << x.sc << endl;
    }

    for(int i = 0; i < m; i++) {
        // cout << i << " -> " << vec[pai[i]].fr << " " << vec[pai[i]].sc << endl;
        int a = vec[i].fr;
        int b = vec[i].sc;
        if(b >= a) {
            if(ans[i] == 0) {
                ps0[a]++;
                ps0[b+1]--;
            }
            else {
                ps1[a]++;
                ps1[b+1]--;
            }
        }
        else {
            if(ans[i] == 0) {
                ps0[b]++;
                ps0[1]++;
                ps0[a+1]--;
            }
            else {
                ps1[b]++;
                ps1[1]++;
                ps1[a+1]--;
            }
        }
    }

    bool okk = false;
    for(int i = 1; i <= n; i++) {
        ps0[i]+= ps0[i-1];
        ps1[i]+= ps1[i-1];
        if(ps0[i] == 0 || ps1[i] == 0) {
            okk = true;
        }
    }
    if(okk) {
        cout << "penis";
    }

}

int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);

    // freopen("in.in", "r", stdin);
    // freopen("out.out", "w", stdout);
    int tt = 1;
    // cin >> tt;
    while(tt--) {
        solve();
    }

}

Compilation message

alternating.cpp: In function 'void solve()':
alternating.cpp:66:13: warning: unused variable 'l' [-Wunused-variable]
   66 |         int l = X.fr.fr;
      |             ^
alternating.cpp:140:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  140 |         for(int i = 0; i < segs.size(); i++) {
      |                        ~~^~~~~~~~~~~~~
alternating.cpp:161:22: warning: variable 'x' set but not used [-Wunused-but-set-variable]
  161 |             for(auto x : segs) {
      |                      ^
alternating.cpp:213:28: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  213 |         for(int i = 0; i+1 < segs.size(); i++) {
      |                        ~~~~^~~~~~~~~~~~~
alternating.cpp:231:36: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  231 |                 for(int j = i+1; j < segs.size(); j++) {
      |                                  ~~^~~~~~~~~~~~~
alternating.cpp:214:17: warning: unused variable 'l1' [-Wunused-variable]
  214 |             int l1 = segs[i].fr.fr;
      |                 ^~
alternating.cpp:217:17: warning: unused variable 'r2' [-Wunused-variable]
  217 |             int r2 = segs[i+1].fr.sc;
      |                 ^~
alternating.cpp:263:34: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<std::pair<long long int, long long int>, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  263 |                 for(int j = 0; j < segs.size(); j++) {
      |                                ~~^~~~~~~~~~~~~
alternating.cpp:248:17: warning: unused variable 'l1' [-Wunused-variable]
  248 |             int l1 = segs.back().fr.fr;
      |                 ^~
alternating.cpp:251:17: warning: unused variable 'r2' [-Wunused-variable]
  251 |             int r2 = segs[0].fr.sc+n;
      |                 ^~
alternating.cpp:295:14: warning: variable 'x' set but not used [-Wunused-but-set-variable]
  295 |     for(auto x : segs) {
      |              ^
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3388 KB Expected EOF
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3388 KB Expected EOF
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3388 KB Expected EOF
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 54 ms 13156 KB Expected EOF
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3388 KB Expected EOF
2 Halted 0 ms 0 KB -