Advertisement
ec1117

Untitled

Dec 7th, 2020 (edited)
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef long double ld;
  6. typedef pair<int,int> pi;
  7. typedef vector<int> vi;
  8. typedef vector<pi> vpi;
  9.  
  10. #define mp make_pair
  11. #define f first
  12. #define s second
  13. #define sz(x) (int)(x).size()
  14. #define all(x) begin(x), end(x)
  15. #define rsz resize
  16. #define bk back()
  17. #define pb push_back
  18.  
  19. #define FOR(i,a,b) for (int i = (a); i < (b); ++i)
  20. #define F0R(i,a) FOR(i,0,a)
  21. #define For(i,a) FOR(i,0,a)
  22. #define ROF(i,a,b) for (int i = (b)-1; i >= (a); --i)
  23. #define R0F(i,a) ROF(i,0,a)
  24. #define Rof(i,a) ROF(i,0,a)
  25. #define trav(a,x) for (auto& a: x)
  26.  
  27. #define nl '\n'
  28.  
  29. const int MOD = 1e9+7;
  30. const int MX = 750+7;
  31. const ld PI = acos((ld)-1);
  32. mt19937 rng; // or mt19937_64
  33. template<class T> bool ckmin(T& a, const T& b) {
  34.     return b < a ? a = b, 1 : 0; }
  35. template<class T> bool ckmax(T& a, const T& b) {
  36.     return a < b ? a = b, 1 : 0; }
  37. ll cdiv(ll a, ll b) { return a/b+((a^b)>0&&a%b); } // divide a by b rounded up
  38. ll fdiv(ll a, ll b) { return a/b-((a^b)<0&&a%b); } // divide a by b rounded down
  39.  
  40. void DBG() { cerr << "]" << endl; }
  41. template<class H, class... T> void DBG(H h, T... t) {
  42.     cerr << h; if (sizeof...(t)) cerr << ", ";
  43.     DBG(t...); }
  44. #ifdef LOCAL // compile with -DLOCAL
  45. #define dbg(...) cerr << "LINE(" << __LINE__ << ") -> [" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
  46. #else
  47. #define dbg(...) 0
  48. #endif
  49.  
  50. void setIO(string s) {
  51.     // ios_base::sync_with_stdio(0); cin.tie(0);
  52.     cin.tie(0)->sync_with_stdio(0);
  53.     freopen((s+".in").c_str(),"r",stdin);
  54.     freopen((s+".out").c_str(),"w",stdout);
  55. }
  56.  
  57. int dx[]={1,1,1,0,0,-1,-1,-1}, dy[]={0,-1,1,1,-1,0,-1,1};
  58. int dx2[]={1,0,-1,0}, dy2[]={0,1,0,-1};
  59. int n, g[MX][MX], m[MX*MX];
  60. bool c[MX][MX];
  61. vector<pair<int, pi>> ev;
  62. ll ret=0;
  63. /*
  64. CHANGED MY MAP TO INT FOR SPEEDUP
  65. 10/21 wo
  66.  */
  67.  
  68. bool side(int x, int y){
  69.     return (x==0 || y==0 || x==n-1 || y==n-1);
  70. }
  71. bool leg(int x, int y){
  72.     return (x>=0 && x<=n-1 && y>=0 && y<=n-1);
  73. }
  74.  
  75. int tr(int x, int y){
  76.     return x*n+y;
  77. }
  78. pi r(int x){
  79.     return mp(x/n,x%n);
  80. }
  81. struct DSU{
  82.     int n;
  83.     vi p, mx;
  84.     void init(int N){
  85.         n=N;
  86.         p=vi(n,-1);
  87.         mx=vi(n,0);
  88.     }
  89.     int get(int x){
  90.         return (p[x]<0)?x:p[x]=get(p[x]);
  91.     }
  92.     bool same(int x, int y){
  93.         return get(x)==get(y);
  94.     }
  95.     bool unite(int x, int y){
  96.         x=get(x), y=get(y);
  97.         if(x==y)return false;
  98.         if(y==0 || (x!=0 && p[y]<p[x]))swap(x,y);
  99.         p[x]+=p[y];
  100.         p[y]=x;
  101.         ckmax(mx[x],mx[y]);
  102.         return true;
  103.     }
  104. };
  105.  
  106. DSU dsu;
  107. int main() {
  108.     setIO("valleys");
  109.     cin >> n;
  110.     dsu.init(MX*MX);
  111.     For(i,n){
  112.         For(j,n){
  113.             cin>> g[i][j];
  114.             ev.pb(mp(g[i][j],mp(i,j)));
  115.         }
  116.     }
  117.     sort(all(ev));
  118.     reverse(all(ev));
  119.     trav(x,ev){//FIND MAX HOLE
  120.         queue<pi> q;
  121.         if(side(x.s.f,x.s.s)){
  122.             q.push(x.s);
  123.         }
  124.         else{
  125.             For(k,8){//logic wrong here?
  126.                 int nx=x.s.f+dx[k], ny=x.s.s+dy[k];
  127.                 if(leg(nx,ny) && g[nx][ny]>g[x.s.f][x.s.s] && c[nx][ny]){
  128.                     q.push(x.s);
  129.                     break;
  130.                 }
  131.             }
  132.         }
  133.         while(sz(q)){
  134.             pi y=q.front(); q.pop();
  135.             int tx=y.f, ty=y.s;
  136.             // if(!c[tx][ty]){
  137.                 ckmax(m[tr(x.s.f,x.s.s)],g[tx][ty]);
  138.                 c[tx][ty]=true;
  139.                 For(k,8){
  140.                     int nx=tx+dx[k], ny=ty+dy[k];
  141.                     if(leg(nx,ny) && g[nx][ny]>=g[x.s.f][x.s.s] && !c[nx][ny]){
  142.                         c[nx][ny]=true;
  143.                         q.push(mp(nx,ny));
  144.                     }
  145.                 }
  146.             // }
  147.         }
  148.     }
  149.     reverse(all(ev));
  150.     trav(x,ev){
  151.         int cx=x.s.f,cy=x.s.s;
  152.         For(k,4){
  153.             int tx=cx+dx2[k], ty=cy+dy2[k];
  154.             if(leg(tx,ty) && g[tx][ty]<g[cx][cy])//already processed
  155.                 dsu.unite(tr(tx,ty),tr(cx,cy));
  156.         }
  157.         ckmax(dsu.mx[dsu.get(tr(cx,cy))],m[tr(cx,cy)]);
  158.  
  159.         if(g[cx][cy]>=dsu.mx[dsu.get(tr(cx,cy))])//no hole to worry abt
  160.             ret+=-dsu.p[dsu.get(tr(cx,cy))];
  161.     }
  162.     cout << ret << nl;
  163.     dbg(ret);
  164. }
  165.             // c[x.s.f][x.s.s]=true;
  166.             // For(k,8){
  167.             //  int tx=x.s.f+dx[k], ty=x.s.s+dy[k];
  168.             //  if(leg(tx, ty) && g[tx][ty]>g[x.s.f][x.s.s] && !c[tx][ty])
  169.             //      q.push(mp(tx,ty));
  170.             // }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement