zoukankan      html  css  js  c++  java
  • 【POJ】2019 Cornfields

      1 #include<cstdio>
      2 #define MAXN 300
      3 struct node
      4 {
      5     int big[MAXN<<2],small[MAXN<<2];
      6 };
      7 node tree[MAXN<<2];
      8 int n,b;
      9 inline int MAX(int x,int y)
     10 {
     11     return x>y?x:y;
     12 }
     13 inline int MIN(int x,int y)
     14 {
     15     return x>y?y:x;
     16 }
     17 void SubBuild(int t,int L,int R,int rt)
     18 {
     19     tree[t].big[rt]=0;
     20     tree[t].small[rt]=MAXN;
     21     if(L!=R)
     22     {
     23         int mid=(L+R)>>1;
     24         SubBuild(t,L,mid,rt<<1);
     25         SubBuild(t,mid+1,R,rt<<1|1);
     26     }
     27 }
     28 void Build(int L,int R,int rt)
     29 {
     30     SubBuild(rt,1,n,1);
     31     if(L!=R)
     32     {
     33         int mid=(L+R)>>1;
     34         Build(L,mid,rt<<1);
     35         Build(mid+1,R,rt<<1|1);
     36     }
     37 }
     38 void SubUpdate(int t,int x,int val,int L,int R,int rt)
     39 {
     40     if(L==R)
     41     {
     42         tree[t].big[rt]=MAX(tree[t].big[rt],val);
     43         tree[t].small[rt]=MIN(tree[t].small[rt],val);
     44     }
     45     else
     46     {
     47         int mid=(L+R)>>1;
     48         if(x<=mid)
     49             SubUpdate(t,x,val,L,mid,rt<<1);
     50         else
     51             SubUpdate(t,x,val,mid+1,R,rt<<1|1);
     52         tree[t].big[rt]=MAX(tree[t].big[rt<<1],tree[t].big[rt<<1|1]);
     53         tree[t].small[rt]=MIN(tree[t].small[rt<<1],tree[t].small[rt<<1|1]);
     54     }
     55 }
     56 void Update(int x,int y,int val,int L,int R,int rt)
     57 {
     58     SubUpdate(rt,y,val,1,n,1);
     59     if(L!=R)
     60     {
     61         int mid=(L+R)>>1;
     62         if(x<=mid)
     63             Update(x,y,val,L,mid,rt<<1);
     64         else
     65             Update(x,y,val,mid+1,R,rt<<1|1);
     66     }
     67 }
     68 int SubQueryB(int t,int x,int y,int L,int R,int rt)
     69 {
     70     if(x<=L&&R<=y)
     71         return tree[t].big[rt];
     72     int mid=(L+R)>>1,ans=0;
     73     if(x<=mid)
     74         ans=MAX(ans,SubQueryB(t,x,y,L,mid,rt<<1));
     75     if(y>mid)
     76         ans=MAX(ans,SubQueryB(t,x,y,mid+1,R,rt<<1|1));
     77     return ans;
     78 }
     79 int QueryB(int x1,int x2,int y1,int y2,int L,int R,int rt)
     80 {
     81     if(x1<=L&&R<=x2)
     82         return SubQueryB(rt,y1,y2,1,n,1);
     83     int mid=(L+R)>>1,ans=0;
     84     if(x1<=mid)
     85         ans=MAX(ans,QueryB(x1,x2,y1,y2,L,mid,rt<<1));
     86     if(x2>mid)
     87         ans=MAX(ans,QueryB(x1,x2,y1,y2,mid+1,R,rt<<1|1));
     88     return ans;
     89 }
     90 int SubQueryS(int t,int x,int y,int L,int R,int rt)
     91 {
     92     if(x<=L&&R<=y)
     93         return tree[t].small[rt];
     94     int mid=(L+R)>>1,ans=MAXN;
     95     if(x<=mid)
     96         ans=MIN(ans,SubQueryS(t,x,y,L,mid,rt<<1));
     97     if(y>mid)
     98         ans=MIN(ans,SubQueryS(t,x,y,mid+1,R,rt<<1|1));
     99     return ans;
    100 }
    101 int QueryS(int x1,int x2,int y1,int y2,int L,int R,int rt)
    102 {
    103     if(x1<=L&&R<=x2)
    104         return SubQueryS(rt,y1,y2,1,n,1);
    105     int mid=(L+R)>>1,ans=MAXN;
    106     if(x1<=mid)
    107         ans=MIN(ans,QueryS(x1,x2,y1,y2,L,mid,rt<<1));
    108     if(x2>mid)
    109         ans=MIN(ans,QueryS(x1,x2,y1,y2,mid+1,R,rt<<1|1));
    110     return ans;
    111 }
    112 int main()
    113 {
    114     int q,x,i,j,big,small;
    115     while(~scanf("%d%d%d",&n,&b,&q))
    116     {
    117         Build(1,n,1);
    118         for(i=1;i<=n;i++)
    119         {
    120             for(j=1;j<=n;j++)
    121             {
    122                 scanf("%d",&x);
    123                 Update(i,j,x,1,n,1);
    124             }
    125         }
    126         while(q--)
    127         {
    128             scanf("%d%d",&i,&j);
    129             big=QueryB(i,i+b-1,j,j+b-1,1,n,1);
    130             small=QueryS(i,i+b-1,j,j+b-1,1,n,1);
    131             printf("%d\n",big-small);
    132         }
    133     }
    134     return 0;
    135 }
    新博客:www.zhixiangli.com
  • 相关阅读:
    173. Binary Search Tree Iterator
    199. Binary Tree Right Side View
    230. Kth Smallest Element in a BST
    236. Lowest Common Ancestor of a Binary Tree
    337. House Robber III
    449. Serialize and Deserialize BST
    508. Most Frequent Subtree Sum
    513. Find Bottom Left Tree Value
    129. Sum Root to Leaf Numbers
    652. Find Duplicate Subtrees
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2567340.html
Copyright © 2011-2022 走看看