玲珑OJ 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
Time Limit:3s Memory Limit:256MByte
Submissions:315Solved:71
坏坏い月是月大叔的ID,他是一个掌握者772002种魔法的物理系战士,最擅长的技能就是搞事。今天他又要开始搞事了。
给你n
个数,你需要实现一下操作:
l r v ,在[l,r]区间内找到第一个大于等于v的数,输出这个数的下标,如果找不到的话,请输出-1噢
l r v,让[l,r]区间所有数增加v
,表示有t组数据 对于每组数据: 第一行包含两个整数n(1≤n≤100000),q(1≤q≤100000),表示数的个数,以及询问的个数。 第二行包含n个整数 ai(1≤ai≤1000000000) 接下来q行,每行四个整数opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)
常见的数据结构中,我们选择使用分块来处理这道题。
我们将n个数,分成sqrt(n)块,每块里面的元素最多有sqrt(n)个元素。对于每一个块,我们维护Upd[i]表示这个块整个增加了多少,Max[i]表示这个块内的最大值是多少。
对于查询和更新,如果完全囊括了块的话,我们就只对Upd[i]和Max[i]进行更新,否则的话,我们就暴力更新这个块的元素即可。
总体复杂度O(n*根号n)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = ;
int n,m;
LL a[N],Max[N],Upd[N];
int pos[N];
int block = ;
void reset(int x)
{
int l=(x-)*block+,r=min(x*block,n);
for(int i=l; i<=r; i++)
Max[x]=max(Max[x],a[i]);
} void update(int x,int y,LL v)
{
if(pos[x]==pos[y])
{
for(int i=x; i<=y; i++)a[i]=a[i]+v;
}
else
{
for(int i=x; i<=pos[x]*block; i++)a[i]=a[i]+v;
for(int i=(pos[y]-)*block+; i<=y; i++)a[i]=a[i]+v;
}
reset(pos[x]);
reset(pos[y]);
for(int i=pos[x]+; i<pos[y]; i++)
Upd[i]+=v;
} int findidx(int x,LL v)
{
int l=(x-)*block+,r=min(x*block,n);
for(int i=l; i<=r; i++)
{
if(a[i]+Upd[x]>=v) return i;
}
}
int query(int x,int y,LL v)
{
if(pos[x]==pos[y])
{
for(int i=x; i<=y; i++)if(a[i]+Upd[pos[i]]>=v) return i;
}
else
{
///暴力找左边
for(int i=x; i<=pos[x]*block; i++)
if(a[i]+Upd[pos[i]]>=v) return i;
///分块找中间
for(int i=pos[x]+; i<pos[y]; i++)
if(Max[i]+Upd[i]>=v)
{
return findidx(i,v);
}
///暴力找右边
for(int i=(pos[y]-)*block+; i<=y; i++)
if(a[i]+Upd[pos[i]]>=v) return i;
} return -;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(Max,,sizeof(Max));
memset(Upd,,sizeof(Upd));
scanf("%d%d",&n,&m);
block = int(sqrt(n));
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i]);
pos[i]=(i-)/block+; ///记录每个元素属于哪个块
}
int k; ///块的个数
if(n%block)k=n/block+;
else k=n/block;
for(int i=; i<=k; i++)
{
reset(i);
}
while(m--)
{
int opt,l,r;
LL v;
scanf("%d%d%d%lld",&opt,&l,&r,&v);
if(opt==)
{
printf("%d\n",query(l,r,v));
}
else
{
update(l,r,v);
}
}
}
return ;
}
玲珑OJ 1129 - 喵哈哈村的战斗魔法师丶坏坏い月的更多相关文章
- 玲珑oj 1129 ST
1129 - 喵哈哈村的战斗魔法师丶坏坏い月 Time Limit:3s Memory Limit:256MByte Submissions:490Solved:107 DESCRIPTION 坏坏い ...
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...
- qsc round#2 喵哈哈村的排队(本辣鸡想七想八的,特写此博文给自己一个提醒)
该oj是qsc自己写的比赛,友情链接:http://qscoj.cn/ 喵哈哈村的排队 发布时间: 2017年2月26日 16:13 最后更新: 2017年2月26日 16:14 时间限制: ...
- 喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE
官方题解:http://www.cnblogs.com/qscqesze/p/6480284.html 哗啦啦村的刁难(1) 描述 哗啦啦村作为喵哈哈村的对头,于是他们准备给喵哈哈村一个好看. 哗啦啦 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:06 时间限制: 1000ms 内存限制: 128M 描述 传说喵哈哈村有三种神 ...
- qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)
喵哈哈村的魔法源泉(2) 发布时间: 2017年5月9日 20:59 最后更新: 2017年5月9日 21:00 时间限制: 1000ms 内存限制: 128M 描述 喵哈哈村有一个魔法源 ...
- 喵哈哈村的魔法考试 Round #20 (Div.2) 题解
题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...
- 喵哈哈村的魔法考试 Round #18 (Div.2) 题解
喵哈哈村的古怪石碑(一) 题解:暴力check一下是等比数列还是等差数列,然后输出答案即可.注意如果数据范围是1e9的话,就要快速幂了. 代码: #include <cstdio> #in ...
随机推荐
- Git使用:安装,使用及常用命令整理
对于程序猿而言,git是最常接触的工具之一,因此需要熟练快速掌握其技巧. git安装: windwos: [原创]Windows平台下Git的安装与配置 Ubuntu:git与github在ubun ...
- CF 1070J Streets and Avenues in Berhattan
DP的数组f其实开得不够大,应该开200000,但是它在cf上就是过了... 题意是把一堆字母分别分配到行和列. 分析一下,答案实际上只和n行中和m列中每种字母分配的个数有关.而且答案只和" ...
- maven项目打包时生成dependency-reduced-pom.xml
今天给maven项目打jar包,发现在pom.xml文件的同路径下,突然生出了一个dependency-reduced-pom.xml,也不知道这个文件是干什么的,看着别扭就想着删除了它. 后来知道是 ...
- 深入解析ES6 更易于继承的类语法的使用
和其它面向对象编程语言一样,ES6 正式定义了 class 类以及 extend 继承语法糖,并且支持静态.派生.抽象.迭代.单例等,而且根据 ES6 的新特性衍生出很多有趣的用法. 一.类的基本定义 ...
- BZOJ 2427 [HAOI2010]软件安装 | 这道树形背包裸题严谨地证明了我的菜
传送门 BZOJ 2427 题解 Tarjan把环缩成点,然后跑树形背包即可. 我用的树形背包是DFS序上搞的那种. 要注意dp数组初始化成-INF! 要注意dp顺推的时候也不要忘记看数组是否越界! ...
- 【转】STM32 - 程序跳转、中断、开关总中断
程序跳转注意: 1.如果跳转之前的程序A里有些中断没有关,在跳转之后程序B的中断触发,但程序B里没有定义中断响应函数,找不到地址会导致死机. 2.程序跳转前关总中断,程序跳转后开总中断(关总中断,只是 ...
- uva11235 FrequentValues (ST表)
既然他是非降的,那我们可以把这个序列每一位转化成到这位位置连续相同的个数,比如001111233444变成121234112123,然后一个区间内的最大值就是众数的位数.但有个问题,就是这个区间的左端 ...
- HTTP ERROR 400 Bad Request
一springmvc项目中我新增记录完全ok,编辑就是不行,后台方法进不去.老是报错HTTP ERROR 400 Bad Request. 经过查询,说是400表示请求中的语法错误. 我把新增记录的请 ...
- AtCoder Regular Contest 069 F - Flags
题意: 有n个点需要摆在一个数轴上,每个点需要摆在ai这个位置或者bi上,问怎么摆能使数轴上相邻两个点之间的距离的最小值最大. 二分答案后显然是个2-sat判定问题,因为边很多而连边的又是一个区间,所 ...
- [JSOI2008]魔兽地图
Description DotR里面的英雄只有一个属性——力量. 他们需要购买装备来提升自己的力量值,每件装备都可以使佩戴它的英雄的力量值提高固定的点数,所以英雄的力量值等于它购买的所有装备的力量值之 ...