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]\times i\times j$
则查询$(x,y)$左上角内的权值和时,
答案$=(x+1)(y+1)ask_{a}(x,y)-(x+1)ask_{aj}(x,y)-(y+1)ask_{ai}(x,y)+ask_{aij}(x,y)$。
首先将坐标离散化,将修改拆成4个单点修改,然后从左往右插入点,用可持久化线段树维护二维前缀和。
查询时拆成4次二维前缀和查询即可。
时间复杂度$O((k+q)\log k)$。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=80010,M=3000000;
int n,m,k,q,i,j,x,y,X1,X2,Y1,Y2,s,cnt,bx[N],by[N],cl,g[N],nxt[N<<1];ll ans;
struct P{int x,y,z;P(){}P(int _x,int _y,int _z){x=_x,y=_y,z=_z;}}a[N<<1];
int tot,T[N],l[M],r[M];
struct V{
ll o,j,i,ij;
V(){o=j=i=ij=0;}
V(ll _o,ll _j,ll _i,ll _ij){o=_o,j=_j,i=_i,ij=_ij;}
V(int x,int y,int z){o=z,j=1LL*z*y,i=1LL*z*x,ij=1LL*z*x*y;}
inline V operator+(const V&b){return V(o+b.o,j+b.j,i+b.i,ij+b.ij);}
}v[M],p;
inline int lowerx(int x){
int l=1,r=cl,mid,t=0;
while(l<=r)if(bx[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline int lowery(int x){
int l=1,r=cl,mid,t=0;
while(l<=r)if(by[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
int ins(int x,int a,int b,int c){
int y=++tot;
v[y]=v[x]+p;
if(a==b)return y;
int mid=(a+b)>>1;
if(c<=mid)l[y]=ins(l[x],a,mid,c),r[y]=r[x];else l[y]=l[x],r[y]=ins(r[x],mid+1,b,c);
return y;
}
ll asko(int x,int a,int b,int d){
if(!x||!d)return 0;
if(b<=d)return v[x].o;
int mid=(a+b)>>1;
ll t=asko(l[x],a,mid,d);
if(d>mid)t+=asko(r[x],mid+1,b,d);
return t;
}
ll askj(int x,int a,int b,int d){
if(!x||!d)return 0;
if(b<=d)return v[x].j;
int mid=(a+b)>>1;
ll t=askj(l[x],a,mid,d);
if(d>mid)t+=askj(r[x],mid+1,b,d);
return t;
}
ll aski(int x,int a,int b,int d){
if(!x||!d)return 0;
if(b<=d)return v[x].i;
int mid=(a+b)>>1;
ll t=aski(l[x],a,mid,d);
if(d>mid)t+=aski(r[x],mid+1,b,d);
return t;
}
ll askij(int x,int a,int b,int d){
if(!x||!d)return 0;
if(b<=d)return v[x].ij;
int mid=(a+b)>>1;
ll t=askij(l[x],a,mid,d);
if(d>mid)t+=askij(r[x],mid+1,b,d);
return t;
}
inline ll sum(int x,int y){
int i=lowerx(x),j=lowery(y);
return asko(T[i],1,cl,j)*(x+1)*(y+1)-askj(T[i],1,cl,j)*(x+1)-aski(T[i],1,cl,j)*(y+1)+askij(T[i],1,cl,j);
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int main(){
read(n),read(m),read(k),read(q);
while(k--){
read(X1),read(X2),read(Y1),read(Y2),read(s);
a[++cnt]=P(X1,Y1,s);
a[++cnt]=P(X2+1,Y1,-s);
a[++cnt]=P(X1,Y2+1,-s);
a[++cnt]=P(X2+1,Y2+1,s);
bx[++cl]=X1,by[cl]=Y1,bx[++cl]=X2+1,by[cl]=Y2+1;
}
sort(bx+1,bx+cl+1),sort(by+1,by+cl+1);
for(i=1;i<=cnt;i++)nxt[i]=g[a[i].x=lowerx(a[i].x)],g[a[i].x]=i;
for(i=1;i<=cl;i++)for(T[i]=T[i-1],j=g[i];j;j=nxt[j])p=V(bx[i],a[j].y,a[j].z),T[i]=ins(T[i],1,cl,lowery(a[j].y));
while(q--){
read(x),read(y);
X1=ans%n+1,X2=(ans+x)%n+1;if(X1>X2)swap(X1,X2);
Y1=ans%m+1,Y2=(ans+y)%m+1;if(Y1>Y2)swap(Y1,Y2);
printf("%lld\n",ans=sum(X2,Y2)-sum(X1-1,Y2)-sum(X2,Y1-1)+sum(X1-1,Y1-1));
}
return 0;
}
BZOJ2874 : 训练士兵的更多相关文章
- 2019.01.22 bzoj2874: 训练士兵(主席树)
传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...
- BZOJ2874 训练士兵 主席树
[啊 首先 这是道权限题,然后本人显然是没有权限的 23咳3] 最近数据结构做的越来越少..然后 就跟上次一样 ,一做就是三四种不同写法. 等价的题面: 最近GY大神在sc2的天梯中被神族虐得很惨, ...
- 【BZOJ2874】训练士兵(主席树)
题意:有一个N*M的矩阵,给出一些形如(x1,y1,x2,y2,s)的操作,代表(x1,y1)到(x2,y2)都被加上了s这个数 现在有一些强制在线的询问,询问(x1,y1)到(x2,y2)的和 对于 ...
- VR与AR的发展趋势分析
概要 你是否想象过与神秘的深海生物近距离接触?你是否梦想过穿戴钢铁侠那样的超先进科技装备成为超级英雄?你又是否幻想过与梦中的女神面对面的交流?这些可能在以前都只能是存在于脑海中的幻想,可是在如今有一项 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 《C程序猿:从校园到职场》出版预告(4):从“散兵游勇”到“正规部队”
看过电视剧<楚汉传奇>的朋友应该对这个场景还有印象:当刘邦第一次去找项羽帮忙的时候.他们一行人看到了项羽军营是怎样练兵的.想到自己练兵的方法,当时就震惊了."刘家军"就 ...
- YTU 2677: 韩信点兵
2677: 韩信点兵 时间限制: 1 Sec 内存限制: 128 MB 提交: 61 解决: 38 题目描述 刘邦问韩信:"你觉得我可以带兵多少?"韩信:"最多十万. ...
- [梁山好汉说IT] 容器概念在北宋社会的应用
[梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...
- Python趣味入门9:函数是你走过的套路,详解函数、调用、参数及返回值
1.概念 琼恩·雪诺当上守夜人的司令后,为训练士兵对付僵尸兵团,把成功斩杀僵尸的一系列动作编排成了"葵花宝典剑法",这就是函数.相似,在计算机世界,一系列前后连续的计算机语句组合在 ...
随机推荐
- jsp&servlet学习笔记
1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...
- Opencv Cookbook阅读笔记(四):用直方图统计像素
灰度直方图的定义 灰度直方图是灰度级的函数,描述图像中该灰度级的像素个数(或该灰度级像素出现的频率):其横坐标是灰度级,纵坐标表示图像中该灰度级出现的个数(频率). #include <open ...
- Windows2003操作系统SQL Server 2008安装图解(详细)
最近不少用户在windows2003 server 32位操作系统上安装SQL Server2008总是失败,出现大量错误.今天经过通过我反复测试安装,找出了一个便捷的安装方法,节省大家宝贵时间,具体 ...
- JavaScript常用事件
一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 on ...
- poj 2136 Vertical Histogram 解题报告
题目链接:http://poj.org/problem?id=2136 题意不难理解,就是输入四行字符串(每行字符总数不超过72个),统计26个英文字母的数目,并按柱状图的形式输出.我的思路就是,先用 ...
- HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
题目:传送门. #include <iostream> #include <algorithm> #include <cstdio> #include <cs ...
- google maps js v3 api教程(2) -- 在地图上添加标记
原文链接 google maps javascript官方文档:https://developers.google.com/maps/documentation/javascript/ 我们在创建地图 ...
- String解析
常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.JVM虚拟机为每个被装载的类型维护一个常量池.常量池就是该类型所用到常量的一个有序集和,包括 ...
- mongodb初步使用
下载安装: 下载MongoDB:http://www.mongodb.org/. 安装MongoDB:傻瓜式安装 配置: 把bin目录添加到系统环境变量 启动: 打开一个 cmd编辑框,输入: mon ...
- Win7下Event_Log服务4201错误的有效解决方法
在对Windows7系统进行某些优化或者更改了用户权限之后,会导致Window7系统的“事件查看器”无法启动,显示相关服务没有运行,而对相应服务Windows Event Log进行手动启动的时候,会 ...