• zoj 2589 Matrix Searching 二维线段树


    题目链接

    给一个n*n的矩阵, 给q个查询, 每次给出x1, y1, x2, y2, 求这个矩阵中的最小值。

    代码基本上和上一题相同...

      1 #include<bits/stdc++.h>
      2 using namespace std;
      3 #define pb(x) push_back(x)
      4 #define ll long long
      5 #define mk(x, y) make_pair(x, y)
      6 #define lson l, m, rt<<1
      7 #define mem(a) memset(a, 0, sizeof(a))
      8 #define rson m+1, r, rt<<1|1
      9 #define mem1(a) memset(a, -1, sizeof(a))
     10 #define mem2(a) memset(a, 0x3f, sizeof(a))
     11 #define rep(i, a, n) for(int i = a; i<n; i++)
     12 #define ull unsigned long long
     13 typedef pair<int, int> pll;
     14 const double PI = acos(-1.0);
     15 const double eps = 1e-8;
     16 const int mod = 1e9+7;
     17 const int inf = 1061109567;
     18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
     19 const int maxn = 305;
     20 int maxx[maxn<<2][maxn<<2], minn[maxn<<2][maxn<<2], max_ans, min_ans, n;
     21 void pushUp(int pos, int rt) {
     22     minn[pos][rt] = min(minn[pos][rt<<1], minn[pos][rt<<1|1]);
     23 }
     24 void sub_build(int sign, int pos, int l, int r, int rt) {
     25     if(l == r) {
     26         if(!sign) {
     27             scanf("%d", &minn[pos][rt]);
     28         } else {
     29             minn[pos][rt] = min(minn[pos<<1][rt], minn[pos<<1|1][rt]);
     30         }
     31         return ;
     32     }
     33     int m = l+r>>1;
     34     sub_build(sign, pos, lson);
     35     sub_build(sign, pos, rson);
     36     pushUp(pos, rt);
     37 }
     38 void build(int l, int r, int rt) {
     39     if(l == r) {
     40         sub_build(0, rt, 1, n, 1);
     41         return ;
     42     }
     43     int m = l+r>>1;
     44     build(lson);
     45     build(rson);
     46     sub_build(1, rt, 1, n, 1);
     47 }
     48 void sub_update(int sign, int pos, int y, int l, int r, int rt, int val) {
     49     if(l == r) {
     50         if(!sign) {
     51             minn[pos][rt] = val;
     52         } else {
     53             minn[pos][rt] = min(minn[pos<<1][rt], minn[pos<<1|1][rt]);
     54         }
     55         return ;
     56     }
     57     int m = l+r>>1;
     58     if(y<=m)
     59         sub_update(sign, pos, y, lson, val);
     60     else
     61         sub_update(sign, pos, y, rson, val);
     62     pushUp(pos, rt);
     63 }
     64 void update(int x, int y, int l, int r, int rt, int val) {
     65     if(l == r) {
     66         sub_update(0, rt, y, 1, n, 1, val);
     67         return ;
     68     }
     69     int m = l+r>>1;
     70     if(x<=m)
     71         update(x, y, lson, val);
     72     else
     73         update(x, y, rson, val);
     74     sub_update(1, rt, y, 1, n, 1, val);
     75 }
     76 void sub_query(int pos, int L, int R, int l, int r, int rt) {
     77     if(L<=l&&R>=r) {
     78         max_ans = max(max_ans, maxx[pos][rt]);
     79         min_ans = min(min_ans, minn[pos][rt]);
     80         return ;
     81     }
     82     int m = l+r>>1;
     83     if(L<=m)
     84         sub_query(pos, L, R, lson);
     85     if(R>m)
     86         sub_query(pos, L, R, rson);
     87 }
     88 void query(int LX, int RX, int LY, int RY, int l, int r, int rt) {
     89     if(LX<=l&&RX>=r) {
     90         sub_query(rt, LY, RY, 1, n, 1);
     91         return ;
     92     }
     93     int m = l+r>>1;
     94     if(LX<=m)
     95         query(LX, RX, LY, RY, lson);
     96     if(RX>m)
     97         query(LX, RX, LY, RY, rson);
     98 }
     99 int main()
    100 {
    101     int t, x, y, l, q, cnt = 1;
    102     cin>>t;
    103     while (t--) {
    104         scanf("%d", &n);
    105         build(1, n, 1);
    106         cin>>q;
    107         while(q--) {
    108             int LX, RX, LY, RY;
    109             scanf("%d%d%d%d", &LX, &LY, &RX, &RY);
    110             min_ans = inf, max_ans = 0;
    111             query(LX , RX, LY, RY, 1, n, 1);
    112             printf("%d
    ", min_ans);
    113         }
    114     }
    115 }
  • 相关阅读:
    8年开发大佬告诉你:看懂英文文档,每天只需要10分钟做这件事……
    扫雷与算法:如何随机化的布雷(二)之洗牌算法
    推荐一个项目:数据结构和算法必知必会的 50 个代码实现
    你知道什么是漂亮排序法吗?哦,知道,不就是臭皮匠排序法嘛!
    什么是漂亮排序算法:一顿操作很装逼,一看性能二点七
    什么是哈希洪水攻击(HashFlooding Attack)?
    五分钟了解一下什么是「贪心算法 」
    高考前一天,六月六号,加一!
    毕业十年后,我忍不住出了一份程序员的高考试卷
    二分查找算法详解
  • 原文地址:https://www.cnblogs.com/yohaha/p/5026324.html
Copyright © 2020-2023  润新知