BZOJ #2874. 训练士兵(差分+离散化+主席树)

BZOJ #2874. 训练士兵

  • description
  • solution
  • code

description

Ryz正在着手于训练一批精锐士兵

Ryz手下有n*m个士兵,排成一个n行m列的方阵。在一天中,ryz会对士兵下达一些命令,每个命令作用于一个小方阵的所有士兵,并且会增加他们的疲劳值。现在ryz想知道,在一整天训练中,某些小方阵中的士兵的疲劳值总和是多少

Input

第一行有3个整数n,m,k,q。分别表示方阵的行数、列数、指令数和询问数。

接下来k行,每行5个整数x1,x2,y1,y2,s,描述一个指令,表示这条指令对所有坐标(x,y)满足x1<=x<=x2且y1<=y<=y2的士兵产生了s的疲劳值。

(1<=x1<=x2<=n,1<=y1<=y2<=m,0<=s<=1000)

接下来q行,每行2个整数x,y(x,y<=10^9),描述一个询问,询问是被加密的。一个询问的密码是上一个询问的答案(记为c),第一个询问的密码是0。询问参数的计算方式如下:

x1=c % n+1,x2=(c+x) % n+1,如果x1>x2则交换x1和x2

y1=c % m+1,y2=(c+y) % m +1,如果y1>y2则交换y1和y2

询问所有坐标(x,y)满足x1<=x<=x2且y1<=y<=y2的士兵的疲劳值总和。

保证答案<2^64

Output

对于每个询问,输出一行答案

Sample
输入样例1

4 5 3 3
1 3 2 2 7
2 4 2 3 5
1 4 4 5 6
1 2
0 3
2 2

输出样例1

24
12
46

第一次询问的是左上角坐标为(1,1),右下角坐标为(2,3)的这个矩形

第二次询问的是左上角坐标为(1,3),右下角坐标为(1,5)的这个矩形

第三次询问的是左上角坐标为(1,3),右下角坐标为(3,5)这个矩形

输入样例2

5 5 5 5
1 1 1 3 242
1 4 4 5 83
3 5 3 3 221
2 2 1 3 254
5 5 2 2 105
0 1
0 4
2 1
1 3
0 1

输出样例2

484
0
992
442
304

Hint

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

solution

一个二维矩阵,一般处理套路就是二维差分

对于修改,维护(x,y)(x,y)(x,y)右下角的贡献

(x1,y1,x2,y2)(x_1,y_1,x_2,y_2)(x1,y1,x2,y2)差分成(x1,y1)−(x1,y2+1)−(x2+1,y1)+(x2+1,y2+1)(x_1,y_1)-(x_1,y_2+1)-(x_2+1,y_1)+(x_2+1,y_2+1)(x1,y1)(x1,y2+1)(x2+1,y1)+(x2+1,y2+1)

只用修改四个点

对于询问,则求(x,y)(x,y)(x,y)左上角的贡献

(x1,y1,x2,y2)(x_1,y_1,x_2,y_2)(x1,y1,x2,y2)差分成(x2,y2)−(x1,y2−1)−(x2−1,y1)+(x1−1,y1−1)(x_2,y_2)-(x_1,y_2-1)-(x_2-1,y_1)+(x_1-1,y_1-1)(x2,y2)(x1,y21)(x21,y1)+(x11,y11)

只用查询四个点

考虑差分后的某个修改点(i,j)(i,j)(i,j)对于差分后的某个查询点(x,y)(x,y)(x,y)的实际影响

显然∀row∈[i,x],col∈[j,y]\forall_{row\in[i,x],col\in[j,y]}row[i,x],col[j,y]的点对(row,col)(row,col)(row,col)都会加上si,js_{i,j}si,j带来的劳累,贡献和即(x−i+1)(y−j+1)si,j(x-i+1)(y-j+1)s_{i,j}(xi+1)(yj+1)si,j

那么查询一个左上角的(1,1)−(x,y)(1,1)-(x,y)(1,1)(x,y)矩阵,这里面每个修改点的劳累贡献都可以计算,求和就是这个查询矩阵的答案
∑i=1x∑j=1y(x−i+1)(y−j+1)si,j\sum_{i=1}^x\sum_{j=1}^y(x-i+1)(y-j+1)s_{i,j} i=1xj=1y(xi+1)(yj+1)si,j

=∑i=1x∑j=1y(xy+y+x+1−iy−i−jx−j+ij)si,j=\sum_{i=1}^x\sum_{j=1}^y(xy+y+x+1-iy-i-jx-j+ij)s_{i,j} =i=1xj=1y(xy+y+x+1iyijxj+ij)si,j

