luogu P2801 教主的魔法
谜之分块
初学分块,找题练练手
大概分块示意图:


分块大法好!
std:

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define FOR(x) while(x--)
const int N=1000005;
struct node{int number;int x;
}a[N];//初始每个数
int len;//块长
int num;//块个数
int n,m;//如题意
int l[1005],r[1005];//块的左端点、右端点
int tag[1005];//块的懒标记
int d[N];//每一个点的分块编号
bool cmp(node x,node y){return x.x<y.x;
}
inline void build(){//初始化 len=(int)sqrt(n);//计算块长 if(n%len==0) num=n/len;//计算块的个数 else num=(n/len)+1;memset(tag,0,sizeof(tag));//清空块的懒标记l[1]=1;//先计算出第一块的边界 r[1]=1+len-1;rep(i,2,num-1){//枚举,计算每一块的边界 l[i]=r[i-1]+1;r[i]=l[i]+len-1;} //除了最后一块,其它块一定是长度为l的l[num]=r[num-1]+1;r[num]=n;//最后一块的右边界为nint u=1,ri=1;rep(i,1,n){if(u>len){u=1;ri++;}d[i]=ri;u++;}  rep(i,1,num){sort(a+l[i],a+r[i]+1,cmp);//初始先排排序 }
}
inline void update_left(int x,int L,int R,int u){//左更新 rep(i,l[x],r[x]) if(a[i].number>=L&&a[i].number<=R) a[i].x+=u;//直接暴力
}
inline void update_middle(int x,int u){//中更新 tag[x]+=u;//加上懒标记
}
inline void update_right(int x,int L,int R,int u){//右更新 rep(i,l[x],r[x]) if(a[i].number>=L&&a[i].number<=R) a[i].x+=u;//直接暴力 sort(a+L,a+1+R,cmp);//记得可能改变了优先级,要重新排序
}
inline void upt(int L,int R,int x){//更新 rep(i,1,num){//遍历 if(r[i]<L) continue;//如果这块不用更新就不动 if(l[i]>R) break; if(l[i]<=L&&r[i]>=L) update_left(i,L,r[i],x);//左边更新else if(l[i]<=R&&r[i]>=R)  update_right(i,l[i],R,x);//右边更新 else update_middle(i,x);//中间更新 }
}
inline int baoli(int x,int L,int R,int u){int ans=0;rep(i,l[x],r[x]) if(a[i].x>=u&&a[i].number>=L&&a[i].number<=R) ans++;return ans;
}
inline int solution(int L,int R,int x){//cout << L << " " << R << " " << x << " ";int lb=L,rb=R,ans=R+1;while(lb<=rb){int mid=(lb+rb)>>1;if(a[mid].x>=x){rb=mid-1;ans=mid;}else lb=mid+1;}//cout << R-ans+1 << endl;return R-ans+1;
}
inline int sol(int L,int R,int x){//查询 //rep(i,1,n) cout << a[i]+tag[d[i]] << " ";//cout << endl;int ans=0;//查询答案 rep(i,1,num){//遍历 if(r[i]<L) continue;//如果这块不用更新就不动 if(l[i]>R) break; if(l[i]<=L&&r[i]>=L) ans+=baoli(i,L,R,x-tag[i]);//左边查询else if(l[i]<=R&&r[i]>=R)  ans+=baoli(i,L,R,x-tag[i]);//右边查询 else ans+=solution(l[i],r[i],x-tag[i]);//中间查询}return ans;//返回查询答案
}
int main(){cin.sync_with_stdio(false);//cin 读入优化 cin >> n >> m;rep(i,1,n) cin >> a[i].x,a[i].number=i;//输入初始序列 build();//初始建块 FOR(m){char c;//判断的字母 cin >> c;int l,r,x;cin >> l >> r >> x;if(c=='M'){upt(l,r,x);}else{cout << sol(l,r,x) << endl;}}return 0;
} 

