Submission #1161445

#TimeUsernameProblemLanguageResultExecution timeMemory
1161445son2008Joker (BOI20_joker)C++20
0 / 100
292 ms18716 KiB
#include<bits/stdc++.h> using namespace std; #define task "odd" #define ii pair<int,int> #define fi first #define se second #define int long long #define ll long long #define ld double #define mp make_pair #define lg2 30 #define iii pair<ll,ii> #define iiii pair<ii,ii> #define base 29 #define eps 1e-8 int dx[]= {0LL,0LL,1,-1,1,1,-1,-1}; int dy[]= {1,-1,0LL,0LL,1,-1,1,-1}; const int maxn=2e5+5,maxm=1e4+5,maxq=1e5+5; const int mod=1e9+7; ii edge[maxn],par[maxn]; int f[maxn]; int rk[maxn],n,m,q; struct node { int a,x,b,y; bool c; }; stack<node>st; bool bipartiteness=true,nho[maxn]; ii acs(int u) { if(u!=par[u].fi) { int parity=par[u].se; par[u]=acs(par[u].fi); par[u].se^=parity; } return par[u]; } bool join(int u,int v) { ii pa=acs(u),pb=acs(v); int a=pa.fi,x=pa.se; int b=pb.fi,y=pb.se; if(a==b) { if(x==y) { st.push({a,rk[a],b,rk[b],bipartiteness}); bipartiteness=false; return true; } return false; } if(rk[a]<rk[b])swap(a,b); st.push({a,rk[a],b,rk[b],bipartiteness}); par[b]={a,x^y^1}; if(rk[a]==rk[b])rk[a]++; return true; } void rollback() { node t=st.top(); st.pop(); int a=t.a,b=t.b,x=t.x,y=t.y,c=t.c; par[a]={a,0}; par[b]={b,0}; rk[a]=x; rk[b]=y; bipartiteness=c; } void init() { cin>>n>>m>>q; for(int i=1;i<=n;i++) { par[i]={i,0}; } for(int i=1;i<=m;i++) { cin>>edge[i].fi>>edge[i].se; } } void dnc(int l1,int l2,int r1,int r2) { if(l1>l2)return; int mid=(l1+l2)/2; // cout<<l1<<" "<<l2<<" "<<r1<<" "<<r2<<'\n'; for(int i=l1;i<mid;i++) { nho[i]=join(edge[i].fi,edge[i].se); } f[mid]=max(r1,mid)-1; if(mid==1) { // cout<<f[mid]<<'\n'; } for(int i=r2;i>=max(r1,mid);i--) { if(!bipartiteness) { f[mid]=i; break; } nho[i]=join(edge[i].fi,edge[i].se); } if(mid==1) { //cout<<f[mid]<<'\n'; } for(int i=f[mid]+1;i<=r2;i++) { if(nho[i])rollback(); } for(int i=mid-1;i>=l1;i--) { if(nho[i])rollback(); } /* if(mid==2){ cout<<bipartiteness<<'\n'; for(int i=1;i<=n;i++)cout<<par[i].fi<<" "<<par[i].se<<'\n'; }*/ for(int i=f[mid]+1;i<=r2;i++)nho[i]=join(edge[i].fi,edge[i].se); /* if(mid==2){ cout<<bipartiteness<<'\n'; }*/ dnc(l1,mid-1,r1,f[mid]); for(int i=r2;i>=f[mid]+1;i--)if(nho[i])rollback(); for(int i=l1;i<=mid;i++)nho[i]=join(edge[i].fi,edge[i].se); dnc(mid+1,l2,f[mid],r2); for(int i=mid;i>=l1;i--)if(nho[i])rollback(); } void process() { dnc(1,m,1,m); /*for(int i=1;i<=m;i++) { cout<<f[i]<<" "; } cout<<'\n';*/ while(q--) { int l,r; cin>>l>>r; if(f[l]>=r) { cout<<"YES"<<'\n'; } else cout<<"NO"<<'\n'; } } 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); } init(); process(); cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ; }

Compilation message (stderr)

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