数据结构(二维线段树,差分): NOI2012 魔幻棋盘
貌似想复杂了……
#include <iostream>
#include <cstring>
#include <cstdio>
#define mid ((l+r)>>1)
using namespace std;
const int maxn=;
const int maxm=;
int N,M,Q;
struct Array{
long long num[maxm];
long long *operator [](int x){
return &num[(x-)*M];
}
}a,b; long long ABS(long long x){return x>?x:-x;}
long long GCD(long long x,long long y){
return y?GCD(y,x%y):ABS(x);
} int cnt,ch[maxn][];
long long w[maxn]; void Merge(int &x,int p1,int p2,int l,int r){
if(!x)x=++cnt;
w[x]=GCD(w[p1],w[p2]);
if(l!=r){
Merge(ch[x][],ch[p1][],ch[p2][],l,mid);
Merge(ch[x][],ch[p1][],ch[p2][],mid+,r);
}
} void Build(int &x,int l,int r,long long t[]){
x=++cnt;
if(l==r){
w[x]=t[l];
return;
}
Build(ch[x][],l,mid,t);
Build(ch[x][],mid+,r,t);
w[x]=GCD(w[ch[x][]],w[ch[x][]]);
} int rt[maxm<<];
void Build(int x,int l,int r){
if(l==r){
Build(rt[x],,M,a[l]);
return;
}
Build(x<<,l,mid);
Build(x<<|,mid+,r);
Merge(rt[x],rt[x<<],rt[x<<|],,M);
} int x,y,tx,ty;
int tp,x1,y1,x2,y2;
long long d; void Change(int x,int l,int r,long long d){
if(l==r){w[x]+=d;return;}
if(mid>=ty)Change(ch[x][],l,mid,d);
else Change(ch[x][],mid+,r,d);
w[x]=GCD(w[ch[x][]],w[ch[x][]]);
} void Update(int x,int p1,int p2,int l,int r){
w[x]=GCD(w[p1],w[p2]);
if(l==r)return;
if(mid>=ty)Update(ch[x][],ch[p1][],ch[p2][],l,mid);
else Update(ch[x][],ch[p1][],ch[p2][],mid+,r);
} void Modify(int x,int l,int r,long long d){
if(l==r){
Change(rt[x],,M,d);
return;
}
if(mid>=tx)Modify(x<<,l,mid,d);
else Modify(x<<|,mid+,r,d);
Update(rt[x],rt[x<<],rt[x<<|],,M);
} long long Que(int x,int l,int r){
if(l>=y1&&r<=y2)
return w[x];
long long ret=;
if(mid>=y1)ret=Que(ch[x][],l,mid);
if(mid<y2)ret=GCD(ret,Que(ch[x][],mid+,r));
return ret;
} long long Query(int x,int l,int r){
if(l>=x1&&r<=x2)
return Que(rt[x],,M);
long long ret=;
if(mid>=x1)ret=Query(x<<,l,mid);
if(mid<x2)ret=GCD(ret,Query(x<<|,mid+,r));
return ret;
} int main(){
freopen("chessa.in","r",stdin);
freopen("chessa.out","w",stdout);
scanf("%d%d",&N,&M);
scanf("%d%d",&x,&y);
scanf("%d",&Q);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
scanf("%lld",&b[i][j]);
for(int i=;i<=N;i++)
for(int j=;j<=M;j++){
a[i][j]=b[i][j];
if(i<x)a[i][j]-=b[i+][j];
if(i>x)a[i][j]-=b[i-][j];
if(j<y)a[i][j]-=b[i][j+];
if(j>y)a[i][j]-=b[i][j-];
if(i!=x&&j!=y)a[i][j]+=b[i+(i<x?:-)][j+(j<y?:-)];
} Build(,,N);
while(Q--){
scanf("%d",&tp);
scanf("%d%d",&x1,&y1);
scanf("%d%d",&x2,&y2);
if(tp==){
x1=x-x1;x2=x+x2;
y1=y-y1;y2=y+y2;
printf("%lld\n",Query(,,N));
}
if(tp==){
scanf("%lld",&d); {
if(x1<=x&&y1<=y){
tx=x1-;ty=y1-;
if(tx&&ty)Modify(,,N,d);
} if(x1<=x&&y1>y){
tx=x1-;ty=y1;
if(tx)Modify(,,N,-d);
} if(x1>x&&y1<=y){
tx=x1;ty=y1-;
if(ty)Modify(,,N,-d);
} if(x1>x&&y1>y){
tx=x1;ty=y1;
Modify(,,N,d);
}
} {
if(x1<=x&&y2<y){
tx=x1-;ty=y2;
if(tx)Modify(,,N,-d);
} if(x1<=x&&y2>=y){
tx=x1-;ty=y2+;
if(tx&&ty<=M)Modify(,,N,d);
} if(x1>x&&y2<y){
tx=x1;ty=y2;
Modify(,,N,d);
} if(x1>x&&y2>=y){
tx=x1;ty=y2+;
if(ty<=M)Modify(,,N,-d);
}
} {
if(x2<x&&y1<=y){
tx=x2;ty=y1-;
if(ty)Modify(,,N,-d);
} if(x2<x&&y1>y){
tx=x2;ty=y1;
Modify(,,N,d);
} if(x2>=x&&y1<=y){
tx=x2+;ty=y1-;
if(tx<=N&&ty)Modify(,,N,d);
} if(x2>=x&&y1>y){
tx=x2+;ty=y1;
if(tx<=N)Modify(,,N,-d);
}
} {
if(x2<x&&y2<y){
tx=x2;ty=y2;
Modify(,,N,d);
} if(x2<x&&y2>=y){
tx=x2;ty=y2+;
if(ty<=M)Modify(,,N,-d);
} if(x2>=x&&y2<y){
tx=x2+;ty=y2;
if(tx<=N)Modify(,,N,-d);
} if(x2>=x&&y2>=y){
tx=x2+;ty=y2+;
if(tx<=N&&ty<=M)Modify(,,N,d);
}
} if(x1<=x&&x2>=x){
if(y1<=y){
tx=x;ty=y1-;
if(ty)Modify(,,N,-d);
}
if(y1>y){
tx=x;ty=y1;
Modify(,,N,d);
} if(y2<y){
tx=x;ty=y2;
Modify(,,N,d);
}
if(y2>=y){
tx=x;ty=y2+;
if(ty<=M)Modify(,,N,-d);
}
} if(y1<=y&&y2>=y){
if(x1<=x){
tx=x1-;ty=y;
if(tx)Modify(,,N,-d);
}
if(x1>x){
tx=x1;ty=y;
Modify(,,N,d);
} if(x2<x){
tx=x2;ty=y;
Modify(,,N,d);
}
if(x2>=x){
tx=x2+;ty=y;
if(tx<=N)Modify(,,N,-d);
}
} if(x1<=x&&x2>=x&&y1<=y&&y2>=y){
tx=x;ty=y;
Modify(,,N,d);
}
}
}
return ;
}
数据结构(二维线段树,差分): NOI2012 魔幻棋盘的更多相关文章
- POJ 2155 Matrix (二维线段树)
Matrix Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 17226 Accepted: 6461 Descripti ...
- HDU 4819 Mosaic (二维线段树)
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- BZOJ2877 NOI2012魔幻棋盘(二维线段树)
显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...
- NOI 2012 魔幻棋盘 | 二维差分 + 二维线段树
题目:luogu 2086 二维线段树,按套路差分原矩阵,gcd( x1, x2, ……, xn ) = gcd( xi , x2 - x1 , ……, xn - xn-1 ),必须要有一个原数 xi ...
- [BZOJ2877][NOI2012]魔幻棋盘(二维线段树)
https://blog.sengxian.com/solutions/bzoj-2877 注意二维线段树的upd()也是一个O(log n)的函数(pushdown()应该也是但没写过). #inc ...
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
P1716 - 上帝造题的七分钟 From Riatre Normal (OI)总时限:50s 内存限制:128MB 代码长度限制:64KB 背景 Background 裸体就意味着 ...
- [JZOJ3615]【NOI2014模拟】数列(平面几何+二维线段树)
Description 给定一个长度为n的正整数数列a[i]. 定义2个位置的f值为两者位置差与数值差的和,即f(x,y)=|x-y|+|a[x]-a[y]|. 你需要写一个程序支持2种操作(k都是正 ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- BZOJ 3489 A simple rmq problem 可持久化KDtree/二维线段树
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题意概述: 给出一个序列,每次询问一个序列区间中仅出现了一次的数字最大是多少,如果 ...
- bzoj 1513 POI2006 Tet-Tetris 3D 二维线段树+标记永久化
1511: [POI2006]OKR-Periods of Words Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 351 Solved: 220[S ...
随机推荐
- java InputStream
java InputStream 当为网络数据流是,不能以read为-1作为数据结束的尾. 而用下列案例获取数据. Log.v(TAG, "==========start========== ...
- Shell - 文件运算符
文件运算符 文件运算符 描述 -b file 检测 file 是否为块设备文件 -c file 检测 file 是否为字符设备文件 -d file 检测 file 是否为目录 -e fil ...
- EntityFramework 中生成的类加注释
EF5在生成实体类时获取不到数据库中表的说明字段,需要使用单独的t4模板来获取 下载文件 将文件与edmx 放同一文件夹 1.在生成类的t4模板中加入 <#@ include file=&quo ...
- listview的动态加载数据问题
1:调用adapter.notifyDataSetChanged()却不起作用 原因可能有一下几点 1.数据源没有更新,调用notifyDataSetChanged无效. 2.数据源更新了,但是它指向 ...
- 用JS实现AJAX
用JS实现AJAX 准备工作:新建网站,建立两个页面,index.aspx和backstage.aspx, 在工程目录下新建一个文件夹命名和image,在这里添加一个loading.gif,模拟提 ...
- NSCondition的用法,NSCondication实现线程同步,生产者消费问题实现(转载)
NSCondition的用法 使用NSCondition,实现多线程的同步,即,可实现生产者消费者问题. 基本思路是,首先要创建公用的NSCondition实例.然后: 消费者取得锁,取产品,如果没有 ...
- mysqldump备份、还原数据库路径名含有空格的处理方法(如:Program Files)
虽然以下的方法也可以解决,不过最简单直接的,还是直接在路径前后加双引号-" ",这个方法简单有效. 首先要说明的是mysqldump.exe在哪里不重要,重要的是要处理好路径中的非 ...
- SGU 165.Basketball
题意 输入n个在[1.95,2.05]范围内的数. 保证他们的平均数为2.00. 现在要求把这些数调整出一个顺序, 使得任意长度为K的子段和与2.00* ...
- Cocos2dx开发(1)——Win8.1下 NDK r10 环境搭建
内容简要:仅讲述NDK在Windows环境下搭建方法,至于NDK何物一概不属于本文内容,老鸟或已有环境的跳过. 笔者已安装的环境: vs2013企业版.谷歌官网adt 22.3.0(推荐)省得自己ec ...
- 生成器模式(Builder)
1.本质:分离整体构建算法和部分构造 2.示意图: 3.功能: 构建复杂的产品,而且是细化的.分步骤的构建产品 分离构建算法和具体的构建实现 具体的构造实现可以方便的切换和扩展 4.优点: 1.松散耦 ...