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
  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2567340.html
Copyright © 2011-2022 走看看