Submission #545501

#TimeUsernameProblemLanguageResultExecution timeMemory
545501NhatMinh0208Raspad (COI17_raspad)C++17
26 / 100
430 ms23888 KiB
#ifndef CPL_TEMPLATE #define CPL_TEMPLATE /* Normie's Template v2.5 Changes: Added warning against using pragmas on USACO. */ // Standard library in one include. #include <bits/stdc++.h> using namespace std; // ordered_set library. #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; #define ordered_set(el) tree<el,null_type,less<el>,rb_tree_tag,tree_order_statistics_node_update> // AtCoder library. (Comment out these two lines if you're not submitting in AtCoder.) (Or if you want to use it in other judges, run expander.py first.) //#include <atcoder/all> //using namespace atcoder; //Pragmas (Comment out these three lines if you're submitting in szkopul or USACO.) // #pragma comment(linker, "/stack:200000000") // #pragma GCC optimize("Ofast,unroll-loops,tree-vectorize") // #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") //File I/O. #define FILE_IN "cseq.inp" #define FILE_OUT "cseq.out" #define ofile freopen(FILE_IN,"r",stdin);freopen(FILE_OUT,"w",stdout) //Fast I/O. #define fio ios::sync_with_stdio(0);cin.tie(0) #define nfio cin.tie(0) #define endl "\n" //Order checking. #define ord(a,b,c) ((a>=b)and(b>=c)) //min/max redefines, so i dont have to resolve annoying compile errors. #define min(a,b) (((a)<(b))?(a):(b)) #define max(a,b) (((a)>(b))?(a):(b)) // Fast min/max assigns to use with AVX. // Requires g++ 9.2.0. template<typename T> __attribute__((always_inline)) void chkmin(T& a, const T& b) { a=(a<b)?a:b; } template<typename T> __attribute__((always_inline)) void chkmax(T& a, const T& b) { a=(a>b)?a:b; } //Constants. #define MOD (ll(998244353)) #define MAX 300001 #define mag 320 const long double PI=3.14159265358979; //Pairs and 3-pairs. #define p1 first #define p2 second.first #define p3 second.second #define fi first #define se second #define pii(element_type) pair<element_type,element_type> #define piii(element_type) pair<element_type,pii(element_type)> //Quick power of 2. #define pow2(x) (ll(1)<<x) //Short for-loops. #define ff(i,__,___) for(int i=__;i<=___;i++) #define rr(i,__,___) for(int i=__;i>=___;i--) //Typedefs. #define bi BigInt typedef long long ll; typedef long double ld; typedef short sh; // Binpow and stuff ll BOW(ll a, ll x, ll p) { if (!x) return 1; ll res=BOW(a,x/2,p); res*=res; res%=p; if (x%2) res*=a; return res%p; } ll INV(ll a, ll p) { return BOW(a,p-2,p); } //---------END-------// #endif vector<int> vec; int n,m,i,j,k,t,t1,u,v,a,b; int s[5000001]; char c; ll res; int par[5000001]; int h[5000001]; int typ[5000001]; int cntb, cntn; int pu,pv; int get_par(int x) { // cout<<"get_par "<<x<<endl; if (par[x]==x) return x; else return par[x]=get_par(par[x]); } int merg(int u, int v) { pu=get_par(u); pv=get_par(v); if (pu-pv) { if (h[pu]>h[pv]) { par[pv]=pu; return -1; } else if (h[pu]<h[pv]) { par[pu]=pv; return 1; } else { par[pu]=pv; h[pv]++; return 1; } } else { return 0; } } vector<piii(int)> el,er; void solve(int l, int r) { // cout<<"solve "<<l<<' '<<r<<endl; if (l==r) { // cout<<res; for (i=0;i<m;i++) if (s[l*m+i]) res++; for (i=0;i<m-1;i++) if (s[l*m+i]&s[l*m+i+1]) res--; // cout<<' '<<res<<endl; } else { int mid=(l+r)/2; for (i=l*m;i<r*m+m;i++) { par[i]=i; h[i]=0; typ[i]=-1; } for (i=0;i<m;i++) { typ[mid*m+i+m]=typ[mid*m+i]=i; } el.clear(); er.clear(); cntb=0; cntn=0; for (i=mid;i>=l;i--) for (j=0;j<m;j++) { if (s[i*m+j]) { if (i!=mid) { cntn++; if (s[i*m+j+m]) { u=merg(i*m+j,i*m+j+m); if (u) { if (typ[pu]==-1) { if (typ[pv]==-1) { a=-1; } else { a=typ[pv]; } cntn--; } else { if (typ[pv]==-1) { a=typ[pu]; cntn--; } else { el.push_back({i,{typ[pu],typ[pv]}}); a=typ[pv]; cntb--; } } if (u==-1) typ[pu]=a; else typ[pv]=a; } } } else { cntb++; } if (j) { if (s[i*m+j-1]) { u=merg(i*m+j,i*m+j-1); if (u) { if (typ[pu]==-1) { if (typ[pv]==-1) { a=-1; } else { a=typ[pv]; } cntn--; } else { if (typ[pv]==-1) { a=typ[pu]; cntn--; } else { el.push_back({i,{typ[pu],typ[pv]}}); a=typ[pv]; cntb--; } } if (u==-1) typ[pu]=a; else typ[pv]=a; } } } } if (j==m-1) { // cout<<"interim "<<i<<' '<<cntn<<' '<<cntb<<endl; res+=(ll)cntn*(r-mid); } } cntn=0; cntb=0; for (i=mid+1;i<=r;i++) for (j=0;j<m;j++) { if (s[i*m+j]) { if (i!=mid+1) { cntn++; if (s[i*m+j-m]) { u=merg(i*m+j,i*m+j-m); if (u) { if (typ[pu]==-1) { if (typ[pv]==-1) { a=-1; } else { a=typ[pv]; } cntn--; } else { if (typ[pv]==-1) { a=typ[pu]; cntn--; } else { er.push_back({i,{typ[pu],typ[pv]}}); a=typ[pv]; cntb--; } } if (u==-1) typ[pu]=a; else typ[pv]=a; } } } else { cntb++; } if (j) { if (s[i*m+j-1]) { u=merg(i*m+j,i*m+j-1); if (u) { if (typ[pu]==-1) { if (typ[pv]==-1) { a=-1; } else { a=typ[pv]; } cntn--; } else { if (typ[pv]==-1) { a=typ[pu]; cntn--; } else { er.push_back({i,{typ[pu],typ[pv]}}); a=typ[pv]; cntb--; } } if (u==-1) typ[pu]=a; else typ[pv]=a; } } } } if (j==m-1) { // cout<<"interim "<<i<<' '<<cntn<<' '<<cntb<<endl; res+=(ll)cntn*(mid-l+1); } } el.push_back({mid,{1e9,1e9}}); er.push_back({mid+1,{-1,-1}}); el.push_back({l-1,{-1,-1}}); er.push_back({r+1,{-1,-1}}); sort(el.begin(), el.end(), greater<piii(int)>()); sort(er.begin(), er.end()); // for (auto g : el) cout<<"("<<g.p1<<' '<<g.p2<<' '<<g.p3<<") "; cout<<endl; // for (auto g : er) cout<<"("<<g.p1<<' '<<g.p2<<' '<<g.p3<<") "; cout<<endl; a=0; for (i=0;i<m;i++) if (s[mid*m+i]|s[mid*m+i+m]) a++; for (i=0;i<el.size()-1;i++) { for (j=0;j<m;j++) { par[j]=j; h[j]=0; } b=0; for (j=1;j<=i;j++) { if (merg(el[j].p2,el[j].p3)) b++; } for (j=0;j<er.size()-1;j++) { if (j) { if (merg(er[j].p2,er[j].p3)) b++; } // cout<<res; res+=(a-b)*(el[i].p1-el[i+1].p1)*(er[j+1].p1-er[j].p1); // cout<<' '<<a<<' '<<b<<' '<<(el[i].p1-el[i+1].p1)<<' '<<(er[j+1].p1-er[j].p1)<<' '<<res<<endl; } } solve(l,mid); solve(mid+1,r); } } int main() { fio; cin>>n>>m; for (i=0;i<n;i++) for (j=0;j<m;j++) { cin>>c; s[i*m+j]=c-48; } solve(0,n-1); cout<<res; }

Compilation message (stderr)

raspad.cpp: In function 'void solve(int, int)':
raspad.cpp:321:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  321 |   for (i=0;i<el.size()-1;i++) {
      |            ~^~~~~~~~~~~~
raspad.cpp:329:14: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  329 |    for (j=0;j<er.size()-1;j++) {
      |             ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...