HDU4819 Mosaic
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。
本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!
Can you help the
God of sheep?
the number of test cases. Then T test cases follow.
Each test case begins
with an integer n (5 < n < 800). Then the following n rows describe the
picture to pixelate, where each row has n integers representing the original
color values. The j-th integer in the i-th row is the color value of cell (i, j)
of the picture. Color values are nonnegative integers and will not exceed
1,000,000,000 (10^9).
After the description of the picture, there is an
integer Q (Q ≤ 100000 (10^5)), indicating the number of mosaics.
Then Q
actions follow: the i-th row gives the i-th replacement made by the God of
sheep: xi, yi, Li (1 ≤ xi, yi ≤ n, 1 ≤ Li < 10000, Li is odd). This means the
God of sheep will change the color value in (xi, yi) (located at row xi and
column yi) according to the Li x Li region as described above. For example, an
query (2, 3, 3) means changing the color value of the cell at the second row and
the third column according to region (1, 2) (1, 3), (1, 4), (2, 2), (2, 3), (2,
4), (3, 2), (3, 3), (3, 4). Notice that if the region is not entirely inside the
picture, only cells that are both in the region and the picture are
considered.
Note that the God of sheep will do the replacement one by one
in the order given in the input.
quotes, t means the index of the test case) at the beginning.
For each
action, print the new color value of the updated cell.
3
1 2 3
4 5 6
7 8 9
5
2 2 1
3 2 3
1 1 3
1 2 3
2 2 3
5
6
3
4
6
//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <complex>
using namespace std;
typedef long long LL;
const int MAXN = 811;
const int MAXM = 5000011;
int n,m,ju[MAXN][MAXN],X[2],Y[2],cnt,rt,ans,CC;
struct node{ int l,r,ls,rs,maxl,minl,tree; }a[MAXM];
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} namespace Seg_tree{
inline void build(int &k,int l,int r,int bel){
k=++cnt; a[k].l=l; a[k].r=r; if(l==r) { a[k].minl=a[k].maxl=ju[l][bel]; return ; }
int mid=(l+r)>>1; build(a[k].ls,l,mid,bel); build(a[k].rs,mid+1,r,bel);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl); a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
} inline int query_min(int k,int l,int r){
if(Y[0]<=l && r<=Y[1]) return a[k].minl;
int mid=(l+r)>>1;
if(Y[0]>mid) return query_min(a[k].rs,mid+1,r);
else if(Y[1]<=mid) return query_min(a[k].ls,l,mid);
else return min(query_min(a[k].ls,l,mid),query_min(a[k].rs,mid+1,r));
} inline int query_max(int k,int l,int r){
if(Y[0]<=l && r<=Y[1]) return a[k].maxl;
int mid=(l+r)>>1;
if(Y[0]>mid) return query_max(a[k].rs,mid+1,r);
else if(Y[1]<=mid) return query_max(a[k].ls,l,mid);
else return max(query_max(a[k].ls,l,mid),query_max(a[k].rs,mid+1,r));
} inline void modify(int k,int l,int r,int y){
if(l==r) { a[k].minl=a[k].maxl=ans; return ; }
int mid=(l+r)>>1;
if(y<=mid) modify(a[k].ls,l,mid,y); else modify(a[k].rs,mid+1,r,y);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl); a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
} inline void update_min(int k,int l,int r,int y){
if(l==r) { a[k].minl=CC; return ; }
int mid=(l+r)>>1;
if(y<=mid) update_min(a[k].ls,l,mid,y); else update_min(a[k].rs,mid+1,r,y);
a[k].minl=min(a[a[k].ls].minl,a[a[k].rs].minl);
} inline void update_max(int k,int l,int r,int y){
if(l==r) { a[k].maxl=CC; return ; }
int mid=(l+r)>>1;
if(y<=mid) update_max(a[k].ls,l,mid,y); else update_max(a[k].rs,mid+1,r,y);
a[k].maxl=max(a[a[k].ls].maxl,a[a[k].rs].maxl);
}
} inline void merge(int &k,node q,node qq){
if(!k) k=++cnt; a[k].maxl=max(q.maxl,qq.maxl); a[k].minl=min(q.minl,qq.minl);
a[k].l=q.l; a[k].r=q.r; if(q.l==q.r) return ;
merge(a[k].ls,a[q.ls],a[qq.ls]);
merge(a[k].rs,a[q.rs],a[qq.rs]);
} inline void build(int &k,int l,int r){
k=++cnt; a[k].l=l; a[k].r=r;
if(l==r) {
Seg_tree::build(a[k].tree,1,n,l);
return;
}
int mid=(l+r)>>1; build(a[k].ls,l,mid); build(a[k].rs,mid+1,r);
merge(a[k].tree,a[ a[a[k].ls].tree ],a[ a[a[k].rs].tree ]);
} inline int query_min(int k,int l,int r){
if(X[0]<=l && r<=X[1]) return Seg_tree::query_min(a[k].tree,1,n);
int mid=(l+r)>>1;
if(X[0]>mid) return query_min(a[k].rs,mid+1,r);
else if(X[1]<=mid) return query_min(a[k].ls,l,mid);
else return min(query_min(a[k].ls,l,mid),query_min(a[k].rs,mid+1,r));
} inline int query_max(int k,int l,int r){
if(X[0]<=l && r<=X[1]) return Seg_tree::query_max(a[k].tree,1,n);
int mid=(l+r)>>1;
if(X[0]>mid) return query_max(a[k].rs,mid+1,r);
else if(X[1]<=mid) return query_max(a[k].ls,l,mid);
else return max(query_max(a[k].ls,l,mid),query_max(a[k].rs,mid+1,r));
} inline void modify(int k,int l,int r,int x,int y){
if(l==r) { Seg_tree::modify(a[k].tree,1,n,y); return ; }
int mid=(l+r)>>1;
if(x<=mid) modify(a[k].ls,l,mid,x,y);
else modify(a[k].rs,mid+1,r,x,y); int lc=a[k].ls,rc=a[k].rs;
int lmin=Seg_tree::query_min(a[lc].tree,a[a[lc].tree].l,a[a[lc].tree].r);
int rmin=Seg_tree::query_min(a[rc].tree,a[a[rc].tree].l,a[a[rc].tree].r);
CC=min(lmin,rmin); Seg_tree::update_min(a[k].tree,a[a[k].tree].l,a[a[k].tree].r,y); int lmax=Seg_tree::query_max(a[lc].tree,a[a[lc].tree].l,a[a[lc].tree].r);
int rmax=Seg_tree::query_max(a[rc].tree,a[a[rc].tree].l,a[a[rc].tree].r);
CC=max(lmax,rmax); Seg_tree::update_max(a[k].tree,a[a[k].tree].l,a[a[k].tree].r,y);
//merge(a[k].tree,a[ a[a[k].ls].tree ],a[ a[a[k].rs].tree ]);
} inline void work(){
int T=getint();
for(int Case=1;Case<=T;Case++) {
printf("Case #%d:\n",Case); n=getint(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) ju[i][j]=getint();
for(int i=1;i<=cnt;i++) a[i].tree=a[i].ls=a[i].rs=0; cnt=0; rt=0;
build(rt,1,n); m=getint(); int x,y,z,da,xiao;
while(m--) {
y=getint(); x=getint(); z=getint(); z>>=1;
X[0]=max(x-z,1); X[1]=min(x+z,n);
Y[0]=max(y-z,1); Y[1]=min(y+z,n);
da=query_max(rt,1,n);
xiao=query_min(rt,1,n);
ans=(da+xiao)>>1; printf("%d\n",ans);
Y[0]=Y[1]=y;
modify(rt,1,n,x,y);
}
} } int main()
{
work();
return 0;
}
HDU4819 Mosaic的更多相关文章
- HDU4819 Mosaic【树套树】
LINK 题目大意 给你一个\(n*n\)矩阵,每个点有初始权值 q次询问每次把一个矩形的中心节点变成这个矩形中最大值和最小值的平均数 思路 很显然的树套树啊 就是一开始傻逼了没想到怎么去维护这个东西 ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 4819 Mosaic(13年长春现场 二维线段树)
HDU 4819 Mosaic 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4819 题意:给定一个n*n的矩阵,每次给定一个子矩阵区域(x,y,l) ...
- URAL Mosaic(并查集)(欧拉回路)
Mosaic Time limit: 0.25 secondMemory limit: 64 MB There's no doubt that one of the most important an ...
- Mosaic HDU 4819 二维线段树入门题
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- HDU 4819 Mosaic 二维线段树
Mosaic Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 用opencv画矩形打上马赛克Mosaic
/*----------------------------------------------------------------------------- * * 版权声明: * 可以 ...
- Mosaic 前端微服务框架
Mosaic 是一系列的服务.库,集成在一起,定义了组件如何彼此交互,可以用来支持大规模的web 站点开发 一张架构图 说明 尽管上图中的一些组件已经迭代演化了(skipper 的route 配置,上 ...
- 镶嵌数据集 Mosaic Dataset 的常见数据组织方式
镶嵌数据集是ESRI公司推出一种用于管理海量影像数据的数据模型,定义在GeoDatabase数据模型中. 它的常见数据组织方式有两种: 1. 源镶嵌数据集 Source Mosaic Dataset ...
随机推荐
- POJ3487[稳定婚姻]
The Stable Marriage Problem Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2974 Accepted ...
- &#x编码转换成汉字
import java.io.UnsupportedEncodingException; public class UnicodeDecoder { public static String esca ...
- WordArray (An array of 32-bit words.
CryptoJS中WordArray - qiqi715 - 博客园 http://www.cnblogs.com/qiqi715/p/9623421.html
- 【DevExpress】 SearchLookUpEdit
一.属性的基本介绍: 绑定数据源: lookUpEdit.Properties.ValueMember = 实际要用的字段; //相当于Editvalue lookUpEdit.Propertie ...
- opencv如何打印长图?
cv::Mat longMap(std::vector<cv::Mat> &set) { int matNumber = set.size(); int width = set[0 ...
- dataTables的导出Excel功能
Datatables它是一款基于jQuery表格插件,钟情于它操作dom的灵活.做后台的同学想必使用它能事半功倍,而且交互强.容易扩展. 我也是最近要做公司后台界面,表格涉及的很多,所以考虑使用DT, ...
- Python3.6全栈开发实例[008]
8.有如下变量(tu是个元祖),请实现要求的功能:tu = ("alex", [11, 22, {"k1": 'v1', "k2": [&q ...
- javascript实例:显示时间
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java性能监控之javassist探索
https://www.cnblogs.com/orionhp/p/6362615.html ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实 ...
- Linux中的日志功能
配置文件 /etc/logrotate.conf daily 日志的轮替周期是每天weekly 日志的轮替周期是每周monthly 日志的轮替周期是每月rotate 数字 保留的日志文件的个数comp ...