1129 - 喵哈哈村的战斗魔法师丶坏坏い月

Time Limit:3s Memory Limit:256MByte

Submissions:315Solved:71

DESCRIPTION

坏坏い月是月大叔的ID,他是一个掌握者772002种魔法的物理系战士,最擅长的技能就是搞事。今天他又要开始搞事了。

给你n

个数,你需要实现一下操作:

  1. l r v ,在[l,r]区间内找到第一个大于等于v的数,输出这个数的下标,如果找不到的话,请输出-1噢

  2. l r v,让[l,r]区间所有数增加v

INPUT
输入第一行包含一个正整数t(1≤t≤100)

,表示有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)

 
OUTPUT
对于每个询问,输出一行表示答案.
SAMPLE INPUT
1 5 3 1 2 3 4 5 1 1 2 3 2 1 2 3 1 1 2 3
SAMPLE OUTPUT
-1 1
 
博客本来准备不更新了,今天看到这个题目 - -,想起如果用树维护又是树套树啥的,麻烦死了,结果看到题解->分块! 
看了分块思想之后,感觉好巧妙啊,时间复杂度 O(m*sqrt(n)),这么难的数据结构题寥寥数十行就解决了,遂决定补题解!
 
官方题解:
H 喵哈哈村的战斗魔法师丶坏坏い月
常见的数据结构中,我们选择使用分块来处理这道题。
我们将n个数,分成sqrt(n)块,每块里面的元素最多有sqrt(n)个元素。对于每一个块,我们维护Upd[i]表示这个块整个增加了多少,Max[i]表示这个块内的最大值是多少。
对于查询和更新,如果完全囊括了块的话,我们就只对Upd[i]和Max[i]进行更新,否则的话,我们就暴力更新这个块的元素即可。
总体复杂度O(n*根号n)
 
Upd相当于一个标记,只起到记录的作用,两端暴力更新~
#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 - 喵哈哈村的战斗魔法师丶坏坏い月的更多相关文章

  1. 玲珑oj 1129 ST

    1129 - 喵哈哈村的战斗魔法师丶坏坏い月 Time Limit:3s Memory Limit:256MByte Submissions:490Solved:107 DESCRIPTION 坏坏い ...

  2. 喵哈哈村的魔法考试 Round #7 (Div.2) 题解

    喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...

  3. qsc round#2 喵哈哈村的排队(本辣鸡想七想八的,特写此博文给自己一个提醒)

    该oj是qsc自己写的比赛,友情链接:http://qscoj.cn/ 喵哈哈村的排队 发布时间: 2017年2月26日 16:13   最后更新: 2017年2月26日 16:14   时间限制: ...

  4. 喵哈哈村的魔法考试 Round #3 (Div.2) ABCDE

    官方题解:http://www.cnblogs.com/qscqesze/p/6480284.html 哗啦啦村的刁难(1) 描述 哗啦啦村作为喵哈哈村的对头,于是他们准备给喵哈哈村一个好看. 哗啦啦 ...

  5. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  6. qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)

    喵哈哈村的魔法源泉(2) 发布时间: 2017年5月9日 20:59   最后更新: 2017年5月9日 21:00   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村有一个魔法源 ...

  7. 喵哈哈村的魔法考试 Round #20 (Div.2) 题解

    题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...

  8. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...

  9. 喵哈哈村的魔法考试 Round #18 (Div.2) 题解

    喵哈哈村的古怪石碑(一) 题解:暴力check一下是等比数列还是等差数列,然后输出答案即可.注意如果数据范围是1e9的话,就要快速幂了. 代码: #include <cstdio> #in ...

随机推荐

  1. Transactional注解中常用参数说明

    @Transactional注解中常用参数说明 参 数 名 称                                      功 能 描 述readOnly                 ...

  2. ES6学习笔记(三):与迭代相关的新东东

    Symbol 概念 Symbol:一种新的原始数据类型,表示独一无二的值. 注意:Symbol函数的参数只是表示对当前Symbol值的描述,因此相同参数的Symbol函数的返回值是不相等的. // 没 ...

  3. Tour HDU - 3488(最大权值匹配)

    Tour In the kingdom of Henryy, there are N (2 <= N <= 200) cities, with M (M <= 30000) one- ...

  4. 学习3__STM32--DMA传输模式---

    DMA传输模式 记录 2018-01-26 开始小记 > mode1: Peripheral to Memory 说明: 工程实现的云盘链接 > mode2: Memory to Peri ...

  5. BZOJ3738 [Ontak2013]Kapitał 【扩展Lucas】

    题目链接 BZOJ3738 题解 复习 同上 但是为了消去因子\(10\),处理\(2^k\)的时候,乘回\(2^{k_1}\)时,应同时计算\(5^{k_2}\) 如果\(k_1 \ge k_2\) ...

  6. SQL Server 中ROW_NUMBER() OVER基本用法

    1.不能排序法 * FROM table1 WHERE id NOT IN ( SELECT TOP 开始的位置 id FROM table1 ) 2.SQL 2000 临时表法 DECLARE @S ...

  7. Angular的依赖注入(依赖反转)原理说明

    依赖注入(依赖反转)意思是由函数决定要引入什么样的依赖: let mod = angular.module('test',[]); mod.controller('test_c',function($ ...

  8. Hadoop基础-MapReduce的排序

    Hadoop基础-MapReduce的排序 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MapReduce的排序分类 1>.部分排序 部分排序是对单个分区进行排序,举个 ...

  9. System V 与 POSIX

    System V 以及POSIX 对信号量.共享内存.消息队列等进程之间共享方式提供了自己的解决方案.因此,在学习时难免存在疑惑,到底有什么区别,哪种方式更佳.经过网上搜索各种博客,做出简单的总结. ...

  10. git 查看一个分支是否被合并过

    1.查看该分支的提交历史 git log 分支名 2.git log master |grep comitid 如果包含,就证明已经合并过 3.git branch -d 分支名,如果报错,就是没合并 ...