UVA 11992 - Fast Matrix Operations
来源:互联网 发布:淘宝网店怎么转让 编辑:程序博客网 时间:2024/04/28 15:41
题目链接:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=501&page=show_problem&problem=3143
解题思路:
题目大意:给你一个矩阵,然后有3种操作:
1 x1 y1 x2 y2 val是将矩阵x1 y1 x2 y2的区间内的值全部增加val
2 x1 y1 x2 y2 val是将矩阵x1 y1 x2 y2的区间内的值全部设置为val
3 x1 y1 x2 y2 求出x1 y1 x2 y2的区间内的和,最大值,最小值。
矩阵不超过20行,矩阵元素却可能达到1000000个,可以想到每行建一颗线段树,则本题转为一维问题。本题有两个操作,add和set,因此需要两个标记add和setv,含义同前。规定同时有两个标记时,表示先执行set再执行add,传递代码如下:
void pushdown(int id){ if(tree[id].l >= tree[id].r) return; if(tree[id].setv){ tree[id<<1].setv = tree[id<<1|1].setv = tree[id].setv; tree[id<<1].minn = tree[id<<1|1].minn = tree[id].setv; tree[id<<1].maxn = tree[id<<1|1].maxn = tree[id].setv; tree[id<<1].add = tree[id<<1|1].add = 0; tree[id<<1].sum = (tree[id<<1].r-tree[id<<1].l+1)*tree[id].setv; tree[id<<1|1].sum = (tree[id<<1|1].r-tree[id<<1|1].l+1)*tree[id].setv; tree[id].setv = 0; } if(tree[id].add){ int tmp = tree[id].add; tree[id<<1].add += tmp;tree[id<<1|1].add += tmp; tree[id<<1].minn += tmp;tree[id<<1|1].minn += tmp; tree[id<<1].maxn +=tmp;tree[id<<1|1].maxn += tmp; tree[id<<1].sum += (tree[id<<1].r-tree[id<<1].l+1)*tmp; tree[id<<1|1].sum += (tree[id<<1|1].r - tree[id<<1|1].l+1)*tmp; tree[id].add = 0; }}
AC代码:
#include <iostream>#include <cstdio>#include <algorithm>#define INF 0xfffffffusing namespace std;const int N = 1000010;struct node{ int l,r; int minn,maxn,sum; int add,setv;}tree[N<<2];int anssum,ansmin,ansmax;void maintain(int id){ if(tree[id].l >= tree[id].r) return ; tree[id].maxn = max(tree[id<<1].maxn,tree[id<<1|1].maxn); tree[id].minn = min(tree[id<<1].minn,tree[id<<1|1].minn); tree[id].sum = tree[id<<1].sum + tree[id<<1|1].sum;}void build(int id,int l,int r){//id:index tree[id].l = l; tree[id].r = r; tree[id].add = 0; tree[id].setv = 0; if(l == r){ tree[id].sum = tree[id].minn = tree[id].maxn = 0; return; } int mid = (l+r)>>1; build(id<<1,l,mid); build(id<<1|1,mid+1,r); maintain(id);}void pushdown(int id){ if(tree[id].l >= tree[id].r) return; if(tree[id].setv){ tree[id<<1].setv = tree[id<<1|1].setv = tree[id].setv; tree[id<<1].minn = tree[id<<1|1].minn = tree[id].setv; tree[id<<1].maxn = tree[id<<1|1].maxn = tree[id].setv; tree[id<<1].add = tree[id<<1|1].add = 0; tree[id<<1].sum = (tree[id<<1].r-tree[id<<1].l+1)*tree[id].setv; tree[id<<1|1].sum = (tree[id<<1|1].r-tree[id<<1|1].l+1)*tree[id].setv; tree[id].setv = 0; } if(tree[id].add){ int tmp = tree[id].add; tree[id<<1].add += tmp;tree[id<<1|1].add += tmp; tree[id<<1].minn += tmp;tree[id<<1|1].minn += tmp; tree[id<<1].maxn +=tmp;tree[id<<1|1].maxn += tmp; tree[id<<1].sum += (tree[id<<1].r-tree[id<<1].l+1)*tmp; tree[id<<1|1].sum += (tree[id<<1|1].r - tree[id<<1|1].l+1)*tmp; tree[id].add = 0; }}void updateSet(int id,int l,int r,int val){ if(tree[id].l >= l && tree[id].r <= r){ tree[id].setv = val; tree[id].minn = val; tree[id].maxn = val; tree[id].add = 0; tree[id].sum = (tree[id].r-tree[id].l+1)*val; return; } pushdown(id); int mid = (tree[id].l+tree[id].r)>>1; if(l <= mid) updateSet(id<<1,l,r,val); if(mid < r) updateSet((id<<1)+1,l,r,val); maintain(id);}void updateAdd(int id,int l,int r,int val){ if(tree[id].l >= l && tree[id].r <= r){ tree[id].add += val; tree[id].minn += val; tree[id].maxn += val; tree[id].sum += (tree[id].r-tree[id].l+1)*val; return; } pushdown(id); int mid = (tree[id].l+tree[id].r)>>1; if(l <= mid) updateAdd(id<<1,l,r,val); if(mid < r) updateAdd((id<<1)+1,l,r,val); maintain(id);}void query(int id,int l,int r){ if(tree[id].l >= l && tree[id].r <= r){ anssum += tree[id].sum; ansmin = min(ansmin,tree[id].minn); ansmax = max(ansmax,tree[id].maxn); return; } pushdown(id); int mid = (tree[id].l+tree[id].r)>>1; if(l <= mid) query(id<<1,l,r); if(mid < r) query(id<<1|1,l,r); maintain(id);}int main(){ int r,c,m; while(~scanf("%d%d%d",&r,&c,&m)){ build(1,1,r*c); int op,x1,x2,y1,y2,val; while(m--){ scanf("%d",&op); if(op == 1){ scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val); for(int i = x1; i <= x2; i++) updateAdd(1,(i-1)*c+y1,(i-1)*c+y2,val); } else if(op == 2){ scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&val); for(int i = x1; i <= x2; i++) updateSet(1,(i-1)*c+y1,(i-1)*c+y2,val); } else{ scanf("%d%d%d%d",&x1,&y1,&x2,&y2); anssum = 0;ansmin = INF;ansmax = -INF; for(int i = x1; i <= x2; i++) query(1,(i-1)*c+y1,(i-1)*c+y2); printf("%d %d %d\n",anssum,ansmin,ansmax); } } } return 0;}/*4 4 81 1 2 4 4 53 2 1 4 41 1 1 3 4 23 1 2 4 43 1 1 3 42 2 1 4 4 23 1 2 4 41 1 1 4 3 3*/
0 0
- Uva-11992-Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- Fast Matrix Operations ,uva 11992
- UVA 11992 Fast Matrix Operations
- UVA - 11992 Fast Matrix Operations
- UVa:11992 Fast Matrix Operations
- UVA 11992Fast Matrix Operations
- UVA 11992 - Fast Matrix Operations
- UVa 11992 Fast Matrix Operations
- uva 11992 Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- Uva 11992 Fast Matrix Operations
- UVA 11992 Fast Matrix Operations
- uva 11992 Fast Matrix Operations(线段树)
- UVa 11992 Fast Matrix Operations 线段树
- UVA 11992 - Fast Matrix Operations(线段树)
- uva 11992 Fast Matrix Operations 线段树
- uva 11992 - Fast Matrix Operations(线段树)
- 【DB.MySQL】在Mac如何启动MySQL
- OpenGL 列主序 矩阵
- Tips for Storm
- HDFS文件操作
- 20150802-网络连接-TCP
- UVA 11992 - Fast Matrix Operations
- Python学习之异常
- 20150801 jQuery基础学习笔记(下)
- Shell 学习16 - Shell case esac 语句
- Python学习之文件
- POJ 1324 Holedox Moving 位运算+BFS
- java实现各种数字三角形
- 又开始刷题
- 黑马程序员------IO流