【洛谷2801】教主的魔法(分块经典入门题)

点此看题面

大致题意: 给你一个序列,要你支持两种操作:第一种是区间加法,第二种是查询区间内大于等于\(x\)的数的个数。

考虑分块

这应该是一道比较经典的分块入门题吧。

首先,我们将序列分块。

对于修改操作,暴力修改两边的不完整的块,中间的块直接打标记记录即可。

对于询问操作,暴力求出两边的不完整的块的答案,中间的块我们可以在块内二分,最后将全部答案加起来即可。

代码

#include<bits/stdc++.h>
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<0?-(x):(x))
#define LL long long
#define ull unsigned long long
#define swap(x,y) (x^=y,y^=x,x^=y)
#define Fsize 100000
#define tc() (FinNow==FinEnd&&(FinEnd=(FinNow=Fin)+fread(Fin,1,Fsize,stdin),FinNow==FinEnd)?EOF:*FinNow++)
#define pc(ch) (FoutSize<Fsize?Fout[FoutSize++]=ch:(fwrite(Fout,1,Fsize,stdout),Fout[(FoutSize=0)++]=ch))
#define N 1000000
#define SIZE 1000
int FoutSize=0,OutputTop=0;char Fin[Fsize],*FinNow=Fin,*FinEnd=Fin,Fout[Fsize],OutputStack[Fsize];
using namespace std;
int n,Q,blo,MaxPos,a[N+5],pos[N+5],Add[N+5];
vector<int> v[SIZE+5];//用vector存下每个块中元素排序后的结果
inline void read(int &x)
{x=0;static char ch;while(!isdigit(ch=tc()));while(x=(x<<3)+(x<<1)+ch-48,isdigit(ch=tc()));
}
inline void read_alpha(char &x)
{while(!isalpha(x=tc()));
} 
inline void write(int x)
{if(!x) return (void)pc('0');while(x) OutputStack[++OutputTop]=x%10+48,x/=10;while(OutputTop) pc(OutputStack[OutputTop]),--OutputTop;
}
inline void F5(int x)//更新一个块的vector
{register int i,lim=min(blo*x,n);for(v[x].clear(),i=blo*(x-1)+1;i<=lim;++i) v[x].push_back(a[i]);//将元素加入vecter中sort(v[x].begin(),v[x].end());//排序
}
inline void Update(int l,int r,int x)//区间加法
{register int i,lim;for(i=l,lim=min(blo*pos[l],r);i<=lim;++i) a[i]+=x;F5(pos[l]);//暴力修改左边不完整的块,并更新这个块的vectorif(pos[l]^pos[r]) {for(i=r,lim=blo*(pos[r]-1)+1;i>=lim;--i) a[i]+=x;F5(pos[r]);}//如果左边与右边不在同一个块,就暴力修改右边不完整的块,并更新这个块的vector for(i=pos[l]+1;i<pos[r];++i) Add[i]+=x;//中间的完整的块直接打标记即可
}
inline int find(int s,int x)//二分
{register int l=0,r=v[s].size()-1,mid,res=r+1,lim=r+1;while(l<=r){if(v[s][mid=l+r>>1]>=x) r=(res=mid)-1;else l=mid+1;}return lim-res;//返回有编号为s的块内有多少个元素大于等于x
}
inline int Query(int l,int r,int x)//查询区间内大于等于x的数的个数
{register int i,lim,res=0;for(i=l,lim=min(blo*pos[l],r);i<=lim;++i) if(a[i]+Add[pos[l]]>=x) ++res;//暴力求解左边不完整的块if(pos[l]^pos[r]) for(i=r,lim=blo*(pos[r]-1)+1;i>=lim;--i) if(a[i]+Add[pos[r]]>=x) ++res;//如果左边与右边不在同一个块,就暴力求解右边不完整的块for(i=pos[l]+1;i<pos[r];++i) res+=find(i,x-Add[i]);//对于中间完整的块,二分求出答案,然后将答案加在一起return res;//返回答案
}
int main()
{register int i,j,l,r,x;register char op;for(read(n),read(Q),MaxPos=(n-1)/(blo=sqrt(n))+1,i=1;i<=n;++i) read(a[i]),pos[i]=(i-1)/blo+1;for(i=1;i<=MaxPos;++i) F5(i);//先预处理出每个块的vectorwhile(Q--){read_alpha(op),read(l),read(r),read(x);if(op^'A') Update(l,r,x);else write(Query(l,r,x)),pc('\n');}return fwrite(Fout,1,FoutSize,stdout),0;
}