luogu P2801 教主的魔法相关推荐

  1. [Luogu P2801]教主的魔法

    题意就是让我们维护一个数据结构,可以实现区间修改和区间查询多少个数大于等于给定值.这个据说线段树可以写但是我并没有想到qwq,于是我使用了"优雅的暴力"--分块. 分块做法十分显然 ...

  2. BZOJ——3343: 教主的魔法 || 洛谷—— P2801 教主的魔法

    http://www.lydsy.com/JudgeOnline/problem.php?id=3343  ||  https://www.luogu.org/problem/show?pid=280 ...

  3. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; const int m ...

  4. P2801 教主的魔法

    算是分块第一题了吧,抄题解过的. 简化版的题意:给你n个数的序列,支持区间加的修改,同时支持查询区间内大于等于w的数字的多少. 分块题的基本标志就是:xjb查询,普通修改.(来自qsc大佬的一句话) ...

  5. 洛谷-P2801 教主的魔法 分块

    题目 题目链接 题意 修改:将一个区间内所有的数+C. 查询:查询一个区间内>C的数字有多少个. 题解 很经典的分快算法题目. 将数列分块以后,对块内的元素进行排序. 当我们要做修改操作的时候: ...

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

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

  7. bzoj 3343: 教主的魔法

    这个的修改直接是对于块开一个数组,记录修改的值就好了,,,(像不像标记永久化??(2333,不知道从哪里掏出来的词)) 都是很朴素的分块 1 #include<bits/stdc++.h> ...

  8. bzoj 3343 教主的魔法 分块

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

  9. [luoguP2801] 教主的魔法(二分 + 分块)

    传送门 以为对于这类问题线段树都能解决,分块比线段树菜,结果培训完才知道线段树是一种特殊的分块方法,有的分块的题线段树不能做,看来分块还是有必要学的. 对于这个题,先分块,然后另开一个数组对于每个块内 ...

最新文章

  1. 比特币挖矿——区块链技术
  2. 【拓扑排序】【堆】CH Round #57 - Story of the OI Class 查错
  3. Mavin build中隐藏的SAP UI5 JavaScript merge任务
  4. C#获取屏幕分辨率(大小)
  5. 基于Tiles框架Struts框架的UI 设计—几种组织HTML和JSP视图组件
  6. linux裁剪内核和移植,嵌入式Linux内核裁剪及移植的研究与实现
  7. 数据库某些要注意的问题(转的,侵权删除)
  8. 拓端tecdat|用RSHINY DASHBOARD可视化美国投票记录
  9. 银河麒麟操作系统添加字体
  10. android 爱加密 脱壳,简单尝试脱“爱加密”官网加固的DEX壳
  11. Qt登录界面实现以及跳转不同界面
  12. android7.1索尼,Xperia 1
  13. Gerrit代码审计系统实战-Gerrit 2.15.14版本快速搭建
  14. 程序员最爱用的8个代码编辑器,你用哪款?
  15. 3、传输介质——同轴电缆
  16. 为什么C标识符不能以数字开头
  17. Techniques and Applications for Crawling, Ingesting and Analyzing Blockchain Data 中文翻译
  18. 图解GHOST使用教程
  19. 元胞自动机对传染病模型的模拟
  20. matlab中单独存图_奇怪的Matlab画图技巧系列1–保存高清大图

热门文章

  1. 非乘a非b_给你28万 ,你买B+级车还是豪华入门车?
  2. 20220413安装旧版本的百度网盘的方法
  3. 用php表示掷骰子两次比大小,python学习之掷骰子游戏
  4. 【数字化】“网络效应”指南:13 种网络效应全解析,带你了解巨头成功的秘密
  5. 第二阶段(day07)bootstrap
  6. python羊车门问题的蒙特卡洛解法
  7. 基于springboot的生鲜门店配送管理系统(idea+springboot+html+thymeleaf)
  8. mysql 漏洞 wa_[漏洞案例]thinkcmf 2.x从sql注入到getshell实战
  9. hr面试性格测试30题_面试性格测试题60道
  10. 企业智能化管理固定资产的新思路