https://blog.sengxian.com/solutions/bzoj-2877

注意二维线段树的upd()也是一个O(log n)的函数(pushdown()应该也是但没写过)。

 #include<cstdio>
#include<algorithm>
#define Ls (x<<1)
#define Rs (Ls|1)
#define Lson Ls,L,mid
#define Rson Rs,mid+1,R
#define lson ls[x],L,mid
#define rson rs[x],mid+1,R
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
typedef long long ll;
using namespace std; const int N=,M=;
ll c,sm[M],a[N];
int n,m,x,y,T,nd,op,x1,x2,y1,y2,rt[N<<],ls[M],rs[M]; int F(int x,int y){ return (x-)*m+y; }
ll gcd(ll a,ll b){ return b ? gcd(b,a%b) : a; } void mdfy(int &x,int L,int R,int pos,ll k){
if (!x) x=++nd;
if (L==R){ sm[x]+=k; return; }
int mid=(L+R)>>;
if (pos<=mid) mdfy(lson,pos,k); else mdfy(rson,pos,k);
sm[x]=gcd(sm[ls[x]],sm[rs[x]]);
} void upd(int &x,int L,int R,int pos,int lp,int rp){
if (!x) x=++nd;
if (L==R){ sm[x]=gcd(sm[lp],sm[rp]); return; }
int mid=(L+R)>>;
if (pos<=mid) upd(lson,pos,ls[lp],ls[rp]); else upd(rson,pos,rs[lp],rs[rp]);
sm[x]=gcd(sm[ls[x]],sm[rs[x]]);
} void mdfx(int x,int L,int R,int x1,int y1,ll k){
if (L==R){ mdfy(rt[x],,m,y1,k); return; }
int mid=(L+R)>>;
if (x1<=mid) mdfx(Lson,x1,y1,k); else mdfx(Rson,x1,y1,k);
upd(rt[x],,m,y1,rt[Ls],rt[Rs]);
} ll quey(int x,int L,int R,int l,int r){
if (L==l && r==R) return sm[x];
int mid=(L+R)>>;
if (r<=mid) return quey(lson,l,r);
else if (l>mid) return quey(rson,l,r);
else return gcd(quey(lson,l,mid),quey(rson,mid+,r));
} ll quex(int x,int L,int R,int l,int r,int y1,int y2){
if (L==l && r==R) return quey(rt[x],,m,y1,y2);
int mid=(L+R)>>;
if (r<=mid) return quex(Lson,l,r,y1,y2);
else if (l>mid) return quex(Rson,l,r,y1,y2);
else return gcd(quex(Lson,l,mid,y1,y2),quex(Rson,mid+,r,y1,y2));
} int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&x,&y,&T); int r1=(n+)*+,r2=r1+;
rep(i,,n) rep(j,,m) scanf("%lld",&a[F(i,j)]);
rep(i,,n-) rep(j,,m-) mdfx(,,n,i,j,a[F(i+,j+)]-a[F(i+,j)]-a[F(i,j+)]+a[F(i,j)]);
rep(i,,n-) mdfy(rt[r1],,n,i,a[F(i+,y)]-a[F(i,y)]);
rep(i,,m-) mdfy(rt[r2],,m,i,a[F(x,i+)]-a[F(x,i)]);
while (T--){
scanf("%d%d%d%d%d",&op,&x1,&y1,&x2,&y2);
if (op==){
ll t1=(x1+x2) ? quey(rt[r1],,n,x-x1,x+x2-) : ;
ll t2=(y1+y2) ? quey(rt[r2],,m,y-y1,y+y2-) : ;
ll t3=((x1+x2)&&(y1+y2)) ? quex(,,n,x-x1,x+x2-,y-y1,y+y2-) : ;
printf("%lld\n",abs(gcd(gcd(t1,t2),gcd(t3,a[F(x,y)]))));
}else{
scanf("%lld",&c);
mdfx(,,n,x1-,y1-,c); mdfx(,,n,x1-,y2,-c);
mdfx(,,n,x2,y1-,-c); mdfx(,,n,x2,y2,c);
if (y1<=y && y2>=y) mdfy(rt[r1],,n,x1-,c),mdfy(rt[r1],,n,x2,-c);
if (x1<=x && x2>=x) mdfy(rt[r2],,m,y1-,c),mdfy(rt[r2],,m,y2,-c);
if (x1<=x && x2>=x && y1<=y && y2>=y) a[F(x,y)]+=c;
}
}
return ;
}

