博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【POJ】2019 Cornfields
阅读量:4448 次
发布时间:2019-06-07

本文共 3560 字,大约阅读时间需要 11 分钟。

1 #include
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 }

转载于:https://www.cnblogs.com/DrunBee/archive/2012/06/28/2567340.html

你可能感兴趣的文章
找球号(一)
查看>>
开发小计(3)
查看>>
[Codevs] 1001 舒适的路线
查看>>
Deep Learning相关
查看>>
MySQL 树形结构 根据指定节点 获取其所有父节点序列
查看>>
hdu_5773_The All-purpose Zero(LIS)
查看>>
流程控制之while循环
查看>>
JSONObject和JSONArray区别及基本用法
查看>>
java多线程例子
查看>>
目标检测网络之 YOLOv3
查看>>
python 使用pyinstaller,pywin32打包.py成.exe应用程序
查看>>
AFNetworking封装思路简析
查看>>
C# 之 批量插入数据到 SQLServer 中
查看>>
Visual Studio使用中的问题
查看>>
salesforce零基础学习(七十九)简单排序浅谈 篇一
查看>>
zabbix的源码安装
查看>>
磁盘配额中quotacheck不能创建aquota.user和aquota.group文件的问题
查看>>
2014年生日
查看>>
Django Rest Framework-介绍
查看>>
文件夹的创建(cmd利用)
查看>>