Submission #1228435

#TimeUsernameProblemLanguageResultExecution timeMemory
1228435Aldas25Joker (BOI20_joker)C++20
14 / 100
2095 ms7176 KiB
#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
 
#include <bits/stdc++.h>
 
using namespace std;
 
#define FAST_IO ios_base::sync_with_stdio(0); cin.tie(nullptr)
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define REP(n) FOR(O, 1, (n))
#define pb push_back
#define f first
#define s second
typedef long double ld;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
typedef vector<int> vi;
typedef vector<pii> vii;
typedef vector<ll> vl;
typedef vector<piii> viii;
//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
const int MAXN = 1000100, MAXK = 23;
const ll MOD = 1e9+7;
//const ll MOD = 998244353;
const ll INF = 1e16;
const ld PI = asin(1) * 2;
 
void setIO () {
    FAST_IO;
}
 
void setIO (string s) {
    setIO();
    freopen((s+".in").c_str(),"r",stdin);
    freopen((s+".out").c_str(),"w",stdout);
}
 
int n, m, q;
 
int cycleFound = 0;
int par[MAXN], sz[MAXN];
int unitCnt = 0;
 
 
 
//stack<pair<int, pii>> st; /// {v, par[v], sz[v]}
stack<int> st;
int find (int a) {
    if (par[a] == a) return a;
    //par[a] = find(par[a]);
    return find(par[a]);
}
bool same (int a, int b){
    return find(a) == find(b);
}
bool inCycle (int a) {
    int nA = (a > n ? (a-n) : (a+n));
    return same(a, nA);
}
void unite (int a, int b) {
    a = find(a), b = find(b);
    if (a == b) return;
 
 
   // bool wassame = same(a, nA);
 
    if (sz[a] < sz[b]) swap(a,b);
 
    //sizes.push(st.size());
    //st.push({b, {par[b], sz[b]});
    st.push(b);
    unitCnt++;
    par[b] = a;
    sz[a] += sz[b];
 
    if (inCycle(b)) {
        cycleFound++;
       // cout << " cyclefoind = " << a << " " << nA << endl;
    }
}
void rollback() {
    /*auto pp = st.top();
    st.pop();
    int b = st.f;
    int prevPar = st.s.f;
    int prevSz = st.s.s;
    sz[b] = prevSz;
    sz[par[b]] -= sz[b];
    par[b] = prevPar;*/
 
    int b = st.top();
    if (inCycle(b)) cycleFound--;
    st.pop();
    sz[par[b]] -= sz[b];
    par[b] = b;
    unitCnt--;
}
void resetDSU () {
    while (!st.empty()) {st.pop();}
    FOR(i ,1 ,2*n) par[i] = i;
    FOR(i ,1, 2*n) sz[i] = 1;
    cycleFound = false;
    unitCnt= 0;
}
 
 
//vi adj[MAXN];
 
pii edges[MAXN];
 
void addE (int id) {
    if (id > m) return;
    if (id < 1) return;
    int u = edges[id].f;
    int v = edges[id].s;
    unite (u, v+n);
    unite (v, u+n);
   // cout <<"  added " << u << "-" << (v+n) << "  and  " << v << "-" << (u+n) << endl;
}
 
int last[MAXN];
 
void rec (int l1, int l2, int r1, int r2) {
 
    int tmp = unitCnt;
 
    int lmid = (l1+l2)/2;
    FOR(i, l1, lmid-1) addE(i);
 
    int rmid;
 
    for (int i = r2; i >= r1; i--){
        addE(i);
        if (cycleFound) {
            last[lmid] = i;
            rmid = i;
            break;
        }
    }
 
   // cout << "   rec [" << l1 << "," << l2 << "]  [" << r1 << "," << r2 << "]" << endl;
   // cout << "  lmid = " << lmid << " rmid = " << rmid << endl;
 
    while (unitCnt > tmp) {
        rollback();
    }
 
    if (l1 <= lmid-1) {
        FOR(i, rmid+1, r2) addE(i);
        rec(l1, lmid-1, r1, rmid);
    }
 
    while (unitCnt > tmp) {
        rollback();
    }
 
    if(lmid+1 <= l2) {
        FOR(i, l1, lmid) addE(i);
        rec(lmid+1, l2, max(lmid+1, r1), r2);
    }
 
    while (unitCnt > tmp) {
        rollback();
    }
}
 
int main() {
    setIO();
 
    cin >> n >> m >> q;
    FOR(i, 1, m) {
        int u, v; cin >> u >> v;
        edges[i] = {u,v};
    }
 
    resetDSU();
 
    rec(1, m, 1, m+1);
 
   // FOR(i ,1, m) cout << " i = " << i << "  last =  "<< last[i] << endl;
 
    REP(q) {
        int le, ri; cin >> le >> ri;
        if (ri < last[le]) cout << "YES\n";
        else cout << "NO\n";
    }
 
    return 0;
}

Compilation message (stderr)

Joker.cpp: In function 'void setIO(std::string)':
Joker.cpp:36:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   36 |     freopen((s+".in").c_str(),"r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Joker.cpp:37:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   37 |     freopen((s+".out").c_str(),"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...