【算法学习】整体二分

我们开门见山,讲讲一道sb题:

给你一个数组,查这个数组的第x大元素。

排序?可以

二分?怎么做啊?

二分出一个mid,判断这个数组中有多少个数小于等于mid,如果个数大于等于x,就递归到[l,mid]区间,否则是[mid+1,r]区间,这样递归下去就能得到结果。

怎么计算小于等于mid的个数?

for一遍原数组?其实只要存储数组中值在[l,r]中的数,然后计算就好,而对于[1,l-1],可以预先存储。

怎么计算?树状数组,范围太大就离散化。

这样很麻烦吧?排序更好吧?

但是当我给你多个询问时,你就不会这么觉得了。

回顾刚才的过程,我们做上图的类比。

把询问看成球,答案的区间就是这个矩形,每一次我们将上一层的球判断它会掉到下层的哪一块中,掉到底层就是获得了答案。

刚刚的过程就是球只有1个的情况。

球有多个时,就是整体二分!

就是对于当前的mid,对每一个询问都计算答案是大了还是小了,然后决定分配到下一层的哪边。

要注意保证时间复杂度哦!

一道例题:HDU 5412。

查询区间K小,要支持单点修改。

看代码:

 1 #include<cstdio>
 2 int n,q,a[100001],sum[300001],ans[300001],que1[300001],que2[300001],bit[300001];
 3 int I[300001],type[300001],ql[300001],qr[300001],k[300001],cnt;
 4 inline void ins(int t,int l,int r,int x){type[++cnt]=t,ql[cnt]=l,qr[cnt]=r,k[cnt]=x,I[cnt]=cnt;}
 5 inline void Ins(int i,int x){for(;i<=n;bit[i]+=x,i+=i&-i);}
 6 inline int Qur(int i){int Sum=0;for(;i;Sum+=bit[i],i-=i&-i);return Sum;}
 7 void divide(int l,int r,int low,int upp){
 8     if(l>r) return;
 9     if(low==upp) {for(int i=l;i<=r;++i) if(type[I[i]]==3) ans[I[i]]=low; return;}
10     int mid=low+upp>>1,cl=0,cr=0;
11     for(int i_=l,i;i_<=r;++i_){
12         i=I[i_];
13         if(type[i]==1) {if(k[i]<=mid) Ins(ql[i],1), que1[++cl]=i; else que2[++cr]=i;}
14         if(type[i]==2) {if(k[i]<=mid) Ins(ql[i],-1), que1[++cl]=i; else que2[++cr]=i;}
15         if(type[i]==3){
16             int tmp=Qur(qr[i])-Qur(ql[i]-1);
17             if(k[i]<=sum[i]+tmp) que1[++cl]=i;
18             else que2[++cr]=i, sum[i]+=tmp;
19         }
20     }
21     for(int i_=l,i;i_<=r;++i_){
22         i=I[i_];
23         if(type[i]==1) if(k[i]<=mid) Ins(ql[i],-1);
24         if(type[i]==2) if(k[i]<=mid) Ins(ql[i],1);
25     }
26     for(int i=1;i<=cl;++i) I[l+i-1]=que1[i];
27     for(int i=1;i<=cr;++i) I[l+cl+i-1]=que2[i];
28     divide(l,l+cl-1,low,mid); divide(l+cl,r,mid+1,upp);
29 }
30 int main(){
31     scanf("%d",&n);
32     for(int i=1;i<=n;++i) scanf("%d",a+i), ins(1,i,i,a[i]);
33     scanf("%d",&q);
34     for(int i=1,t,x,y,z;i<=q;++i){
35         scanf("%d",&t);
36         if(t==1) scanf("%d%d",&x,&y), ins(2,x,x,a[x]), ins(1,x,x,y), a[x]=y;
37         else scanf("%d%d%d",&x,&y,&z), ins(3,x,y,z);
38     }
39     divide(1,cnt,1,1000000000);
40     for(int i=1;i<=cnt;++i) if(ans[i]) printf("%d\n",ans[i]);
41     return 0;
42 }
View Code

一道例题:洛谷 P3332。

查询区间K大,要支持区间加入。

看代码:

 1 #include <cstdio>
 2 
 3 typedef long long LL;
 4 const int MN = 50005;
 5 
 6 int N, Q;
 7 
 8 int opt[MN], L[MN], R[MN]; LL V[MN];
 9 int P[MN];