=∑i=1x∑j=1y((x+1)(y+1)−(y+1)i−(x+1)j+ij)si,j=\sum_{i=1}^x\sum_{j=1}^y\Big((x+1)(y+1)-(y+1)i-(x+1)j+ij\Big)s_{i,j} =i=1xj=1y((x+1)(y+1)(y+1)i(x+1)j+ij)si,j

=(x+1)(y+1)∑i=1x∑j=1xsi,j−(y+1)∑i=1x∑j=1xsi,j∗i−(x+1)∑i=1x∑j=1xsi,j∗j+∑i=1x∑j=1xsi,j∗i∗j=(x+1)(y+1)\sum_{i=1}^x\sum_{j=1}^xs_{i,j}-(y+1)\sum_{i=1}^x\sum_{j=1}^xs_{i,j}*i-(x+1)\sum_{i=1}^x\sum_{j=1}^xs_{i,j}*j+\sum_{i=1}^x\sum_{j=1}^xs_{i,j}*i*j =(x+1)(y+1)i=1xj=1xsi,j(y+1)i=1xj=1xsi,ji(x+1)i=1xj=1xsi,jj+i=1xj=1xsi,jij

对修改的(i,j,si,j)(i,j,s_{i,j})(i,j,si,j)分别维护四个值即可

剩下的就是二维主席树了,将二维坐标离散化即可

code

