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. 安装spring-tool-suite插件

    spring-tool-suite是一个非常好用的spring插件,由于eclipse是一个很简洁的IDE,因此许多插件,需要我们自己去手动下载.而Spring-tool-suite插件即是其中之一. ...

  2. [代码]--SQLServer数据库的一些全局变量

    select APP_NAME ( ) as w --当前会话的应用程序 select @@IDENTITY   --返回最后插入的标识值 select USER_NAME()    --返回用户数据 ...

  3. Python day5 --------递归、匿名函数、高阶函数、内置函数

    一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...

  4. 牛客网暑期ACM多校训练营(第一场)J Different Integers

    链接:https://www.nowcoder.com/acm/contest/139/J 题意: 给你[l,r]问[1,l],[r,n]中有多少个不同的数. 思路: 可以参考上一篇博客:https: ...

  5. debian9部署ownCloud

    ownCloud是一个开源的私有云存储,支持外接存储,具有良好的扩展性.ownCloud是传统的C/S架构,支持目前各大流行平台.服务端客户端实时同步,使用体验非常好. ownCloud is Wed ...

  6. 【CSS】clear清除浮动

    clear清除浮动1.作用: 规定元素的某一侧不允许存在浮动元素 2.值: 3.应用: 清除其他浮动元素对其产生的影响 <!DOCTYPE html> <html lang=&quo ...

  7. influxdb简单使用

    之前对influxdb有一个简单的了解和入门的使用,近期由于想使用influxdb做一点东西玩玩,又要捡起influxdb.本篇就针对influxdb的数据库.表的概念,增删改查操作.RESTful操 ...

  8. 将网页设置为允许 XMLHttpRequest 跨域访问

    在非IE下,使用XMLHttpRequest 不能跨域访问, 除非要访问的网页设置为允许跨域访问. 将网页设置为允许跨域访问的方法如下: Java Response.AddHeader("A ...

  9. 通过vnc访问无显卡服务器的图形环境

    最近在一台没有显卡的 Power 服务器上,安装了Fedora 22,因为没有显卡,所以不能在本机启动Xserver,于是想通过vnc的方式远程访问服务器的图形环境. 在服务器上安装好xserver和 ...

  10. Linux - trap 命令

    trap 命令用于指定在接收到信号后将要采取的动作,常见的用途是在脚本程序被中断时完成清理工作.当shell接收到sigspec指定的信号时,arg参数(命令)将会被读取,并被执行. trap 信号参 ...