bzoj3343 教主的魔法(权限题)

2024-01-10 02:48
文章标签 权限 魔法 教主 bzoj3343

本文主要是介绍bzoj3343 教主的魔法(权限题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bzoj传送门(权限)

Description

教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、N。
每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W。(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高)
CYZ、光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [L, R] 内有多少英雄身高大于等于C,以验证教主的魔法是否真的有效。
WD巨懒,于是他把这个回答的任务交给了你。

Input

第1行为两个整数N、Q。Q为问题数与教主的施法数总和。
第2行有N个正整数,第i个数代表第i个英雄的身高。
第3到第Q+2行每行有一个操作:
(1)若第一个字母为“M”,则紧接着有三个数字L、R、W。表示对闭区间 [L, R] 内所有英雄的身高加上W。
(2)若第一个字母为“A”,则紧接着有三个数字L、R、C。询问闭区间 [L, R] 内有多少英雄的身高大于等于C。

Output

对每个“A”询问输出一行,仅含一个整数,表示闭区间 [L, R] 内身高大于等于C的英雄数。

Sample Input

5 3

1 2 3 4 5

A 1 5 4

M 3 5 1

A 1 5 4

Sample Output

2

3

HINT

【输入输出样例说明】

原先5个英雄身高为1、2、3、4、5,此时[1, 5]间有2个英雄的身高大于等于4。教主施法后变为1、2、4、5、6,此时[1, 5]间有3个英雄的身高大于等于4。

【数据范围】

对30%的数据,N≤1000,Q≤1000。

对100%的数据,N≤1000000,Q≤3000,1≤W≤1000,1≤C≤1,000,000,000。
Source

题解

人生中的第一道分块题,感觉好无语啊。速度还是太慢了,开了O2才过

CODE:

#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+10;
struct Block
{int l,r,num,plus;int a[1010];inline void keep(){sort(a+1,a+num+1);}inline int find(int n){int L=1,R=num,mid;n-=plus;while(L<R){mid=(L+R)>>1;if(a[mid]<n) L=mid+1;else R=mid;}return L;}
}a[1010];
int s[N];
int belong[N];
int n,q,x,y,z,ans,block,num;
char c;
inline void read(int &n)
{n=0;char c=getchar();while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') n=n*10+c-48,c=getchar();
}
inline void build()
{block=sqrt(n);num=n/block;if(n%block) num++;for(int i=1;i<=num;i++)a[i].l=(i-1)*block+1,a[i].r=i*block,a[i].num=block;a[num].r=n;a[num].num=a[num].r-a[num].l+1;for(int i=1;i<=n;i++)belong[i]=(i-1)/block+1;for(int i=1;i<=num;i++){for(int j=a[i].l;j<=a[i].r;j++)a[i].a[j-a[i].l+1]=s[j];a[i].keep();}
}
inline void add(int x,int y,int z)
{if(belong[x]==belong[y]){for(int i=x;i<=y;i++)s[i]+=z;for(int i=a[belong[x]].l;i<=a[belong[x]].r;i++)a[belong[x]].a[i-a[belong[x]].l+1]=s[i];a[belong[x]].keep();return;}for(int i=x;i<=a[belong[x]].r;i++)s[i]+=z;for(int i=a[belong[x]].l;i<=a[belong[x]].r;i++)a[belong[x]].a[i-a[belong[x]].l+1]=s[i];a[belong[x]].keep();for(int i=belong[x]+1;i<belong[y];i++)a[i].plus+=z;for(int i=a[belong[y]].l;i<=y;i++)s[i]+=z;for(int i=a[belong[y]].l;i<=a[belong[y]].r;i++)a[belong[y]].a[i-a[belong[y]].l+1]=s[i];a[belong[y]].keep();
}
inline int ask(int x,int y,int z)
{int ans=0;if(belong[x]==belong[y]){for(int i=x;i<=y;i++)if(s[i]+a[belong[x]].plus>=z) ans++;return ans;}for(int i=x;i<=a[belong[x]].r;i++)if(s[i]+a[belong[x]].plus>=z) ans++;for(int i=belong[x]+1;i<belong[y];i++){int p=a[i].find(z);if(a[i].a[p]+a[i].plus>=z) ans+=a[i].num-p+1;}for(int i=a[belong[y]].l;i<=y;i++)if(s[i]+a[belong[y]].plus>=z) ans++;return ans;
}
int main()
{read(n),read(q);for(int i=1;i<=n;i++)read(s[i]);build();while(q--){c=getchar();while(c!='A'&&c!='M') c=getchar();read(x),read(y),read(z);if(c=='A') printf("%d\n",ask(x,y,z));else add(x,y,z);}return 0;
}

这篇关于bzoj3343 教主的魔法(权限题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589306

相关文章

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Mybatis拦截器如何实现数据权限过滤

《Mybatis拦截器如何实现数据权限过滤》本文介绍了MyBatis拦截器的使用,通过实现Interceptor接口对SQL进行处理,实现数据权限过滤功能,通过在本地线程变量中存储数据权限相关信息,并... 目录背景基础知识MyBATis 拦截器介绍代码实战总结背景现在的项目负责人去年年底离职,导致前期规

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Golang进程权限调度包runtime

关于 runtime 包几个方法: Gosched:让当前线程让出 cpu 以让其它线程运行,它不会挂起当前线程,因此当前线程未来会继续执行GOMAXPROCS:设置最大的可同时使用的 CPU 核数Goexit:退出当前 goroutine(但是defer语句会照常执行)NumGoroutine:返回正在执行和排队的任务总数GOOS:目标操作系统NumCPU:返回当前系统的 CPU 核数量 p

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

Android6.0以上权限申请

说明: 部分1:出自:http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会引

Ubuntu ftp搭建--配置不同用户不同权限

一、安装VSFTP sudo apt-get install vsftpd 二、添加FTP用户 sudo mkdir /etc/vsftpdsudo useradd -m -d /home/vsftpd vsftpd --用户名为vsftpd,目录和用户名可以自己更改sudo vi /etc/vsftpd/ftpuser.txt --这个到时与vsftp的配置文件对应建立一

鸿蒙开发5.0【Picker的受限权限适配方案】

Picker由系统独立进程实现,应用可以通过拉起Picker组件,用户在Picker上选择对应的资源(如图片、文档等),应用可以获取Picker返回的结果。 类型受限权限使用的picker音频ohos.permission.READ_AUDIO,ohos.permission.WRITE_AUDIOAudioViewPicker文件ohos.permission.READ_DOCUMENT,oh

在项目中,控制权限保存时,如果多次修改权限,该如何写?

在项目中,控制权限保存时,如果多次修改权限,该如何写? 错误代码: package cn.itcast.crm.service.impl;import java.util.List;import javax.annotation.Resource;import org.apache.commons.lang.xwork.StringUtils;import org.springfr

利用PL/SQL工具如何给指定用户分配权限

选中指定的表--右键--编辑--就出现右边的内容了,选择权限,分配用户某个权限就行了;