题意:有一个N*M的矩阵,给出一些形如(x1,y1,x2,y2,s)的操作,代表(x1,y1)到(x2,y2)都被加上了s这个数

现在有一些强制在线的询问,询问(x1,y1)到(x2,y2)的和

对于100%的数据 n,m<=10^8,k<=40000,q<=100000;

思路:将操作(x1,y1,x2,y2,s)差分成

(x1,y1)+s

(x1,y2+1)-s

(x2+1,y1)-s

(x2+1,y2+1)+s

四个点

询问(x,y)等价于

\[\sum_{i=1}^x  \sum_{j=1}^y  \ a[i,j]*(x+1)*(y+1)-a[i,j]*i*(y+1)-a[i,j]*j*(x+1)+a[i,j]*i*j \]

证明如下:

可以看出只需维护a[i,j],a[i,j]*i,a[i,j]*j,a[i,j]*i*j四个值的二维前缀和

从左到右,从上到下排序并离散化,对每一行建立一棵主席树表示左上角的前缀和,

询问时在主席树中查找一段从头开始的前缀和即可

 var t:array[..,..]of int64;
root:array[..]of int64;
c:array[..,..]of int64;
cx,cy:array[..]of int64;
n,m,i,j,u,k,cnt,u1,u2,k1,q1,tmp,x,y:longint;
ans,x1,y1,x2,y2:int64; procedure swap(var x,y:int64);
var t:int64;
begin
t:=x; x:=y; y:=t;
end; procedure qsortx(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=cx[(l+r)>>];
repeat
while mid>cx[i] do inc(i);
while mid<cx[j] do dec(j);
if i<=j then
begin
swap(cx[i],cx[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsortx(l,j);
if i<r then qsortx(i,r);
end; procedure qsorty(l,r:longint);
var i,j,mid:longint;
begin
i:=l; j:=r; mid:=cy[(l+r)>>];
repeat
while mid>cy[i] do inc(i);
while mid<cy[j] do dec(j);
if i<=j then
begin
swap(cy[i],cy[j]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsorty(l,j);
if i<r then qsorty(i,r);
end; function hashx(x:longint):longint;
var l,r,mid,last:longint;
begin
l:=; r:=u1; last:=;
while l<=r do
begin
mid:=(l+r)>>;
if x>=cx[mid] then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
exit(last);
end; function hashy(x:longint):longint;
var l,r,mid,last:longint;
begin
l:=; r:=u2; last:=;
while l<=r do
begin
mid:=(l+r)>>;
if x>=cy[mid] then begin last:=mid; l:=mid+; end
else r:=mid-;
end;
exit(last);
end; procedure qsort(l,r:longint);
var i,j,mid1,mid2:longint;
begin
i:=l; j:=r; mid1:=c[(l+r)>>,]; mid2:=c[(l+r)>>,];
repeat
while (mid1>c[i,])or((mid1=c[i,])and(mid2>c[i,])) do inc(i);
while (mid1<c[j,])or((mid1=c[j,])and(mid2<c[j,])) do dec(j);
if i<=j then
begin
swap(c[i,],c[j,]);
swap(c[i,],c[j,]);
swap(c[i,],c[j,]);
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end; function query(p,l,r,x,y:longint):int64;
var mid:longint;
begin
if x= then exit();
if p= then exit();
if x>=r then exit(t[p,y]);
mid:=(l+r)>>;
if x<=mid then exit(query(t[p,],l,mid,x,y))
else exit(t[t[p,],y]+query(t[p,],mid+,r,x,y));
end; function ask(x,y:longint):int64;
var x1,y1:longint;
begin
x1:=hashx(x); y1:=hashy(y);
ask:=;
ask:=ask+query(root[x1],,u2,y1,)*(x+)*(y+);
ask:=ask-query(root[x1],,u2,y1,)*(y+);
ask:=ask-query(root[x1],,u2,y1,)*(x+);
ask:=ask+query(root[x1],,u2,y1,);
end; procedure update(var p:int64;l,r,x:longint;v:int64;x1,y1:longint);
var mid:longint;
begin
inc(cnt); t[cnt]:=t[p];
p:=cnt;
t[cnt,]:=t[cnt,]+v;
t[cnt,]:=t[cnt,]+v*x1;
t[cnt,]:=t[cnt,]+v*y1;
t[cnt,]:=t[cnt,]+v*x1*y1;
if l=r then exit;
mid:=(l+r)>>;
if x<=mid then update(t[p,],l,mid,x,v,x1,y1)
else update(t[p,],mid+,r,x,v,x1,y1);
end; begin
assign(input,'bzoj2874.in'); reset(input);
assign(output,'bzoj2874.out'); rewrite(output);
readln(n,m,k1,q1);
k:=;
for i:= to k1 do
begin
read(x1); read(x2); read(y1); read(y2); read(tmp);
inc(k); c[k,]:=x1; c[k,]:=y1; c[k,]:=tmp;
inc(k); c[k,]:=x1; c[k,]:=y2+; c[k,]:=-tmp;
inc(k); c[k,]:=x2+; c[k,]:=y1; c[k,]:=-tmp;
inc(k); c[k,]:=x2+; c[k,]:=y2+; c[k,]:=tmp;
inc(u); cx[u]:=x1; cy[u]:=y1;
inc(u); cx[u]:=x2+; cy[u]:=y2+;
end;
qsortx(,u); qsorty(,u);
u1:=;
for i:= to u do
if cx[i]<>cx[u1] then begin inc(u1); cx[u1]:=cx[i]; end;
u2:=;
for i:= to u do
if cy[i]<>cy[u2] then begin inc(u2); cy[u2]:=cy[i]; end; qsort(,k);
j:=;
for i:= to u1 do
begin
root[i]:=root[i-];
while (j<=k)and(hashx(c[j,])=i) do
begin
update(root[i],,u2,hashy(c[j,]),c[j,],c[j,],c[j,]);
inc(j);
end;
end;
for i:= to q1 do
begin
readln(x,y);
x1:=ans mod n+; x2:=(ans+x) mod n+; if x1>x2 then swap(x1,x2);
y1:=ans mod m+; y2:=(ans+y) mod m+; if y1>y2 then swap(y1,y2);
ans:=ask(x2,y2)-ask(x1-,y2)-ask(x2,y1-)+ask(x1-,y1-);
writeln(ans);
end;
close(input);
close(output);
end.

【BZOJ2874】训练士兵(主席树)的更多相关文章

  1. BZOJ2874 训练士兵 主席树

    [啊 首先 这是道权限题,然后本人显然是没有权限的  23咳3] 最近数据结构做的越来越少..然后 就跟上次一样 ,一做就是三四种不同写法. 等价的题面: 最近GY大神在sc2的天梯中被神族虐得很惨, ...

  2. 2019.01.22 bzoj2874: 训练士兵(主席树)

    传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...

  3. BZOJ2874 : 训练士兵

    设$a[i][j]$表示$(i,j)$右下角要增加多少 $aj[i][j]=a[i][j]\times j$ $ai[i][j]=a[i][j]\times i$ $aij[i][j]=a[i][j] ...

  4. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  5. Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)

    题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...

  6. K-th Number Poj - 2104 主席树

    K-th Number Poj - 2104 主席树 题意 给你n数字,然后有m次询问,询问一段区间内的第k小的数. 解题思路 这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简 ...

  7. 集训队8月1日(拓扑排序+DFS+主席树入门)

    上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...

  8. bzoj3207--Hash+主席树

    题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...

  9. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  10. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

随机推荐

  1. zz Must read

    http://www.opengpu.org/forum.php?mod=viewthread&tid=965&extra=page%3D1 游戏引擎剖析(Game Engine An ...

  2. UEFI+GPT引导实践篇(二):UEFI引导安装64位Win7/Win8

    下文是在联想Y480笔记本上以UEFI方式启动安装Windows8的全过程,安装Windows7过程基本相同.注意,如果你的电脑硬盘是MBR分区结构,安装过程中将要删除硬盘上所有数据,请安装前备份硬盘 ...

  3. Android狂记忆

    虽然说技术人员偏爱实战,而不屑理论或记忆,但实战之前,若是记忆一些知识,开发起来将会如虎添翼,不说了,开始狂记吧! Android 系统包说明: android.app  :提供高层的程序模型.提供基 ...

  4. JS-获取URL请求参数

    前言:原来做过一个项目,需要实现一个页面打印的功能,由于项目中使用了AngularJS+Bootstrap等前端框架,需要打印的页面又在弹出框中,使用了Bootstrap的模态框后发现打印的效果不太好 ...

  5. mysql连接查询,封装mysql函数

    连接查询 交叉连接语法: select  * | 字段列表 from 表1  cross join 表2 内连接: select *|字段列表 from 左表 inner join 右表 on 左表. ...

  6. Java集合框架(常用类) JCF

    Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...

  7. MYSQL 优化常用方法

    1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽 ...

  8. ue4标签测试与总结(UPROPERTY)

    学习UE4框架中的标签,本篇是总结成员变量标签UPROPERTY. 引擎版本:4.12.5 前期准备: 1.新建项目,C++空模板,新建C++类,继承AActor,名称MyActor. 使用TestA ...

  9. Orcle基本语句(四)

    --显示员工的编号,姓名,工资,工资级别,所在部门的名称;(使用emp表) SELECT * FROM emp; SELECT * FROM salgrade; SELECT * FROM dept; ...

  10. java二

    一,面向对象 面向对象,似乎是太抽象了点,没人敢拍着胸脯说我面向对象学到了100%,纵然如此,了解面向对象的思想对于学好java等面向对象编程语言有着莫大的好处,因为一通百通,同样是面向对象,等你精通 ...