#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define int long long
#define maxn 200000
vector < pair < int, int > > G[maxn];
struct node { int lson, rson, o, i, j, ij;node(){}node( int x, int y, int w ) {o = w, i = x * w, j = y * w, ij = x * y * w;}void operator += ( node &New ) {o += New.o, i += New.i, j += New.j, ij += New.ij;}
}t[maxn * 30];
struct Node { int x, y, w; }opt[maxn];
int n, m, k, Q, tot, cnt, cnt_x, cnt_y;
int root[maxn], X[maxn], Y[maxn];void modify( int &now, int lst, int l, int r, int pos, node New ) {t[now = ++ cnt] = t[lst];t[now] += New;if( l == r ) return;int mid = ( l + r ) >> 1;if( pos <= mid ) modify( t[now].lson, t[lst].lson, l, mid, pos, New );else modify( t[now].rson, t[lst].rson, mid + 1, r, pos, New );
}int query_o( int now, int l, int r, int pos ) {if( ! now or pos < l ) return 0;if( r <= pos ) return t[now].o;int mid = ( l + r ) >> 1;return query_o( t[now].lson, l, mid, pos ) + query_o( t[now].rson, mid + 1, r, pos );
}int query_i( int now, int l, int r, int pos ) {if( ! now or pos < l ) return 0;if( r <= pos ) return t[now].i;int mid = ( l + r ) >> 1;return query_i( t[now].lson, l, mid, pos ) + query_i( t[now].rson, mid + 1, r, pos );
}int query_j( int now, int l, int r, int pos ) {if( ! now or pos < l ) return 0;if( r <= pos ) return t[now].j;int mid = ( l + r ) >> 1;return query_j( t[now].lson, l, mid, pos ) + query_j( t[now].rson, mid + 1, r, pos );
}int query_ij( int now, int l, int r, int pos ) {if( ! now or pos < l ) return 0;if( r <= pos ) return t[now].ij;int mid = ( l + r ) >> 1;return query_ij( t[now].lson, l, mid, pos ) + query_ij( t[now].rson, mid + 1, r, pos );
}int query( int x, int y ) {if( ! x or ! y ) return 0;int i = upper_bound( X + 1, X + cnt_x + 1, x ) - X - 1;int j = upper_bound( Y + 1, Y + cnt_y + 1, y ) - Y - 1;int s1 = ( x + 1 ) * ( y + 1 ) * query_o( root[i], 1, cnt_y, j );int s2 = ( y + 1 ) * query_i( root[i], 1, cnt_y, j );int s3 = ( x + 1 ) * query_j( root[i], 1, cnt_y, j );int s4 = query_ij( root[i], 1, cnt_y, j );return s1 - s2 - s3 + s4;
}signed main() {scanf( "%lld %lld %lld %lld", &n, &m, &k, &Q );for( int i = 1, x1, x2, y1, y2, s;i <= k;i ++ ) {scanf( "%lld %lld %lld %lld %lld", &x1, &x2, &y1, &y2, &s );opt[++ tot] = { x1, y1, s };opt[++ tot] = { x1, y2 + 1, -s };opt[++ tot] = { x2 + 1, y1, -s };opt[++ tot] = { x2 + 1, y2 + 1, s };X[++ cnt_x] = x1, X[++ cnt_x] = x2 + 1;Y[++ cnt_y] = y1, Y[++ cnt_y] = y2 + 1;}sort( X + 1, X + cnt_x + 1 );cnt_x = unique( X + 1, X + cnt_x + 1 ) - X - 1;sort( Y + 1, Y + cnt_y + 1 );cnt_y = unique( Y + 1, Y + cnt_y + 1 ) - Y - 1;for( int i = 1;i <= tot;i ++ ) {int x = lower_bound( X + 1, X + cnt_x + 1, opt[i].x ) - X;int y = lower_bound( Y + 1, Y + cnt_y + 1, opt[i].y ) - Y;G[x].push_back( make_pair( y, i ) );}for( int i = 1;i <= cnt_x;i ++ ) {root[i] = root[i - 1];for( auto E : G[i] ) {int j = E.first, id = E.second;modify( root[i], root[i], 1, cnt_y, j, node( opt[id].x, opt[id].y, opt[id].w ) );}}int ans = 0, x1, y1, x2, y2, x, y;while( Q -- ) {scanf( "%lld %lld", &x, &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 = query( x2, y2 ) - query( x2, y1 - 1 ) - query( x1 - 1, y2 ) + query( x1 - 1, y1 - 1 ) );}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317070.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS 2019 要来了,是时候了解一下 C# 8.0 新功能

近日&#xff0c;微软发布了 Visual Studio 2019 的发布日期&#xff0c;2019 年 4 月 2 日 Visual Studio 2019 将正式和大家见面&#xff0c;同时微软还将提供发布现场实时直播。除了 Visual Studio 2019 自身之外&#xff0c;VS 2019 的发布还牵动着很多 C# 开发者的心。虽然…

[蓝桥杯2020国赛]游园安排

题目&#xff1a; 题解&#xff1a; 本质就是求最长上升子序列&#xff0c;只不过这里是字符串版本的&#xff0c;我们都知道有n^2的LIS&#xff0c;但其实还有O(nlogn)版本的&#xff0c;详细看这里&#xff0c;套上就行 另外我发现这里竟然有蓝桥杯全套的编程题离谱&#xf…

洛谷P2761:软件补丁问题(状压、分层图最短路)

当遇到瓶颈时&#xff0c;想想自己是否做了可以优化的无用功。 解析 不难想到状压最短路的做法。 但是直接加边的话边数会是 O(m2n)O(m2^n)O(m2n) 级别&#xff0c;只有 909090 分&#xff0c;难以通过。 注意到&#xff0c;由于补丁很少&#xff0c;真正能达到的状态是很有限…

[2020-09-11 CQBZ/HSZX多校联测 T3] 万猪拱塔(线段树+巧妙转化)

万猪拱塔descriptionsolutioncodedescription 题目描述 小七养了很多头猪&#xff0c;它们分布在 n 行 m 列中&#xff0c;其中第 i 行第 j 列的猪圈养的是第 wi,jw_{i,j}wi,j​ 种猪。 小七有时会选择一个子矩形范围内的猪圈进行巡视&#xff0c;如果该子矩形包含 i 行 j 列 …

重新解读DDD领域驱动设计(一)

回顾十年前&#xff0c;还未踏入某校时&#xff0c;便听闻某学长一毕业就入职北京某公司&#xff0c;月薪过万。对于一个名不见经传的小学院&#xff0c;一毕业能拿到这个薪水还是非常厉害的。听闻他学生期间参与开发了一款股票软件&#xff0c;股票那时正迎来一波疯涨。时也运…

Tickets HDU - 1260

Tickets HDU - 1260 题意&#xff1a; 著名的宫崎骏动画片《千与千寻》在中传1500报重映&#xff0c;中传学子有幸成为全国第一批观众。动画学院学生会负责给大家发票&#xff0c;所有的中传同学只要把中传首映《千与千寻》的推送信息发到朋友圈并集够10个赞&#xff0c;就可…

洛谷P3357:最长k可重线段集问题(网络流)

解析 本题的建模方法有很多&#xff0c;我的做法是补集思想转化成志愿者招募然后按照那道题的做法直接做&#xff0c;看题解更多是采用的对于不冲突的线段首尾加边的做法。 在前一道最长k可重区间问题中这两种做法谈不上孰优孰劣&#xff0c;但本题中题解的做法在处理垂直线段…

程序员修神之路--高并发优雅的做限流(有福利)

点击上方蓝色字体&#xff0c;关注我们菜菜哥&#xff0c;有时间吗&#xff1f;YY妹&#xff0c;什么事&#xff1f;我最近的任务是做个小的秒杀活动&#xff0c;我怕把后端接口压垮&#xff0c;X总说这可关系到公司的存亡简单呀&#xff0c;你就做个限流呗这个没做过呀&#x…

BZOj #4771. 七彩树(主席树+dfn序+lca)

BZOj #4771. 七彩树descriptionsolutioncodedescription 给定一棵n个点的有根树&#xff0c;编号依次为1到n&#xff0c;其中1号点是根节点。每个节点都被染上了某一种颜色&#xff0c;其中第i个节点的颜色为c[i]。如果c[i]c[j]&#xff0c;那么我们认为点i和点j拥有相同的颜色…

免费馅饼 HDU - 1176

免费馅饼 HDU - 1176 题意&#xff1a; 都说天上不会掉馅饼&#xff0c;但有一天gameboy正走在回家的小径上&#xff0c;忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了&#xff0c;这馅饼别处都不掉&#xff0c;就掉落在他身旁的10米范围内。馅饼如果掉在了地上…

CF1631F:Flipping Range(dp)

解析 设 x,y∈B,x<yx,y\in B,x<yx,y∈B,x<y&#xff0c;那么也有 x−y∈Bx-y\in Bx−y∈B。 递归下去&#xff0c;根据辗转相减求 gcd⁡\gcdgcd 的方法可知&#xff0c;最终会得到 gcd⁡(x,y)\gcd(x,y)gcd(x,y)。 那么对于整个集合 BBB &#xff0c;它也就等价于所有…

微软 HoloLens 2 正式登场!让你看看什么叫真正的黑科技

北京时间 2 月 25 日凌晨消息&#xff0c;微软在 MWC19 举行新品发布会&#xff0c;正式发布了万众期待的 HoloLens 2 等产品。▲ 认识全新的 Microsoft HoloLens 2微软 HoloLens 全息眼镜是微软推出的一款头戴式混合现实装置&#xff0c;可以完全独立使用&#xff0c;无需线缆…

Piggy-Bank HDU - 1114

Piggy-Bank HDU - 1114 题意&#xff1a; 小猪储钱罐存在一个大的问题&#xff0c;即无法确定其中有多少钱。因此&#xff0c;我们可能在打碎小猪储钱罐之后&#xff0c;发现里面的钱不够。显然&#xff0c;我们希望避免这种不愉快的情况。唯一的可能是&#xff0c;称一下小猪…

BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)

