教主

教主的魔法

╄→гoц情女王★ 提交于 2019-11-27 16:44:32
问题: 教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是 N 个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1、2、……、 N 。 每个人的身高一开始都是不超过1000的正整数。教主的魔法每次可以把闭区间[ L , R ](1≤ L ≤ R ≤ N )内的英雄的身高全部加上一个整数 W 。(虽然 L = R 时并不符合区间的书写规范,但我们可以认为是单独增加第 L ( R )个英雄的身高) CYZ、光哥和ZJQ等人不信教主的邪,于是他们有时候会问WD闭区间 [ L , R ] 内有多少英雄身高大于等于 C ,以验证教主的魔法是否真的有效。 WD巨懒,于是他把这个回答的任务交给了你。 解: 分块板题 动态区间第k小数 复习一下分块 code: // #include<stdio.h> #include<bits/stdc++.h> using namespace std; #define maxnn 2000000 int n,Q; int laz[maxnn]; int a[maxnn]; int s; int k1,k2; int B[6000][6000]; int cnt[6000]; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9

P2801 教主的魔法 (分块)

有些话、适合烂在心里 提交于 2019-11-26 17:45:23
题目传送 长度为 \(n(n\le 1000000)\) 的数组, \(q(q\le 3000)\) 次操作。修改操作即将某个区间的值增加某个不大于1000的值,查询操作即查询某个区间比C大于等于的数有多少个 我们用一个数组 \(add[i]\) 来表示第 \(i\) 段增量,如果查询区间完全包含第 \(i\) 段,那么就相当于是在原数组中查找大于等于 \(C-add[i]\) 的数,怎么找?排序后二分找。而对于左右不完整的那部分,直接暴力查询就可以。 对于修改操作。整段的直接增加增量,不完整的直接修改原数组,然后重新排序即可。 假设一段长度为 \(t\) 则复杂度 \(O(C(t+{nlog(t)\over t}))\) #include <bits/stdc++.h> using namespace std; const int N = 1000010; int a[N],b[N],be[N],L[N],R[N],add[N]; char op[3]; int l,r,x; int n,m; void change(int l,int r,int x){ int p = be[l],q = be[r]; if(p == q){ for(int i=l;i<=r;i++)a[i] += x; for(int i=L[p];i<=R[p];i++)b[i] = a[i]; sort

P1136 迎接仪式

无人久伴 提交于 2019-11-26 11:11:28
题目描述 LHX教主要来X市指导OI学习工作了。为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字,但是领队突然发现,另一旁穿着“教”和“主”字文化衫的Orzer却不太和谐。 为了简单描述这个不和谐的队列,我们用“j”替代“教”,“z”替代“主”。而一个“j”与“z”组成的序列则可以描述当前的队列。为了让教主看得尽量舒服,你必须调整队列,使得“jz”子串尽量多。每次调整你可以交换任意位置上的两个人,也就是序列中任意位置上的两个字母。而因为教主马上就来了,时间仅够最多作K次调整(当然可以调整不满K次),所以这个问题交给了你。 输入格式: 第一行包含2个正整数N与K,表示了序列长度与最多交换次数。 第二行包含了一个长度为N的字符串,字符串仅由字母“j”与字母“z”组成,描述了这个序列。 输出格式: 一个非负整数,为调整最多K次后最后最多能出现多少个“jz”子串。 输入样例 5 2 zzzjj 输出样例 2 说明 【样例说明】 第1次交换位置1上的z和位置4上的j,变为jzzzj; 第2次交换位置4上的z和位置5上的j,变为jzzjz。 最后的串有2个“jz”子串。 【数据规模与约定】 对于10%的数据,有N≤10; 对于30%的数据,有K≤10; 对于40%的数据,有N≤50;