10 int s1[MN], s2[MN], t1, t2;
11 
12 LL Sum[MN];
13 int Ans[MN];
14 
15 LL b1[MN], b2[MN];
16 inline void Add(LL *b, int i, LL x) { for(; i <= N; i += i & -i) b[i] += x; }
17 inline LL Qur(LL *b, int i) { LL A = 0; for(; i; i -= i & -i) A += b[i]; return A; }
18 inline void Add(int l, int r, LL x) {
19     ++r;
20     Add(b1, l,  x), Add(b2, l,  (l - 1) * x);
21     Add(b1, r, -x), Add(b2, r, -(r - 1) * x);
22 }
23 inline LL Qur(int l, int r) {
24     --l;
25     return r * Qur(b1, r) - Qur(b2, r) - l * Qur(b1, l) + Qur(b2, l);
26 }
27 
28 void Solve(int l, int r, int lb, int rb) {
29     if (lb == rb) {
30         for (int i = l; i <= r; ++i)
31             if (opt[P[i]] == 2)
32                 Ans[P[i]] = lb;
33         return ;
34     }
35     int mid = lb + rb >> 1;
36     t1 = t2 = 0;
37     for (int i = l; i <= r; ++i) {
38         if (opt[P[i]] == 1) {
39             if (V[P[i]] <= mid)
40                 s1[++t1] = P[i];
41             else {
42                 Add(L[P[i]], R[P[i]], 1);
43                 s2[++t2] = P[i];
44             }
45         }
46         else {
47             LL num = Sum[P[i]] + Qur(L[P[i]], R[P[i]]);
48             if (num >= V[P[i]]) 
49                 s2[++t2] = P[i];
50             else {
51                 Sum[P[i]] = num;
52                 s1[++t1] = P[i];
53             }
54         }
55     }
56     for (int i = l; i <= r; ++i) {
57         if (opt[P[i]] == 2) continue;
58         if (V[P[i]] > mid)
59             Add(L[P[i]], R[P[i]], -1);
60     }
61     int pos = l;
62     for (int i = 1; i <= t1; ++i)
63         P[pos++] = s1[i];
64     for (int i = 1; i <= t2; ++i)
65         P[pos++] = s2[i];
66     int M = l + t1 - 1;
67     Solve(l, M, lb, mid);
68     Solve(M + 1, r, mid + 1, rb);
69 }
70 
71 int main() {
72     scanf("%d%d", &N, &Q);
73     for (int i = 1; i <= Q; ++i) {
74         scanf("%d%d%d%lld", opt + i, L + i, R + i, V + i);
75         P[i] = i;
76     }
77     Solve(1, Q, -N, N);
78     for (int i = 1; i <= Q; ++i) {
79         if (opt[i] == 1) continue;
80         printf("%d\n", Ans[i]);
81     }
82     return 0;
83 }
View Code

 

转载于:https://www.cnblogs.com/PinkRabbit/p/8039083.html

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

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

相关文章

mysql100个优化技巧_完整篇:100+个MySQL调试和优化技巧(2)

▼MySQL模式优化51.检查和经常优化表.52. 经常重写InnoDB表优化.53. 有时&#xff0c;当添加列时删除索引&#xff0c;然后在添加回来索引&#xff0c;这样就会更快.54. 针对不同的需求&#xff0c;使用不同的存储引擎.55. 使用归档存储引擎日志表或审计表-这是更有效地写道.56…

简单的SQL注入学习

引贴&#xff1a; http://blog.163.com/lucia_gagaga/blog/static/26476801920168184648754/ 首先需要编写一个php页面&#xff0c;讲php页面放入/opt/lampp/htdocs目录下&#xff1a; 解释一下这个页面&#xff1a; 1.通过if语句判断变量是否初始化 2.if语句中通过mysql_conne…

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

intellij idea 分屏设置 与快捷键

1、找到分屏功能 File -> setting -> keymap&#xff0c;搜索&#xff08;注意大小写&#xff09;&#xff1a;   Split Vertically 水平分屏   Split Horizontally 垂直分屏 2、设置快捷键&#xff0c; 编辑快捷键的地方在搜索框同一行&#xff1a;    在标签上直…

SSH整合方案二(不带hibernate.cfg.xml)

