bzoj3343: 教主的魔法 分块 标记
修改:两边暴力重构,中间打标记。复杂度:O(n0.5)
查询:中间二分两边暴力。O(n0.5logn0.5)
总时间复杂度O(n*n0.5logn0.5)
空间复杂度是n级别的
标记不用下传因为标记不用下传也没时间下传,如果在访问时下传就造成更棘手的不整块,如果累加式下传不好记录,所以就带着就行。
细节很多......
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define MAXN 1010000
using namespace std;
typedef long long LL;
LL a[MAXN],b[][],mark[],n,pos[MAXN],lon,t;
inline LL Min(LL x,LL y)
{
return x<y?x:y;
}
int comp(const int x,const int y)
{
return x>y;
}
inline void work1()
{
LL l,r,w;
scanf("%lld%lld%lld",&l,&r,&w);
LL z=pos[l]+,y=pos[r]-;
for(LL i=z;i<=y;i++)
mark[i]+=w;
LL zzh=(pos[l]*lon);
zzh=Min(zzh,r);
for(LL i=l;i<=zzh;i++) a[i]+=w;
zzh=pos[l]*lon;
zzh=Min(zzh,n);
memset(b[pos[r]],,sizeof(b[pos[r]]));
for(LL i=zzh-lon+;i<=zzh;i++) b[pos[l]][i%lon+]=a[i];
sort(b[pos[l]]+,b[pos[l]]+lon+);
if(pos[l]!=pos[r])
{
for(LL i=(pos[r]-)*lon+;i<=r;i++) a[i]+=w;
zzh=pos[r]*lon;
zzh=Min(zzh,n);
memset(b[pos[r]],,sizeof(b[pos[r]]));
for(LL i=(pos[r]-)*lon+;i<=zzh;i++) b[pos[r]][i%lon+]=a[i];
sort(b[pos[r]]+,b[pos[r]]+lon+);
}
}
inline LL Count(LL p,LL c)
{
LL ans=,l=,r=lon;
while(l<=r)
{
LL mid=(l+r)>>;
if(b[p][mid]+mark[p]<c)
l=mid+;
else
ans+=(r-mid+),r=mid-;
}
return ans;
}
inline void work2()
{
LL l,r,c,ans=;
scanf("%lld%lld%lld",&l,&r,&c);
LL z=pos[l]+,y=pos[r]-;
for(LL i=z;i<=y;i++)
ans+=Count(i,c);
LL zzh=(pos[l]*lon);
zzh=Min(zzh,r);
for(LL i=l;i<=zzh;i++)
if(a[i]+mark[pos[i]]>=c)
ans++;
if(pos[l]!=pos[r])
{
for(LL i=(pos[r]-)*lon+;i<=r;i++)
if(a[i]+mark[pos[i]]>=c)
ans++;
}
printf("%lld\n",ans);
}
int main()
{
scanf("%lld",&n);
LL Q;
scanf("%lld",&Q);
lon=(LL)sqrt(n+0.5);
for(LL i=;i<=n;i++)
{
scanf("%lld",&a[i]);
pos[i]=(i-)/lon+;
b[pos[i]][i%lon+]=a[i];
}
t=pos[n];
for(int i=;i<=t;i++)
sort(b[i]+,b[i]+lon+);
while(Q--)
{
char s[];
scanf("%s",s);
if(s[]=='M')work1();
else work2();
}
return ;
}
bzoj3343: 教主的魔法 分块 标记的更多相关文章
- BZOJ3343: 教主的魔法 分块
2016-05-28 10:27:19 题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3343 比较显然的分块题,分块后块内排序,维护整块的附 ...
- [bzoj3343]教主的魔法——分块
Brief description 给定一个数列,您需要支持一下两种操作: 给[l,r]同加一个数 询问[l,r]中有多少数字大于或等于v Algorithm analyse 这个题一时想不到什么有效 ...
- BZOJ-3343教主的魔法+分块(大块排序二分)
传送门:https://www.luogu.org/problemnew/show/P2801 参考:http://hzwer.com/2784.html 感觉思路无比清晰:) ps:我在洛谷A的, ...
- [BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法 试题描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.… ...
- BZOJ 3343: 教主的魔法(分块+二分查找)
BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1172 Solved: ...
- Luogu 2801 教主的魔法 | 分块模板题
Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include < ...
- 【bzoj3343】教主的魔法 分块
[bzoj3343]教主的魔法 2014年4月26日8092 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了 ...
- 【BZOJ-3343】教主的魔法 分块
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 950 Solved: 414[Submit][Status][Discuss ...
- 【BZOJ3343】教主的魔法 分块+二分
Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的 ...
随机推荐
- ruby 数据类型Symbol
一.符号创建 符号是Symbol类的实例,使用冒号加一个标识符即可创建符号 :a :"This is a symno" 二.符号字符串相互转换 p :symbol.to_s #=& ...
- 解决 Python2 和 Python3 的共存问题
首先安装两种版本的Python 进入系统属性更改环境变量 将两个版本的安装路径找出. 添加至PATH中,变量之间用分号隔开. D:\Python36\Scripts\;D:\Python36\;D:\ ...
- OVERLAY(文字の上書き)
OVERLAY 命令により.文字列が別の文字列によって上書きされます. OVERLAY c1 WITH c2 [ONLY str]. この命令により.項目 c1 のすべての位置のうち.str の中に出 ...
- python2.7练习小例子(二十二)
22):题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和. 程序分析:请抓住分子与分母的变化规律. #!/usr/bin/pyt ...
- HBase 增删改查Java API
1. 创建NameSpaceAndTable package com.HbaseTest.hdfs; import java.io.IOException; import org.apache.had ...
- dubbo-admin管理控制台安装和使用
现在链接都变成了https://github.com/apache/incubator-dubbo/,找不到dubbo-admin这个目录. 那就直接去下载他们打包好的源代码:https://gith ...
- 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...
- Mac系统下安装Homebrew后无法使用brew命令,-bash: brew: command not found
使用如下命令: sudo vim .bash_profile 然后输入以下代码: export PATH=/usr/local/bin:$PATH 再使用以下命令使配置生效: source .bash ...
- MySQL server has gone away 错误处理
解决方案1: 这个是mysql自身的一个机制: mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决办法有两个: 1.修改mysql 配置 增 ...
- Lambda方式左连接有Linq方式左连接
网上查到的直接使用Join+DefaultIfEmpty的方式是错误的,实际生成SQL是两表先内联接,然后再LEFT JOIN.经过查证,参考资料,最终得到如下两种方式的左连接写法: public v ...