[BZOJ2877][NOI2012]魔幻棋盘(二维线段树)的更多相关文章

  1. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  2. NOI 2012 魔幻棋盘 | 二维差分 + 二维线段树

    题目:luogu 2086 二维线段树,按套路差分原矩阵,gcd( x1, x2, ……, xn ) = gcd( xi , x2 - x1 , ……, xn - xn-1 ),必须要有一个原数 xi ...

  3. BZOJ2877 [Noi2012]魔幻棋盘

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  4. UVA 11297 线段树套线段树(二维线段树)

    题目大意: 就是在二维的空间内进行单个的修改,或者进行整块矩形区域的最大最小值查询 二维线段树树,要注意的是第一维上不是叶子形成的第二维线段树和叶子形成的第二维线段树要  不同的处理方式,非叶子形成的 ...

  5. POJ2155 Matrix二维线段树经典题

    题目链接 二维树状数组 #include<iostream> #include<math.h> #include<algorithm> #include<st ...

  6. HDU 1823 Luck and Love(二维线段树)

    之前只知道这个东西的大概概念,没具体去写,最近呵呵,今补上. 二维线段树 -- 点更段查 #include <cstdio> #include <cstring> #inclu ...

  7. poj 2155:Matrix(二维线段树,矩阵取反,好题)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17880   Accepted: 6709 Descripti ...

  8. poj 1195:Mobile phones(二维线段树,矩阵求和)

    Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 De ...

  9. POJ 2155 Matrix (二维线段树)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17226   Accepted: 6461 Descripti ...

随机推荐

  1. keras例子-matchnet

    2015CVPR:MatchNet_ Unifying Feature and Metric Learning for Patch-Based Matching 主要是基于patch的图像特征匹配,基 ...

  2. 转:vue+canvas如何实现b站萌系登录界面

    https://juejin.im/post/5ae802a46fb9a07ac55fec04

  3. vue系列之MVVM框架

    当数据发生变化时,ViewModel就会检测到,然后通知相应的View改变 当用户操作View时,ViewModel就会检测到,然后Model,修改相应的数据,最终实现双向绑定 适用场景:针对具有复杂 ...

  4. Gradient Domain Guided Image Filtering(梯度域导向滤波)

    作者提出了一种新的梯度域引导图像滤波器,通过将明确的一阶边缘感知约束结合到现有的引导图像滤波器中. matlab代码实现 转载至:https://blog.csdn.net/majinlei121/a ...

  5. C++ code:浮点数的比较(Floating-Pointing Number Comparison)

    浮点数可以进行比较,但是浮点数由于表示精度在不同浮点数类型中的差异,所以会被误用.例如: #include <iostream> using namespace std; int main ...

  6. PHP数组序列化和反序列化

    PHP序列化在我们实际项目运行过程中是一种非常常见的操作.比如当我们想要将数组值存储到数据库时,就可以对数组进行序列化操作,然后将序列化后的值存储到数据库中.其实PHP序列化数组就是将复杂的数组数据类 ...

  7. jquery----语法扩展(导入js文件)

    简单使用 第一步,新建js文件 第二步,在js文件中添加 $.extend({ "GDP": function () { console.log("哈哈哈哈") ...

  8. 性能测试十六:liunx下jmete配置环境变量

    修改环境变量后就不用每次手动输入路径,省时省事,减少命令长度和出错率 按Ctrl+L可进行翻页,翻页到最后一行,此处有java的环境变量 添加jmeter的目录和bin目录 此时,虽修改成功,但是并未 ...

  9. python 全栈开发,Day29(昨日作业讲解,模块搜索路径,编译python文件,包以及包的import和from,软件开发规范)

    一.昨日作业讲解 先来回顾一下昨日的内容 1.os模块 和操作系统交互 工作目录 文件夹 文件 操作系统命令 路径相关的 2.模块 最本质的区别 import会创建一个专属于模块的名字, 所有导入模块 ...

  10. 解决/bin/sh: 1: syntax error: "(" unexpected错误,以及更换bash仍然无法解决的问题

    编译文件的时候出现 /bin/sh: 1: syntax error: "(" unexpected 错误. 网上查到的资料都是: (1)在脚本前写#!/bin/bash (2)执 ...