#3166. [Heoi2013]AlodescriptionsolutioncodeBZOJ3166 description Welcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG &#xff0c; 如名字所见&#xff0c;到处充满了数学的谜题。 现在你拥有n颗宝石&#xff0c;每颗宝石有一个能量密度&#xff0c;记…

洛谷P6054:开门大吉

Description\text{Description}Description P6054 开门大吉 nnn 位选手去参加节目“开门大吉”。共有 mmm 套题&#xff0c;每套题包含 ppp 个题目&#xff0c;第 iii 位选手答对第 jjj 套题中第 kkk 道的概率为 fi,j,kf_{i,j,k}fi,j,k​。 若一位选手答对第 iii 题&#xff0…

Docker最全教程之Ubuntu下安装Docker(十五)

前言Ubuntu是一个以桌面应用为主的开源GNU/Linux操作系统&#xff0c;应用很广。本篇主要讲述Ubuntu下使用SSH远程登录并安装Docker&#xff0c;并且提供了Docker安装的两种方式&#xff0c;希望对大家有所帮助。拥抱Linux&#xff0c;大家可以从Ubuntu开始&#xff01;Ubuntu下…

群论学习笔记

文章目录前言群基本定义&#xff1a;子群陪集拉格朗日定理正规子群交换群商群阶置换定义置换的乘法循环置换群群作用等价类不动点Burnside引理内容证明法1 轨道-稳定子定理法2Polya 定理所谓群论&#xff0c;就是对群体行为问题的讨论。 &#xff08;逃&#xff09; 前言 个人…

Super Jumping! Jumping! Jumping! HDU - 1087

Super Jumping! Jumping! Jumping! HDU - 1087 题意&#xff1a; 给定一条长度为n的序列&#xff0c;其中一定存在一条元素和最大的严格上升子序列&#xff0c;求这条序列的元素和。 题解&#xff1a; 最长上升序列模板题 代码&#xff1a; #include<bits/stdc.h> …

Codeforces Round #727 (Div. 2) 题解

文章目录A. Contest StartB. Love SongC. Stable GroupsD. PriceFixedE. Game with CardsF. Strange Array#727-Div.2A. Contest Start 数学题&#xff0c;分类讨论 一般的&#xff0c;一段区间[l,r][l,r][l,r]会对后面固定人数造成影响&#xff0c;假设是kkk最后kkk个人&…

潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?

三喜临门一 喜今天真是个好日子&#xff0c;“流浪太阳”又回来了&#xff0c;阴雨绵绵长恨无期&#xff0c;今天苏州终于天晴&#xff0c;于是心情大好&#xff01;都说好心情会带来好运气&#xff0c;冥冥感觉要写点啥了&#xff0c;果不其然今天还有另外两喜。大早起来得…