【题目分析】

二维线段树模板题目。

简直就是无比的暴力。时间复杂度为两个log。

标记的更新方式比较奇特,空间复杂度为N^2。

模板题目。

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. //#include <cmath>
  4. #include <cstdlib>
  5.  
  6. #include <map>
  7. #include <set>
  8. #include <queue>
  9. #include <string>
  10. #include <iostream>
  11. #include <algorithm>
  12.  
  13. using namespace std;
  14.  
  15. #define maxn 505
  16. #define inf 0x3f3f3f3f
  17. #define F(i,j,k) for (int i=j;i<=k;++i)
  18. #define D(i,j,k) for (int i=j;i>=k;--i)
  19.  
  20. void Finout()
  21. {
  22. #ifndef ONLINE_JUDGE
  23. freopen("in.txt","r",stdin);
  24. // freopen("out.txt","w",stdout);
  25. #endif
  26. }
  27.  
  28. int Getint()
  29. {
  30. int x=0,f=1; char ch=getchar();
  31. while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
  32. while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
  33. return x*f;
  34. }
  35.  
  36. int mx[maxn<<2][maxn<<2],mn[maxn<<2][maxn<<2],rt[maxn<<2],ma[maxn][maxn],n;
  37. int x,y,c,tot=0,x1,x2,y1,y2;
  38.  
  39. void pushup(int rt,int o)
  40. {
  41. mx[rt][o]=max(mx[rt][o<<1],mx[rt][o<<1|1]);
  42. mn[rt][o]=min(mn[rt][o<<1],mn[rt][o<<1|1]);
  43. }
  44.  
  45. void update(int rt,int o,int l,int r)
  46. {
  47. // printf("update %d %d %d %d\n",rt,o,l,r);
  48. if (l==r)
  49. {
  50. mx[rt][o]=max(mx[rt<<1][o],mx[rt<<1|1][o]);
  51. mn[rt][o]=min(mn[rt<<1][o],mn[rt<<1|1][o]);
  52. return;
  53. }
  54. int mid=l+r>>1;
  55. if (y<=mid) update(rt,o<<1,l,mid);
  56. else update(rt,o<<1|1,mid+1,r);
  57. pushup(rt,o);
  58. }
  59.  
  60. void push(int rt,int o,int l,int r)
  61. {
  62. if (l==r)
  63. {
  64. mx[rt][o]=mn[rt][o]=c;
  65. return ;
  66. }
  67. int mid=l+r>>1;
  68. if (y<=mid) push(rt,o<<1,l,mid);
  69. else push(rt,o<<1|1,mid+1,r);
  70. pushup(rt,o);
  71. }
  72.  
  73. void modi(int o,int l,int r)
  74. {
  75. if (l==r){push(o,1,1,n);return;}
  76. int mid=l+r>>1;
  77. if (x<=mid) modi(o<<1,l,mid);
  78. else modi(o<<1|1,mid+1,r);
  79. update(o,1,1,n);
  80. }
  81.  
  82. char opt[11];int amx,amn,q;
  83.  
  84. void queryy(int rt,int o,int l,int r)
  85. {
  86. // printf("queryy %d %d %d %d\n",rt,o,l,r);
  87. if (y1<=l&&r<=y2)
  88. {
  89. amx=max(amx,mx[rt][o]);
  90. amn=min(amn,mn[rt][o]);
  91. return ;
  92. }
  93. int mid=l+r>>1;
  94. if (y1<=mid) queryy(rt,o<<1,l,mid);
  95. if (y2>mid) queryy(rt,o<<1|1,mid+1,r);
  96. }
  97.  
  98. void queryx(int o,int l,int r)
  99. {
  100. // printf("query x %d %d %d\n",o,l,r);
  101. if (x1<=l&&r<=x2){ return queryy(o,1,1,n); }
  102. int mid=l+r>>1;
  103. if (x1<=mid) queryx(o<<1,l,mid);
  104. if (x2>mid) queryx(o<<1|1,mid+1,r);
  105. }
  106.  
  107. int main()
  108. {
  109. memset(mx,-0x3f,sizeof mx);
  110. memset(mn, 0x3f,sizeof mn);
  111. Finout();
  112. n=Getint();
  113. F(i,1,n) F(j,1,n)
  114. {
  115. x=i;y=j;
  116. c=ma[i][j]=Getint();
  117. modi(1,1,n);
  118. }
  119. // cout<<mx[1][1]<<" "<<mn[1][1]<<endl;
  120. q=Getint();
  121. F(i,1,q)
  122. {
  123. scanf("%s",opt);
  124. if (opt[0]=='c')
  125. {
  126. x=Getint(); y=Getint(); c=Getint();
  127. modi(1,1,n);
  128. }
  129. else
  130. {
  131. x1=Getint(); y1=Getint(); x2=Getint(); y2=Getint();
  132. amx=-inf,amn=inf;
  133. queryx(1,1,n);
  134. printf("%d %d\n",amx,amn);
  135. }
  136. }
  137. }

  

UVA 11297 Census ——二维线段树的更多相关文章

  1. UVa 11297 Census (二维线段树)

    题意:给定上一个二维矩阵,有两种操作 第一种是修改 c x y val 把(x, y) 改成 val 第二种是查询 q x1 y1 x2 y2 查询这个矩形内的最大值和最小值. 析:二维线段树裸板. ...

  2. UVA 11297 Census(二维线段树)

    Description This year, there have been many problems with population calculations, since in some cit ...

  3. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  4. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  5. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  6. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  7. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  8. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

  9. HDU 4819 Mosaic (二维线段树)

    Mosaic Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total S ...

随机推荐

  1. setuid

    -r-s--x--x   #s就是setuid,仅可用在二进制文件,对目录设置无效

  2. 洛谷 P2617 Dynamic Ranking

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤ ...

  3. spring 常用问题汇总

    2018.02.06 SpringMVC中StringHttpMessageConverter乱码处理 http://blog.csdn.net/wangyangbto/article/details ...

  4. ubuntu 14.04 安装redis

    root@hett-PowerEdge-T30:~# sudo apt-get install redis-server Reading package lists... DoneBuilding d ...

  5. scanf("%s",s)与gets(s)

    #include <stdio.h> void fun(char s[]) {; while(s[i]!='\0') {i++;} printf("%d",i);} v ...

  6. java并发编程:Executor、Executors、ExecutorService

    1.Executor和ExecutorService Executor:一个接口,其定义了一个接收Runnable对象的方法executor,其方法签名为executor(Runnable comma ...

  7. (七)VMware Harbor 问题:Get https://192.168.3.135:8088/v2/: http:server gave HTTP response to HTTPS client

    (一)问题描述 登陆时,报错 docker Get https://192.168.3.135:8088/v2/: http:server gave HTTP response to HTTPS cl ...

  8. 在idea下创建maven

    之前一直用eclipse,现在要用idea写一个安装过程玩玩 一:New Project 二:选择maven,在project SDK上选择你安装的jdk,默认安装在c:/Program Files ...

  9. C++11:移动构造函数的测试

    C++11:移动构造函数的测试 代码如下: #include <iostream> #include <stddef.h> #include <Windows.h> ...

  10. 解决VS2013无法安装ArcObjects10.2的问题

    之前在网上看到的10.1在vs2012安装不上的问题,解决办法是改注册表HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\1 ...