转载于:https://www.cnblogs.com/chenxiaoran666/p/Luogu2801.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cut和tr命令的联合使用

cut的-d选项只能是单个字符&#xff0c;而对于多个连续相同字符分隔的字段&#xff0c;单凭cut命令是达不到想要的效果的&#xff0c;特别是多个连续空格分隔时。 但借助tr -s的压缩重复字符功能&#xff0c;可以将多个连续空格压缩为一个空格&#xff0c;然后再交给cut处理就容…

使用 Web Tracing Framework 分析富 JS 应用的性能

来自谷歌的 Web Tracing Framework 包含一组工具和脚本&#xff0c;用于 JavaScript 相关代码的性能分析。它是重 JavaScript 应用程序的理想选择&#xff0c;而 JavaScript 仅用于简单的交互的网页可能没有必要。有一个手动嵌入选项和一个 Chrome 扩展&#xff0c;用于获取内部…

php yii2 获取表里最大的id_Yii2中自带分页类实现分页

1.首先写控制器层先引用pagination类use yiidataPagination;写自己的方法:function actionFenye(){$data Field::find(); //Field为model层,在控制器刚开始use了field这个model,这儿可以直接写Field,开头大小写都可以,为了规范,我写的是大写$pages new Pagination([totalCou…

android 操作系统升级,关于手机操作系统升级的问题

最近身边的好几个朋友问我操作系统方面问题&#xff0c;操作系统就是负责对计算机硬件进行直接控制以及管理的系统软件&#xff0c;它包含的功能也是多方面的&#xff0c;一般包括处理器管理&#xff0c;储存&#xff0c;文件&#xff0c;设备以及作业管理等等。把操作系统的内…

FindBugs Maven插件教程

FindBugs是一种静态代码分析工具&#xff0c;可识别从Java代码中发现的问题。 我们可以使用FindBugs Maven插件将FindBugs集成到我们的构建过程中。 这篇博客文章确定了四个典型的用例&#xff0c;并描述了我们如何配置FindBugs Maven插件以支持每个用例。 描述的用例是&…

Mac包管理神器Homebrew

概念 简称brew&#xff0c;是Mac OSX上的软件包管理工具&#xff0c;能在Mac中方便的安装软件或者卸载软件&#xff0c;相当于Red hat的yum、Ubuntu的apt-get。 安装命令 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 常…

网站大流量高并发访问的处理解决办法

————————目录————————- 1、硬件升级2、服务器集群、负载均衡、分布式3、CDN4、页面静态化5、缓存技术(Memcache、Redis)以上为架构层面以下为网站本地项目层面6、数据库优化 1、数据库分表技术 2、数据库读写分离 3、表建立相应的索引7、禁止盗链8、控制大文…

【完成整理】45套很酷的长影影 LOGO 设计

长阴影其实就是扩展了对象的投影&#xff0c;感觉是一种光线照射下的影子&#xff0c;通常采用角度为 45 度的投影&#xff0c;给对象添加了一份立体感。长阴影&#xff08;Long Shadow&#xff09;概念来自于最新非常流行的扁平化设计&#xff08;Flat Design&#xff09;。扁…

简述select语句的完整语法_SQL里的各种语句的完整语法

SQL分类&#xff1a;DDL—数据定义语言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE)  DML—数据操纵语言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSERT)DCL—数据控制语言(GRANT&#xff0c;REVOKE&#xff0c;COMMIT&#xff0c;ROLLBA…

android 坐标点计算器,Android实现简易计算器

开之前我还是想问问老师&#xff0c;为什么一定要星期天前交作业呢&#xff1f;由于条件限制&#xff0c;作品是赶出来的不是细细琢磨出来的。所以在这版apk中功能较为简易&#xff0c;有待后期再不断更新与优化总体效果图如下布局activity_main.xml部分代码功能代码MainActivi…

使用反射进行测试

根据我以前的帖子&#xff0c;我正在撰写有关“单一责任原则”的演讲。 我花了大部分时间。 同时&#xff0c;我想分享一个示例代码&#xff0c;说明如何在类中测试内部字段。 我这样做是为了进行特殊的测试&#xff0c;这更多的是集成测试。 在依赖类的标准单元测试中&#x…

1的恢复出厂设置在哪里_罗斯蒙特变送器怎么恢复出厂设置?

罗斯蒙特变送器怎么恢复出厂设置?特殊情况下&#xff0c;罗斯蒙特变送器需要恢复出厂设置。罗斯蒙特变送器进行出厂设置的方法非常简单&#xff0c;只需要用手操器或AMS设备管理器就能操作。罗斯蒙特手操器里有一个恢复出厂调整值–传感器量程调整命令&#xff0c;使用此命令就…

【技术累积】【点】【java】【25】Orderd

基础概念 Orderd是spring core中定义的一个接口&#xff0c;使用它以及相关的Comparator和Order注解&#xff0c;可以实现对元素的排序。 Order 直接先说下Order注解吧&#xff0c;使用场景较多。 Retention(RetentionPolicy.RUNTIME) Target({ElementType.TYPE, ElementType.M…

android 展示星期方式,Android显示从一周到另一周的日期(星期四至星期四)

最后我得到了工作一个解决方案&#xff0c;解决我的问题&#xff1a;在OnCreate中&#xff1a;TextView tv_chart_menuvotes (TextView) findViewById(R.id.tv_chart_menuvotes);String csPrevThur getPreviousThursday();String csNextThur getNextThursday();tv_chart_men…

Java 8 – Date API的新增功能

随着Java 8最终版本的发布&#xff0c;令我兴奋的新功能之一就是新的Date API&#xff0c;这是JSR 310的工作成果。 尽管Lambda表达式无疑是Java 8的一大亮点&#xff0c;但是拥有更好的日期处理方式无疑是受欢迎的。 这是一篇简短的文章&#xff08;第2部分或第3部分的第1部分…

ps抠图怎么放大图片_PS抠图时选区图片放大后,怎么移动图片抠图选区?

我们在Photoshop中使用套索、钢笔等工具进行抠图选区的时候&#xff0c;经常需要将图片放大&#xff0c;保证抠图选区的精确性&#xff0c;但是同时因为图片放大后超出了显示区域&#xff0c;我们在移动抠图选区工具进行抠图选区的时候&#xff0c;总是出现各种错误&#xff0c…

perl 用网易发邮件报错 554 DT:SPM 163 smtp14

查看相关链接&#xff0c;貌似被当成垃圾邮件了&#xff0c;发不出去 554 DT:SPM 163 smtp14,EsCowACHUegmKpdc3giRMQ--.29617S2 1553410599,please see http://mail.163.com/help/help_spam_16.htm?ip183.30.222.245&hostidsmtp14&time1553410599 脚本改成CC给自己&a…

Guzzle – 构建 RESTful Web 服务的 PHP HTTP 框架

Guzzle 减轻了发送 HTTP 请求和创建 Web 服务客户端的痛苦。它包含建立一个强大的网络服务客户端的工具&#xff0c;包括&#xff1a;服务描述定义的输入和输出的 API&#xff0c;资源迭代器遍历分页资源&#xff0c;尽可能有效地发送大量的请求。 您可能感兴趣的相关文章特别推…

合成和桥接方法

如果您曾经玩过反射并执行了getDeclaredMethods()您可能会感到惊讶。 您可能会获得源代码中不存在的方法。 或者&#xff0c;也许您看了一些方法的修饰符&#xff0c;发现其中一些特殊方法是易变的。 顺便说一句&#xff1a;对于Java采访来说&#xff0c;这是一个令人讨厌的问题…

小米手机升级Android6,小米3能升级miui 6?小米3升级miui v6教程

小米3升级miui v6教程来咯~小编还带来了miui v6下载&#xff0c;MIUI V6系统有了很多的变化&#xff0c;小米3是可以升级miui6系统的哦~如果你不知道步骤的话&#xff0c;就请参考下文吧。第一步、下载工具包和线刷完整包&#xff0c;下载完成后解压(请检查线刷包文件后缀名是否…