因为询问比较少,所以我们可以将n个数分成sqrt(n)个块,每个块用一颗bst存一下,然后对于修改l,r,我们将l,r区间中整块的直接在bst上打一个标签,对于不是整块的我们直接暴力修改,对于询问l,r,仍然是整块的直接在bst中求大于c的个数(考虑标签),然后不是整块的部分暴力扫一遍更新答案。

  我写的sbt,可能是sbt常数比较大什么的,tle了,其实对于每一个块我们可以快排保存,然后询问的时候二分就好了。然后对于不是整块的修改和询问可以直接改完之后再快排,这样常数小了很多。

  懒得改了,贴sbt的吧。

/**************************************************************
Problem: 3343
User: BLADEVIL
Language: C++
Result: Accepted
Time:9976 ms
Memory:47712 kb
****************************************************************/ #include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std ;
#define MAXN 2000100
#define MAXB 1100
#define L( t ) Left[ t ]
#define R( t ) Right[ t ]
#define K( t ) Key[ t ]
#define S( t ) Size[ t ]
#define update( t )S( t )=S(L( t ))+S(R( t ))+1
#define check( ch )( ch >='0'&& ch <='9')
void getint(int&t ){
int ch ;for( ch =getchar( );!check( ch ); ch =getchar( ));
t = ch -'';
for( ch =getchar( );check( ch ); ch =getchar( )) t *=, t += ch -'';
}
int Left[ MAXN ], Right[ MAXN ], Key[ MAXN ], Size[ MAXN ], V =;
void left(int&t ){
int k =R( t );
R( t )=L( k );update( t );
L( k )= t ;update( k );
t = k ;
}
void right(int&t ){
int k =L( t );
L( t )=R( k );update( t );
R( k )= t ;update( k );
t = k ;
}
void maintain(int&t ){
if(S(L(L( t )))>S(R( t ))){
right( t );
maintain(R( t ));maintain( t );
return;
}
if(S(R(R( t )))>S(L( t ))){
left( t );
maintain(L( t ));maintain( t );
return;
}
if(S(R(L( t )))>S(R( t ))){
left(L( t ));right( t );
maintain(L( t )),maintain(R( t ));
maintain( t );
return;
}
if(S(L(R( t )))>S(L( t ))){
right(R( t ));left( t );
maintain(L( t )),maintain(R( t ));
maintain( t );
return;
}
}
void Insert(int k ,int&t ){
if(! t ){
t =++ V ;
L( t )=R( t )=;
S( t )=,K( t )= k ;
return;
}
S( t )++;
Insert( k , k <K( t )?L( t ):R( t ));
maintain( t );
} void Delete(int k ,int&t ){
if( k ==K( t )){
if(!L( t )){
t =R( t );return;
}
if(!R( t )){
t =L( t );return;
}
right( t );Delete( k ,R( t ));
}else Delete( k , k <K( t )?L( t ):R( t ));
update( t );
maintain( t );
} int Rank(int k ,int t ){
if(! t )return ;
if( k <=K( t ))return S(R( t ))++Rank( k ,L( t ));
return Rank( k ,R( t ));
}
int a[ MAXN ], block[ MAXN ], head[ MAXB ], tail[ MAXB ], roof[ MAXB ], C[ MAXB ];
int n , m , b =;
int Query(int l ,int r ,int c ){
if( block[ l ]== block[ r ]){
int x = block[ l ];
if( head[ x ]== l && tail[ x ]== r )return Rank( c - C[ x ], roof[ x ]);
int cnt =;
for(int i = l ; i <= r ; i ++)if( a[ i ]>= c - C[ x ]) cnt ++;
return cnt ;
}
int cnt =Query( l , tail[ block[ l ]], c )+Query( head[ block[ r ]], r , c );
for(int i = block[ l ]+; i < block[ r ]; i ++){
cnt +=Rank( c - C[ i ], roof[ i ]);
}
return cnt ;
} void Change(int l ,int r ,int c ){
if( block[ l ]== block[ r ]){
int x = block[ l ];
if( l == head[ x ]&& r == tail[ x ]){
C[ x ]+= c ;
return;
}
for(int i = l ; i <= r ; i ++){
Delete( a[ i ], roof[ x ]);
a[ i ]+= c ;
Insert( a[ i ], roof[ x ]);
}
return;
}
Change( l , tail[ block[ l ]], c ),Change( head[ block[ r ]], r , c );
for(int i = block[ l ]+; i < block[ r ]; i ++){
C[ i ]+= c ;
}
} int main( ){
memset( roof ,,sizeof( roof ));
memset( C ,,sizeof( C ));
L()=R()=S()=;
getint( n ),getint( m );
for(int i =; i ++< n ;)getint( a[ i ]);
b =int(sqrt( n ));
for(int i =; i ++< b ;){
for(int j =( i -)* b ; j ++< i * b ;){
block[ j ]= i ;
Insert( a[ j ], roof[ i ]);
}
head[ i ]=( i -)* b +, tail[ i ]= i * b ;
}
if( b * b < n ){
head[ b +]= b * b +, tail[ b +]= n ;
for(int i = b * b ; i ++< n ;){
block[ i ]= b +;
Insert( a[ i ], roof[ b +]);
}
}
while( m --){
int ch , l , r , c ;
for( ch =getchar( );!( ch >='A'&& ch <='Z'); ch =getchar( ));
if( ch =='M'){
getint( l ),getint( r ),getint( c );
Change( l , r , c );
}else{
getint( l ),getint( r ),getint( c );
printf("%d\n",Query( l , r , c ));
}
}
return ;
}

