Advertisement
Guest User

Untitled

a guest
Aug 24th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/assoc_container.hpp>
  3. #include <ext/pb_ds/tree_policy.hpp>
  4.  
  5. using namespace std;
  6. using namespace __gnu_pbds;
  7. typedef tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> ordered_set;
  8.  
  9. #define scan(x) do{while((x=getchar())<'0'); for(x-='0'; '0'<=(_=getchar()); x=(x<<3)+(x<<1)+_-'0');}while(0)
  10. char _;
  11. #define complete_unique(a) a.erase(unique(a.begin(),a.end()),a.end())
  12. #define all(a) a.begin(),a.end()
  13. #define println printf("\n");
  14. #define readln(x) getline(cin,x);
  15. #define pb push_back
  16. #define endl "\n"
  17. #define INT_INF 0x3f3f3f3f
  18. #define LL_INF 0x3f3f3f3f3f3f3f3f
  19. #define MOD 1000000007
  20. #define MOD2 1190492669
  21. #define SEED 131
  22. #define mp make_pair
  23. #define fastio cin.tie(0); cin.sync_with_stdio(0);
  24.  
  25. #define MAXN 1005
  26.  
  27. typedef unsigned long long ull;
  28. typedef long long ll;
  29. typedef long double ld;
  30. typedef unordered_map<int,int> umii;
  31. typedef pair<int,int> pii;
  32. typedef pair<double,double> pdd;
  33. typedef pair<ll,ll> pll;
  34. typedef pair<int,pii> triple;
  35. typedef int8_t byte;
  36.  
  37. mt19937 g1(time(0));
  38.  
  39. int randint(int a, int b){return uniform_int_distribution<int>(a, b)(g1);}
  40. ll randlong(ll a,ll b){return uniform_int_distribution<long long>(a, b)(g1);}
  41.  
  42. ll gcd(ll a, ll b){return b == 0 ? a : gcd(b, a % b);}
  43. ll lcm(ll a, ll b){return a*b/gcd(a,b);}
  44. ll fpow(ll  b, ll exp, ll mod){if(exp == 0) return 1;ll t = fpow(b,exp/2,mod);if(exp&1) return t*t%mod*b%mod;return t*t%mod;}
  45. ll divmod(ll i, ll j, ll mod){i%=mod,j%=mod;return i*fpow(j,mod-2,mod)%mod;}
  46.  
  47. struct node{
  48.     int l,r,mn,mx;
  49. };
  50.  
  51. int num_rows,num_cols,N,arr[MAXN][MAXN],mx[MAXN][MAXN],mn[MAXN][MAXN],res=INT_MAX;
  52. node seg[4*MAXN];
  53.  
  54. inline void push_up(int rt){
  55.     seg[rt].mn = min(seg[rt<<1].mn,seg[rt<<1|1].mn);
  56.     seg[rt].mx = max(seg[rt<<1].mx,seg[rt<<1|1].mx);
  57. }
  58.  
  59. void build(int l, int r, int rt, int col){
  60.     seg[rt].l = l, seg[rt].r = r, seg[rt].mn = INT_MAX, seg[rt].mn = INT_MIN;
  61.     if(l == r){
  62.         seg[rt].mn = mn[l][col];
  63.         seg[rt].mx = mx[l][col];
  64.         return;
  65.     }
  66.     int mid = (l+r)/2;
  67.     build(l,mid,rt<<1,col);
  68.     build(mid+1,r,rt<<1|1,col);
  69.     push_up(rt);
  70. }
  71.  
  72. pii query(int l, int r, int rt){
  73.     if(seg[rt].l == l && seg[rt].r == r) return mp(seg[rt].mn,seg[rt].mx);
  74.     int mid = (seg[rt].l+seg[rt].r)/2;
  75.     if(r <= mid) return query(l,r,rt<<1);
  76.     else if(l > mid) return query(l,r,rt<<1|1);
  77.     else{
  78.         pii f = query(l,mid,rt<<1), s = query(mid+1,r,rt<<1|1);
  79.         return mp(min(f.first,s.first),max(f.second,s.second));
  80.     }
  81. }
  82.  
  83. int main(){
  84.     scanf("%d %d %d",&num_rows,&num_cols,&N);
  85.     for(int i=1; i<=num_rows; i++)
  86.         for(int k=1; k<=num_cols; k++)
  87.             scanf(" %d",&arr[i][k]);
  88.     for(int i=1; i<=num_rows; i++){
  89.         deque<pii> mix,max;
  90.         for(int k=1; k<=num_cols; k++){
  91.             while(mix.size() && mix.front().second+N <= k) mix.pop_front();
  92.             while(max.size() && max.front().second+N <= k) max.pop_front();
  93.  
  94.             while(mix.size() && mix.back().first >= arr[i][k]) mix.pop_back();
  95.             while(max.size() && max.back().first <= arr[i][k]) max.pop_back();
  96.             mix.pb(mp(arr[i][k],k));
  97.             max.pb(mp(arr[i][k],k));
  98.             mx[i][k] = max.front().first;
  99.             mn[i][k] = mix.front().first;
  100.         }
  101.     }
  102.     for(int i=N; i<=num_cols; i++){
  103.         build(1,num_rows,1,i);
  104.         for(int k=N; k<=num_rows; k++){
  105.             pii q = query(k-N+1,k,1);
  106.             res = min(res,q.second-q.first);
  107.         }
  108.     }
  109.     printf("%d\n",res);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement