hdu 4819(二维线段树)

来源:互联网 发布:宇宙是什么样的知乎 编辑:程序博客网 时间:2024/05/03 04:23

生涯过的第一道二维线段树!

其实思维上没有什么难度啦,就是裸的二维线段树模板题。

#define _CRT_SECURE_NO_WARNINGS#include<algorithm>#include<iostream>#include<ctime>#include<cmath>#include<cstring>#include<cstdio>#include<climits>using namespace std;const int maxn = 801;int num[maxn][maxn];int n;//y轴上的线段树,作为x轴线段树的节点struct YsegmentTree{int maxed[maxn<<2], minn[maxn<<2];int x;pair<int, int> query(int i, int l, int r,int LL,int RR){if (LL >= l&&RR <= r){return make_pair(maxed[i], minn[i]);}int mid = (LL+RR) >> 1;int ls = i << 1, rs = ls | 1;if (r <= mid) return query(ls, l, r,LL,mid);else if (l > mid) return query(rs, l, r,mid+1,RR);else{pair<int, int>lef = query(ls, l, r,LL,mid);pair<int, int>rig = query(rs, l, r,mid+1,RR);return make_pair(max(lef.first, rig.first), min(lef.second, rig.second));}}}node[maxn << 2];int ll[maxn << 2], rr[maxn << 2];//buildx过程中在总的线段树(x轴线段树)进行值的更新void pushup(int xi, int yi, int l, int r){if (l == r){node[xi].maxed[yi] = max(node[xi << 1].maxed[yi], node[(xi << 1) | 1].maxed[yi]);node[xi].minn[yi] = min(node[xi << 1].minn[yi], node[(xi << 1) | 1].minn[yi]);return;}int mid = (l + r) >> 1;int yls = yi << 1, yrs = yls | 1;pushup(xi, yls, l, mid);pushup(xi, yrs, mid + 1, r);node[xi].maxed[yi] = max(node[xi << 1].maxed[yi], node[(xi << 1) | 1].maxed[yi]);node[xi].minn[yi] = min(node[xi << 1].minn[yi], node[(xi << 1) | 1].minn[yi]);}//update之后在总的线段树(x轴的线段树)上更新值void pushup1(int xi, int yi, int l, int r, int pos){if (l == r){node[xi].maxed[yi] = max(node[xi << 1].maxed[yi], node[(xi << 1) | 1].maxed[yi]);node[xi].minn[yi] = min(node[xi << 1].minn[yi], node[(xi << 1) | 1].minn[yi]);return;}int mid = (l + r) >> 1;int yls = yi << 1, yrs = yls | 1;if (pos <= mid) pushup1(xi, yls, l, mid, pos);else pushup1(xi, yrs, mid + 1, r, pos);node[xi].maxed[yi] = max(node[xi << 1].maxed[yi], node[(xi << 1) | 1].maxed[yi]);node[xi].minn[yi] = min(node[xi << 1].minn[yi], node[(xi << 1) | 1].minn[yi]);}void buildy(int xi, int yi, int l, int r,int row){if (l == r){node[xi].maxed[yi] = node[xi].minn[yi] = num[row][l];return;}int mid = (l + r) >> 1, ls = yi << 1, rs = ls | 1;buildy(xi, ls, l, mid, row);buildy(xi, rs, mid + 1, r, row);node[xi].maxed[yi] = max(node[xi].maxed[ls], node[xi].maxed[rs]);node[xi].minn[yi] = min(node[xi].minn[ls], node[xi].minn[rs]);}void buildx(int i, int l, int r){if (l == r){buildy(i, 1, 1, n, l);return;}int mid = (l + r) >> 1, ls = i << 1, rs = ls | 1;buildx(ls, l, mid);buildx(rs, mid + 1, r);pushup(i, 1, 1, n);}//从y轴开始更新void updatey(int xi, int yi, int pos, int l, int r, int val){if (l == r&&pos == l){node[xi].maxed[yi] = node[xi].minn[yi] = val;return;}int mid = (l + r) >> 1, ls = yi << 1, rs = ls | 1;if (pos <= mid) updatey(xi, ls, pos, l, mid, val);else updatey(xi, rs, pos, mid + 1, r, val);node[xi].maxed[yi] = max(node[xi].maxed[ls], node[xi].maxed[rs]);node[xi].minn[yi] = min(node[xi].minn[ls], node[xi].minn[rs]);}//从x轴出发更新void updatex(int xi, int row, int col,int l,int r, int val){if (l == r){updatey(xi, 1, col, 1, n, val);return;}int mid = (l + r) >> 1, ls = xi << 1, rs = ls | 1;if (row <= mid) updatex(ls, row, col, l, mid, val);else updatex(rs, row, col, mid + 1, r, val);pushup1(xi, 1, 1, n, col);}pair<int, int>query(int i, int l, int r, int Lrow, int Lcol, int Rrow, int Rcol){if (l >= Lrow&&r <= Rrow){return node[i].query(1, Lcol, Rcol,1,n);}int mid = (l + r) >> 1, ls = i << 1, rs = ls | 1;if (Lrow > mid) return query(rs, mid + 1, r, Lrow, Lcol, Rrow, Rcol);else if (Rrow <= mid) return query(ls, l, mid, Lrow, Lcol, Rrow, Rcol);else{pair<int, int> lef = query(ls, l, mid, Lrow, Lcol, Rrow, Rcol);pair<int, int>rig = query(rs, mid + 1, r, Lrow, Lcol, Rrow, Rcol);return make_pair(max(lef.first, rig.first), min(lef.second, rig.second));}}int main(){int T;scanf("%d", &T);for (int Case = 1; Case <= T; Case++){printf("Case #%d:\n",Case);scanf("%d", &n);for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){scanf("%d", &num[i][j]);}}buildx(1, 1, n);int Q;scanf("%d", &Q);int midx, midy, size;for (int i = 1; i <= Q; i++){scanf("%d%d%d", &midx, &midy, &size);int lefx, lefy, rigx, rigy;lefx = max(1, midx - size / 2);lefy = max(1, midy - size / 2);rigx = min(n, midx + size / 2);rigy = min(n, midy + size / 2);pair<int, int> ret = query(1, 1, n, lefx, lefy, rigx, rigy);int maxRet = ret.first, minRet = ret.second;printf("%d\n", (maxRet + minRet) >>1);updatex(1, midx, midy, 1, n, (maxRet + minRet) >> 1);}}}


0 0