整体结构: 1.引入相关jar包 2.编写实体类和映射文件 package cn.zqr.domain;public class Customer {private Long cust_id;private String cust_name;private Long cust_user_id;private Long cust_create_id;private String cust_source;private String cust_industry;privat…

POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

题意 : 有 n 种面额的硬币&#xff0c;给出各种面额硬币的数量和和面额数&#xff0c;求最多能搭配出几种不超过 m 的金额&#xff1f; 分析 : 这题可用多重背包来解&#xff0c;但这里不讨论这种做法。 如果之前有接触过背包DP的可以自然想到DP数组的定义 > dp[i][j] 表示…

css用hover制作下拉菜单

首先我们的需求就是 制作一个鼠标移动到某个区域就会有下拉菜单的弹出,这样会有更多的子类内容,示例代码如下: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>*{mar…

mysql 字典索引_【大白话mysql】你真的了解 mysql 索引吗?

本文来源于公众号&#xff1a; 跬步匠心什么是索引&#xff1f;当我们使用汉语字典查找某个字时&#xff0c;我们会先通过拼音目录查到那个字所在的页码&#xff0c;然后直接翻到字典的那一页&#xff0c;找到我们要查的字&#xff0c;通过拼音目录查找比我们拿起字典从头一页一…

mysql使用jtable_jtable 的简单使用

做后台管理管理系统时&#xff0c;基于ajax的数据操作和富有表现力的数据绑定插件jtable绝对是一个不错的选择&#xff0c;他接收来自服务器端的json格式的数据。而且他是一款开源的基于jquery和jquery ui的插件&#xff0c;您可以根据自己的需要修改其表现&#xff0c;如css&a…

java自定义菜单跳转页面_微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解...

微信公众号开发 自定义菜单请先读完本文再进行配置开发请先前往微信平台开发者文档阅读“网页授权获取用户基本信息”的接口说明在微信公众账号开发中&#xff0c;往往有定义一个菜单&#xff0c;然后用户点击该菜单就进入用户个人中心的功能&#xff0c;通常应用于各个公众账号…

贝叶斯理论基础理解

从贝叶斯方法谈到贝叶斯网络&#xff1a; http://blog.csdn.net/zdy0_2004/article/details/41096141 1 思考模式 比如往台球桌上扔一个球&#xff0c;这个球落会落在何处呢&#xff1f;如果是不偏不倚的把球抛出去&#xff0c;那么此球落在台球桌上的任一位置都有着相同的机…

C++如何实现DNS域名解析转

C如何实现DNS域名解析 这片文章介绍了C如何实现DNS域名解析&#xff0c;还有对相关技术的介绍&#xff0c;代码很详细,需要的朋友可以参考下一、概述 现在来搞定DNS域名解析&#xff0c;其实这是前面一篇文章C实现Ping里面的遗留问题&#xff0c;要干的活是ping的过程中画红线的…

高等代数第3版下 [丘维声 著] 2015年版_2020年成人高考 专升本 高等数学复习攻略...

成人高考的高等数学考试按照专业属性分为理工类和经管类&#xff0c;高等数学一直是成考中的比较不好拿分的科目&#xff0c;也是大家复习备考的难点。今天&#xff0c;小编给大家分享一些答题技巧和必备的公式&#xff0c;帮助大家一起来搞定高等数学&#xff0c;希望这份资料…

java虚拟机10.内存模型与线程

多任务处理在现代计算机操作系统中是一项必备的功能&#xff0c;让计算机同时去做几件事情&#xff0c;不仅是因为计算机的运算能力强大了&#xff0c;更重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大&#xff0c;大量的时间都花费在磁盘I/O&#xff0c;网…

php仿微信上传图片压缩,PHP仿微信多图片预览上传实例代码

生产图片区域&#xff0c;上传按钮#btn可替换自己想要的图片plupload上传var uploader new plupload.Uploader({//创建实例的构造方法runtimes: html5,flash,silverlight,html4, //上传插件初始化选用那种方式的优先级顺序browse_button: btn, // 上传按钮url: "ajax.php…

笔记本电脑如何保养_嘉兴专业笔记本电脑喷漆加工厂价格实惠

嘉兴专业笔记本电脑喷漆加工厂价格实惠 [xznugcbx]不宜大量储存或久存&#xff0c;做好通风设施。自喷漆如果大量泄露操作人员应迅速撤离泄露污染区人员到安全区域&#xff0c;因罐内的二甲醚气体具有轻微的毒性&#xff0c;并将污染区域进行隔离&#xff0c;罐内的气体跟空气中…

css 滤镜之AlphaImageLoader

CreateTime--2017年12月25日17:05:37 Author:Marydon ie滤镜特效之AlphaImageLoader 作用&#xff1a; 用于设置背景图片特效样式 使用条件&#xff1a; IE8及以下版本不支持属性background-size&#xff0c;可以使用AlphaImageLoader来代替 语法&#xff1a; filter : progid:…

企业是否应该实现对客户需求的快速响应_互联网企业的数据化迭代和数据化应用...

数字时代&#xff0c;品牌和消费者正经历数字化的变革&#xff0c;谁能真正实现企业数据赋能&#xff0c;谁就是残酷市场竞争下的优胜者。企业需要加快实现全数据治理工具的研发&#xff0c;用数据推动企业发展。本文作者结合案例分享了关于企业数字化的方法论与感知响应模型&a…

windows server 触屏_宜昌触屏万能蒸烤箱价格-华春新能源有限公司

首页 > 新闻列表 > 浏览文章发布时间&#xff1a;2020-10-27 08:47:06 浏览量&#xff1a; 5导读&#xff1a;华春新能源有限公司为您提供宜昌触屏万能蒸烤箱价格的相关知识与详情&#xff1a; 所述水箱与水较少时的水位达到一个比预定热气体电磁阀被打开时系统压力平衡…

3ds Max制作碗实例教程

一、 碗的建模。模型的结果如图WB—1所示&#xff1a; 图WB—1 1. 创建圆柱&#xff0c;并调节参数&#xff0c;转换到多边形&#xff0c;最终的结果图WB—2所示&#xff1a; 图WB—2 2.使用Inset&#xff08;插入&#xff09;插入一个面&#xff0c;再次执行Extrude&#xff0…