BZOJ2874 训练士兵 主席树
【啊 首先 这是道权限题,然后本人显然是没有权限的 23咳3】
最近数据结构做的越来越少。。然后 就跟上次一样 ,一做就是三四种不同写法。
等价的题面:
最近GY大神在sc2的天梯中被神族虐得很惨,表示很不爽。ryz决定帮助GY大神练习散枪兵技术。GY生产了n*m个枪兵,并站成了一个大小为n*m的方阵。ryz生产了t个电兵(高阶圣堂武士),每个电兵能对一个矩形区域造成一定的AOE伤害(也就是对该矩形区域的每个枪兵都造成相等的伤害)。但是ryz的电兵实在太多了,以至于GY无法快速计算出一个矩形区域内枪兵受到的总伤害,于是他就不知道应该优先操作哪个位置的枪兵了。虽然GY大神只要1分钟就可以秒掉这道题,但是由于他正在操作枪兵,你需要写一个程序帮他解决这个问题。
输入格式:
第一行四个正整数n,m,t,q。
接下来t行,每行描述一个电兵。每行包括5个正整数x1,x2,y1,y2,d,表示对所有符合x1<=x<=x2,y1<=y<=y2的每个枪兵造成了d点伤害。
为了让同学们写更为有趣的在线询问算法,我把询问加密了,第1个询问的密码为0,第i+1个询问的密码为第i个询问的答案(mod 2^32)。
接下来q行,每行描述一个询问。每行包括2个正整数x,y。x1,x2,y1,y2按照以下方法计算(c表示该询问的密码):
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
你需要输出所有x1<=x<=x2,y1<=y<=y2的枪兵受到的总伤害(mod 2^32)。
输出格式:
对于每一个询问,输出一行答案mod 2^32的值。
样例输入:
4 5 3 2
1 3 2 2 7
2 4 2 3 5
1 4 4 5 6
1 2
0 3
样例输出:
24
12
数据范围:
对于20%的数据,m<=10
对于40%的数据,n,m<=50000,t<=30000,q<=30000
对于60%的数据,n,m<=10^5
对于另外20%的数据,所有电兵的y2-y1<=3
对于100%的数据,n,m<=10^8,t<=40000,q<=150000,d<=100000
时间限制:
5-6S (这时间应该是按测试点给的吧。。)
空间限制:
1G (exm?!)
。
。
。
作为曾经的数据结构狂热者。。现在大概是手感褪色。。
看到题 臆想 log方 ——好、裸题。 然后码农 最后GG。
那么 上一个GG的代码: 离散 横坐标,然后就二维线段树 空间显然过不了极限数据。时间也过不了。
#include <bits/stdc++.h>
#define U unsigned
using namespace std;
U n,m,t,T,Q,op[][],A[],B[],At,Bt,al,ar,bl,br,s,w,x,ans,a1,a2,b1,b2;
struct ala{ U l,r,p,q,e;}a[];
struct bla{ U l,r,ss,sw,ws,ww;}b[];
void build(U u){
if (a[u].p==a[u].q) return;
U i=a[u].p+a[u].q>>;
a[u].l=++t; a[t].p=a[u].p; a[t].q=i; build(t);
a[u].r=++t; a[t].p=i+; a[t].q=a[u].q; build(t);
}
U finda(U x){
U l=,r=At,j;
while (l<r){
j=l+r+>>;
A[j]<=x?l=j:r=j-;
}
return l;
}
void add(U &u,U p,U q,U l,U r){
if (!u) u=++t;
b[u].sw+=w*(U)(r-l+);
b[u].ss+=s*(U)(r-l+);
if (p==l&&q==r) {
b[u].ws+=s; b[u].ww+=w; return;
}
U i=p+q>>;
if (r<=i) add(b[u].l,p,i,l,r); else
if (l>i) add(b[u].r,i+,q,l,r); else
{add(b[u].l,p,i,l,i); add(b[u].r,i+,q,i+,r);}
}
void play(U u,U l,U r){
if (a[u].p==l&&a[u].q==r){
s=x*(U)(A[r+]-A[l]); w=x;
add(a[u].e,,m,bl,br);
return;
}
s=x*(A[r+]-A[l]); w=; add(a[u].e,,m,bl,br);
U i=a[u].p+a[u].q>>;
if (r<=i) play(a[u].l,l,r); else
if (l>i) play(a[u].r,l,r); else
{play(a[u].l,l,i); play(a[u].r,i+,r);}
}
U getw(U u,U p,U q,U l,U r){
if (!u) return ;
if (p==l&&q==r) return b[u].sw;
U x=(r-l+)*b[u].ww;
U i=p+q>>;
if (r<=i) return getw(b[u].l,p,i,l,r)+x;
if (l>i) return getw(b[u].r,i+,q,l,r)+x;
return getw(b[u].l,p,i,l,i)+getw(b[u].r,i+,q,i+,r)+x;
}
U gets(U u,U p,U q,U l,U r){
if (!u) return ;
if (p==l&&q==r) return b[u].ss;
U x=(r-l+)*b[u].ws;
U i=p+q>>;
if (r<=i) return gets(b[u].l,p,i,l,r)+x;
if (l>i) return gets(b[u].r,i+,q,l,r)+x;
return gets(b[u].l,p,i,l,i)+gets(b[u].r,i+,q,i+,r)+x;
}
U qiu(U u,U l,U r){
if (a[u].p==l&&a[u].q==r) return gets(a[u].e,,m,bl,br);
U x=getw(a[u].e,,m,bl,br)*(A[r+]-A[l]);
U i=a[u].p+a[u].q>>;
if (r<=i) return x+qiu(a[u].l,l,r);
if (l>i) return x+qiu(a[u].r,l,r);
return x+qiu(a[u].l,l,i)+qiu(a[u].r,i+,r);
}
U qiuw(U u,U l,U r){
if (a[u].p==l&&a[u].q==r) return getw(a[u].e,,m,bl,br);
U x=getw(a[u].e,,m,bl,br);
U i=a[u].p+a[u].q>>;
if (r<=i) return x+qiuw(a[u].l,l,r);
if (l>i) return x+qiuw(a[u].r,l,r);
return x+qiuw(a[u].l,l,i)+qiuw(a[u].r,i+,r);
}
int main(){
scanf("%u%u%u%u",&n,&m,&T,&Q);
for (U i=;i<=T;++i){
scanf("%u%u%u%u%u",&op[i][],&op[i][],&op[i][],&op[i][],&op[i][]);
if (op[i][]>op[i][]) swap(op[i][],op[i][]);
if (op[i][]>op[i][]) swap(op[i][],op[i][]);
A[i]=op[i][]; A[i+T]=op[i][]+;
}
A[T+T+]=;
sort(A+,A+T+T+);
for (U i=;i<=T+T+;++i){
if (A[i]!=A[i-]) ++At;
A[At]=A[i];
}
a[].p=; a[].q=At; build(t=); t=;
A[At+]=n+;
for (U i=;i<=T;++i){
al=finda(op[i][]); ar=finda(op[i][]);
bl=op[i][]; br=op[i][];
x=op[i][]; play(,al,ar);
}
while (Q--){
scanf("%u%u",&a2,&br);
a1=ans%n+; a2=(ans+a2)%n+;
bl=ans%m+; br=(ans+br)%m+;
if (a1>a2) swap(a1,a2);
if (bl>br) swap(bl,br);
al=finda(a1); ar=finda(a2); ans=;
if (al==ar)
ans=qiuw(,al,al)*(a2-a1+);
else{
if (al+<ar) ans+=qiu(,al+,ar-);
ans+=qiuw(,al,al)*(A[al+]-a1);
ans+=qiuw(,ar,ar)*(a2-A[ar]+);
}
printf("%u\n",ans);
}
return ;
}
Bad Apple!!
实际 只要主席树就可以一个log了。 对第一维排序离散,另一维动态开点主席树。记录到A这个坐标的 前缀信息和当前信息。
一个重要的事故。。输入的操作。数据范围有很多问题。。具体看代码
#include <bits/stdc++.h>
#define U unsigned
#define Ul unsigned long long
using namespace std;
struct opt{ U x,p,q; Ul w; }op[];
struct bla{ U l,r; Ul a,qs,ds,qw,dw; }b[];
bool cmp(opt a,opt b){return a.x<b.x;}
U n,m,T,Q,t,e[]; Ul A,W,ans,ax,bx,ay,by;
void add(U &u,U l,U r,U p,U q){
b[++t]=b[u]; u=t;
b[u].qs+=b[u].ds*(A-b[u].a);
b[u].qw+=b[u].dw*(A-b[u].a);
b[u].a=A; b[u].ds+=W*(r-l+);
if (l==p&&r==q){ b[u].dw+=W; return; }
U i=p+q>>;
if (r<=i) add(b[u].l,l,r,p,i); else
if (l>i) add(b[u].r,l,r,i+,q); else
{add(b[u].l,l,i,p,i); add(b[u].r,i+,r,i+,q);}
}
Ul get(U u,U l,U r,U p,U q){
if (!u) return ;
if (l==p&&q==r) return b[u].qs+b[u].ds*(A-b[u].a);
Ul ans=(b[u].qw+b[u].dw*(A-b[u].a))*(r-l+);
U i=p+q>>;
if (r<=i) return get(b[u].l,l,r,p,i)+ans;
if (l>i) return get(b[u].r,l,r,i+,q)+ans;
return get(b[u].l,l,i,p,i)+get(b[u].r,i+,r,i+,q)+ans;
}
Ul qiu(U x){
U l=,r=T,j; if (x<op[].x) return ;
if (x>=op[r].x) x=op[r].x;
while (l<r){
j=l+r+>>;
op[j].x<=x?l=j:r=j-;
}
A=x+; return get(e[l],ay,by,,m);
}
int main(){
scanf("%u%u%u%u",&n,&m,&T,&Q);
for (U i=;i<=T;++i){
U a,b,c,d; Ul e;
scanf("%u%u%u%u%llu",&a,&b,&c,&d,&e);
a=min(max((U),a),n); b=min(max((U),b),n);
c=min(max((U),c),m); d=min(max((U),d),m);
if (a>b) swap(a,b); if (c>d) swap(c,d);
op[i]={a,c,d,e}; op[i+T]={b+,c,d,-e};
} T<<=;
sort(op+,op++T,cmp);
for (U i=;i<=T;++i) A=op[i].x,W=op[i].w,e[i]=e[i-],add(e[i],op[i].p,op[i].q,,m);
while (Q--){
scanf("%llu%llu",&bx,&by);
ax=ans%n+; ay=ans%m+; bx=(ans+bx)%n+; by=(ans+by)%m+;
if (ax>bx) swap(ax,bx); if (ay>by) swap(ay,by);
ans=qiu(bx)-qiu(ax-); printf("%llu\n",ans);
}
return ;
}
Good Apple!!!
BZOJ2874 训练士兵 主席树的更多相关文章
- 2019.01.22 bzoj2874: 训练士兵(主席树)
传送门 题意简述:给出一个n∗mn*mn∗m的矩阵n,m≤1e8n,m\le1e8n,m≤1e8,支持矩形加,矩形求和,强制在线. 思路:第一眼二维动态开点线段树,上网去搜有没有这种做法发现会被卡时空 ...
- 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] ...
- HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)
HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...
- Cutting Bamboos(2019年牛客多校第九场H题+二分+主席树)
题目链接 传送门 题意 有\(n\)棵竹子,然后有\(q\)次操作,每次操作给你\(l,r,x,y\),表示对\([l,r]\)区间的竹子砍\(y\)次,每次砍伐的长度和相等(自己定砍伐的高度\(le ...
- K-th Number Poj - 2104 主席树
K-th Number Poj - 2104 主席树 题意 给你n数字,然后有m次询问,询问一段区间内的第k小的数. 解题思路 这个题是限时训练做的题,我不会,看到这个题我开始是拒绝的,虽然题意清晰简 ...
- 集训队8月1日(拓扑排序+DFS+主席树入门)
上午看书总结 今天上午我看了拓扑排序,DFS+剪枝,相当于回顾了一下,写了三个比较好的例题.算法竞赛指南93~109页. 1.状态压缩+拓扑排序 https://www.cnblogs.com/246 ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
随机推荐
- HDU 1426 dancing links解决数独问题
题目大意: 这是一个最简单的数独填充题目,题目保证只能产生一种数独,所以这里的初始9宫格较为稠密,可以直接dfs也没有问题 但最近练习dancing links,这类数据结构解决数独无疑效率会高很多 ...
- bzoj3142[Hnoi2013]数列 组合
Description 小 T最近在学着买股票,他得到内部消息:F公司的股票将会疯涨.股票每天的价格已知是正整数,并且由于客观上的原因,最多只能为N.在疯涨的K天中小T观察 到:除第一天外每天的股价都 ...
- C#中对字符串的加密和解密
加密: /// <summary> /// 对字符串进行加密 /// </summary> /// <param name="proclaimText" ...
- [Vijos] 天才的记忆
背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...
- memcached 笔记之windows 7 下面 安装memcached 报错
windows 7 下面 安装memcached 报错 两种情况: 一:服务确实已经安装过 .如需要重新安装,当然是先memcached.exe -d uninstall 二:奇怪的是服务确实没有安装 ...
- DatePickerDialog
package com.pingyijinren.helloworld.activity; import android.app.DatePickerDialog; import android.su ...
- wordpress优化:Gravatar头像被墙及解决方案
网站缓存现象: 打开网站是左下角出现0.gravatar.com.1.gravatar.com或2.gravatar.com字样,网站一直处于缓存状态,迟迟未能打开.很多人都会缺乏耐心地等待一个网页的 ...
- App竞品技术分析 (3)减小安装包的体积(转)
http://blog.csdn.net/JspAndAsp/article/details/49339403 1 从几件小事说起 春节在家帮姐姐的iPhone手机安装市面上形形色色的App,忘记她是 ...
- delightful world--计蒜客(DFS)
http://nanti.jisuanke.com/t/11067 题目大意: 给你一个n和m 下面是m个字符串和k 每一字符串的长度是n 你要找一个串跟每一个串匹配 有k个字符是和这个串相 ...
- Java日志框架使用技巧收集(slf4j、jcl、jul、log4j1、log4j2、logback)
乒乓狂魔-教程: jdk-logging.log4j.logback日志介绍及原理 commons-logging与jdk-logging.log4j1.log4j2.logback的集成原理 slf ...