bzoj 3343 分块的更多相关文章

  1. BZOJ 3343: 教主的魔法(分块+二分查找)

    BZOJ 3343: 教主的魔法(分块+二分查找) 3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved:  ...

  2. BZOJ 3343: 教主的魔法 [分块]【学习笔记】

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1172  Solved: 526[Submit][Status][Discus ...

  3. 【BZOJ 3343 】 分块

    3343: 教主的魔法 Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1. ...

  4. 分块+二分 BZOJ 3343

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 585[Submit][Status][Discus ...

  5. BZOJ 3343:教主的魔法(分块)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3343 [题目大意] 给出一个数列,有区间加法操作,询问区间大于等于c的数字个数 [题解 ...

  6. Bzoj 3343: 教主的魔法(分块+二分答案)

    3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...

  7. Bzoj 3343: 教主的魔法 分块,二分

    3343: 教主的魔法 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 821  Solved: 364[Submit][Status][Discuss ...

  8. BZOJ 3343 教主的魔法(分块)

    题意: 有一个1e6的数组,t次操作:将[l,r]内的值增加w,或者查询[l,r]内的值大于等于add的 思路: 分块,块大小为sqrt(n),每次只需要暴力头尾两块,中间的整块打标记, 对于查询查操 ...

  9. bzoj 3343 教主的魔法 分块

    修改直接对整块打标记,两边暴力. 查询需要保证每个整块有序,所以在修改时排序就好啦 #include<cstdio> #include<cstring> #include< ...

随机推荐

  1. 移动端调试和fiddler移动端抓包使用

    这里介绍一款移动端的调试工具以及抓包工具fiddler的使用.也是初次接触,算是初次接触的总结. 1,移动端调试工具.手机截图如下 代码实现 <!DOCTYPE html> <htm ...

  2. LR脚本编写时的几个小技巧

    参数化空值 如上图所示,当参数化时某个值需要为空值(非空格),直接在参数化文件中空一行/格即可,虽然Parameter List界面上没有显示空的那一行,但并不影响取值. 手工日志跟踪 lr_set_ ...

  3. ubuntu 安装xdebug

    Add XDebug to Ubuntu 14.04 Submitted by Wilbur on Tue, 06/17/2014 - 12:49pm It's pretty easy to add ...

  4. Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型和 ‘\u559c\u6b22\u4e00\u4e2a\u4eba ’ 转为utf-8的解决办法

    相信小伙伴们遇到过类似这样的问题,python2中各种头疼的转码,类似u'\xe6\x97\xa0\xe5\x90\x8d' 的编码,直接s.decode()是无法解决编码问题.尝试了无数办法,都无法 ...

  5. Xcode开发技巧之code snippets(代码片段)

    一.什么是代码片段 当在Xcode中输入dowhile并回车后,Xcode会出现下图所示的提示代码: 这就是代码片段,目的是使程序员以最快的速度输入常用的代码片段,提高编程效率.该功能是从Xcode4 ...

  6. [LOJ #2473] [九省联考2018] 秘密袭击coat

    题目链接 洛谷. LOJ,LOJ机子是真的快 Solution 我直接上暴力了...\(O(n^2k)\)洛谷要\(O2\)才能过...loj平均单点一秒... 直接枚举每个点为第\(k\)大的点,然 ...

  7. [洛谷P2921][USACO08DEC]在农场万圣节Trick or Treat on the Farm

    题目大意:给你一张有向图,每个点最多一条出边,问从每个开始,走多少步会到一个已经过的点 题解:$tarjan$缩点,然后建反图$DP$ 卡点:无 C++ Code: #include <cstd ...

  8. BZOJ1877:[SDOI2009]晨跑——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1877 https://www.luogu.org/problemnew/show/P2153 Ela ...

  9. BZOJ1412 [ZJOI2009]狼和羊的故事 【最小割】

    1412: [ZJOI2009]狼和羊的故事 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3454  Solved: 1733 [Submit][ ...

  10. HDOJ(HDU).1025 Constructing Roads In JGShining's Kingdom (DP)

    HDOJ(HDU).1025 Constructing Roads In JGShining's Kingdom (DP) 点我挑战题目 题目分析 题目大意就是给出两两配对的poor city和ric ...