Submission #543469

#TimeUsernameProblemLanguageResultExecution timeMemory
543469PixelCatPort Facility (JOI17_port_facility)C++14
78 / 100
1104 ms846808 KiB
/* code by the cute ~~Dengdualang~~ PixelCat owo */ /* as cute as nacho neko (aka. my wife)! */ /* Nhade stay for a night here */ /* 183234 deng deng deng pixelcat oops */ /* (yang wang yesu)*2 */ /* ^ some weird stuff. nvm =w= */ // #pragma GCC optimize("O4,unroll-loops,no-stack-protector") // #pragma GCC target("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma") #include <bits/stdc++.h> #pragma pack(0) #define int LL //__int128 #define double long double using namespace std; using LL = long long; using LLL = __int128_t; using uLL = unsigned long long; using pii = pair<int, int>; #define For(i, a, b) for (int i = a; i <= b; i++) #define Fors(i, a, b, s) for (int i = a; i <= b; i += s) #define Forr(i, a, b) for (int i = a; i >= b; i--) #define F first #define S second #define L(id) (id * 2 + 1) #define R(id) (id * 2 + 2) #define LO(x) (x & (-x)) #define eb emplace_back #define all(x) x.begin(), x.end() #define sz(x) ((int)x.size()) #define mkp make_pair // #define MOD (int)(998244353) #define MOD (int)((LL)1'000'000'007) #define INF (int)(4e18) // #define INF 1e9 #define EPS (1e-6) #ifdef NYAOWO #include "library/debug.hpp" inline void USACO(const string &s) { cerr << "USACO: " << s << "\n"; } #else #define debug(...) inline void timer() {} inline void USACO(const string &s) { freopen((s + ".in").c_str(), "r", stdin); freopen((s + ".out").c_str(), "w", stdout); } #endif inline void NYA() { ios::sync_with_stdio(false); cin.tie(0); } inline int gcd(int a, int b) { return __gcd(a, b); } inline int lcm(int a, int b) { return a / gcd(a, b) * b; } int fpow(int b, int p, const int &mod) { int ans = 1; while (p) { if (p & 1) ans = ans * b % mod; p >>= 1; b = b * b % mod; } return ans; } int fpow(int b, int p) { return fpow(b, p, MOD); } template <typename T> inline void chmin(T &_a, const T &_b) { if (_b < _a) _a = _b; } template <typename T> inline void chmax(T &_a, const T &_b) { if (_b > _a) _a = _b; } // mt19937_64 rng( // chrono::steady_clock::now().time_since_epoch().count()); using fptr=int32_t; struct Node{ fptr l,r; char tag; fptr par; char dist; }nds[20000020]; fptr newNode(fptr id){ static fptr nowid=0; nowid++; if(id){ nds[nowid].l=nds[id].l; nds[nowid].r=nds[id].r; } return nowid; } pair<fptr,char> find(fptr nd){ if(!nds[nd].par) return make_pair(nd,0); auto res=find(nds[nd].par); res.S+=nds[nd].dist; nds[nd].dist^=nds[nds[nd].par].dist; nds[nd].par=res.F; return res; } bool ac; bool uni(fptr a,fptr b,int d){ auto r1=find(a); auto r2=find(b); // cout<<a<<" "<<b<<" "<<r1.F<<" "<<r2.F<<" "<<d<<"\n"; auto dist=(r1.S+r2.S)%2; if(r1.F==r2.F){ if(dist!=d) ac=false; return dist==d; } nds[r1.F].par=r2.F; nds[r1.F].dist=(dist!=d); return true; } fptr ptr[1000010]; fptr rt[1000010]; fptr update(fptr ori,int l,int r,int p,int x){ fptr nd=newNode(ori); if(l==r){ ptr[x]=nd; return nd; } int m=(l+r)/2; if(p<=m) nds[nd].l=update(nds[nd].l,l,m,p,x); else nds[nd].r=update(nds[nd].r,m+1,r,p,x); return nd; } void link(fptr seg,int l,int r,fptr nd,int L,int R){ if(!seg) return; if(l>R || r<L) return; if(l>=L && r<=R){ nds[seg].tag|=2; uni(seg,nd,1); return; } int m=(l+r)/2; link(nds[seg].l,l,m,nd,L,R); link(nds[seg].r,m+1,r,nd,L,R); } // bool dfs(fptr nd,int c){ // if(!nd) return true; // if(nd->tag>=0) return nd->tag==c; // nd->tag=c; // bool res=true; // for(auto &i:nd->adj){ // res=res&&dfs(i.F,(i.S?1-c:c)); // } // return res; // } int32_t main() { NYA(); // nyaacho >/////< // miku sama bless me >/////< int n; cin>>n; // assert(n<=2000); vector<pii> v(n); for(auto &i:v) cin>>i.F>>i.S; sort(all(v)); ac=true; rt[0]=0; For(i,0,n-1){ rt[i+1]=update(rt[i],1,n*2,v[i].S,i); link(rt[i+1],1,n*2,ptr[i],v[i].F+1,v[i].S-1); } queue<fptr> que; For(i,1,n) que.emplace(rt[i]); while(!que.empty()){ auto now=que.front(); que.pop(); if(!now) continue; if(nds[now].tag<0) continue; if(nds[now].l && (nds[nds[now].l].tag&1)==0) que.emplace(nds[now].l); if(nds[now].r && (nds[nds[now].r].tag&1)==0) que.emplace(nds[now].r); bool oao=nds[now].tag&2; if(oao){ if(nds[now].l){ uni(now,nds[now].l,0); nds[nds[now].l].tag|=2; // nds[now].adj.eb(nds[now].l,0); // nds[nds[now].l].adj.eb(now,0); } if(nds[now].r){ uni(now,nds[now].r,0); nds[nds[now].r].tag|=2; // nds[now].adj.eb(nds[now].r,0); // nds[nds[now].r].adj.eb(now,0); } } if(nds[now].l) nds[nds[now].l].tag|=1; if(nds[now].r) nds[nds[now].r].tag|=1; nds[now].tag=-1; } // int ans=1; // For(i,0,n-1){ // if(ptr[i]->tag==-1){ // ans+=ans; // if(ans>=MOD) ans-=MOD; // if(!dfs(ptr[i],1)) ans=0; // } // } // cout<<ans<<"\n"; set<fptr> st; For(i,0,n-1){ // cout<<ptr[i]<<" "<<find(ptr[i]).F<<" "<<ptr[i]->par<<"\n"; st.insert(find(ptr[i]).F); } if(ac) cout<<fpow(2,sz(st))<<"\n"; else cout<<"0\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...