当前位置: 首页 > news >正文

宿州市建设工程质量监督站网站美篇制作app下载官网免费

宿州市建设工程质量监督站网站,美篇制作app下载官网免费,yii2 wordpress,网站备案在哪里今天讲一下倍增 目录 题目:忠诚 思路: 题目:国旗计划 思路: 查询迭代类倍增: 本质是一个一个选区间使总长度达到 M,类似凑一个数。而我们会经常用不大于它最大的二的次幂,减去之后,再重复这…

今天讲一下倍增

目录

题目:忠诚

思路:

题目:国旗计划

 思路: 


       

查询迭代类倍增:

    本质是一个一个选区间使总长度达到 M,类似凑一个数。而我们会经常用不大于它最大的二的次幂,减去之后,再重复这个过程,这样这个数的值会减小得非常快,一共只需要减 log(num) 次就可以凑出。

     

题目:忠诚

     

思路:

       

很明显是一道区间最值的问题:也就是著名的RMQ(Range Minimum/Maximum Query)区间最值查询问题(最好会背啊!)

      

首先设置f[i][j]表示从下标i走2*j长度之间的最值,然后依此创建ST表,最后RMQ查询ST表即可

    

      

#include<bits/stdc++.h>            
using namespace std;
#define maxn 100005
int n,m,l,r,a[maxn],f[maxn][22]; //f[i][j](ST表)表示从下标i走2*j长度之间的最值
int RMQ(int l,int r)//RMQ(Range Minimum/Maximum Query)区间最值查询
{int k=log2(r-l+1);return min(f[l][k],f[r-(1<<k)+1][k]);
}
void ST_create(){//创建ST表for(int i=1;i<=n;i++)	f[i][0]=a[i];//初始化int k=log2(n);for(int j=1;j<=k;j++){//(0已经初始化过了) j是二进制大小for(int i=1;i<=n-(1<<j)+1;i++){//对每个点遍历 ,n要减去j的枚举范围:n-2^j+1f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);//递推公式}}
}
int main()
{scanf("%d%d",&n,&m);//账数和问题数for(int i=1;i<=n;i++) scanf("%d",&a[i]);ST_create();for(int i=1;i<=m;i++){scanf("%d%d",&l,&r);printf("%d ",RMQ(l,r));}return 0;
}

      

     

题目:国旗计划

    

思路: 


  求f[i][0]:即每个区间后选的第一个区间。肯定不能两重循环,那时间复杂度就再次变为 O(N^2),这个时候利用题目中提到的一个性质:
“每名边防战士的奔袭区间都不会被其他边防战士的奔袭区间所包含 ”
则对于单调递增l的, r也单调递增,我们只需要找到满足j.l<=r.i 的最后一个区间即可,因此使用双指针,时间复杂度降为 O(N)。
 

#include<bits/stdc++.h>           //国旗计划(环形线段覆盖)(注意线段不会包含)
using namespace std;
#define ll long long
const int N=2e5+10;
int n,m,ans[N];
int st[20][N<<1],s[20][N<<1];//st[i][j]表示从j点为起点的进行2^i次迭代的起点的下标(自身不算)
struct segment{int l,r,id;inline friend bool operator<(const segment &a,const segment &b){return a.l<b.l; //因为线段不会包含,所以l越大自然r越大,即l单增则r单增 !!!}
}a[N<<1]; //把环表转换成两倍周长的线性表
void ST_create(){for(int i=1,j=1;i<=2*n;i++){while(j<=2*n&&a[j].l<=a[i].r)  j++;//寻找下一个起点st[0][i]=j-1; //初始化}for(int i=1;i<=19;i++) //i是二进制大小for(int j=1;j<=2*n;j++) //j是对每个点遍历st[i][j]=st[i-1][st[i-1][j]];//状态转移方程
}
void search(){for(int i=1;i<=n;i++){  int up=a[i].l+m,an=0,p=i;//对每个点拆环范围为链范围for(int j=19;j>=0;j--)if(st[j][p]&&a[st[j][p]].r<up)  //逼近过程an+=1<<j,p=st[j][p]; //从下一个点开始逼近ans[a[i].id]=an+2;//因为本来就没算本身,然后也不算入终点,所以加2}
}
int main(){cin>>n>>m; int l,r; //n是边防战士数,m是边防站数for(int i=1;i<=n;i++){scanf("%d %d",&l,&r);if(l>r) r+=m;//破环成链(对战士的覆盖范围)a[i].l=l,a[i].r=r,a[i].id=i;//每个战士的编号}sort(a+1,a+n+1); //方便初始时找下一个转移点for(int i=1;i<=n;i++) {a[i+n].l=a[i].l+m,a[i+n].r=a[i].r+m; //破环成链(对链边界上每个边防站士都再点缀一下)}ST_create(); //创建ST表search();	//对每个点进行查询for(int i=1;i<=n;i++)printf("%d ",ans[i]);return 0;
}

 可以总结一下倍增使用的场合:
1.(最值类)RMQ区间最值
2.(迭代类)同一件事完成多次。且当“一次做一件事”可以优化为“一次做多件事”。(快速幂也是这个道理)
双指针扫描的应用:
两个指针代表的内容均只增不减
 

http://www.yayakq.cn/news/371474/

相关文章:

  • 网站群 推广两题一做的网站
  • 网站制作的动画怎么做的怎么做网站关键词排名
  • 公司网站建设的作用seo优化软件购买
  • 佛山网页建站模板wordpress让邮箱登录
  • 网站备案类型及条件深圳网站建设php
  • 响应式网站的服务安卓开发步骤
  • 域名网站这么做产品包装设计公司网站
  • 温州合作网站信誉好的手机网站建设
  • 网站建设在阿里云厦门关键词排名提升
  • 建设公司网站新闻宣传管理制度astro wordpress
  • 企业做网站优点wordpress 在线课程主题
  • 网站建设代码建设法规的网站
  • 简述dw网站建设步骤双桥seo排名优化培训
  • 网站需要哪些证件wordpress百度seo优化插件
  • 郑州专业网站建设搭建公司中企动力 35 做网站
  • 从美洲开始做皇帝免费阅读网站国家重点建设裤网站
  • wordpress搭建下载站点wordpress服务器内部错误
  • 菏泽网站开发网页网站建设的ppt模板
  • 宁波网站建设佳选蓉胜网络好seo关键词怎么选
  • 中山企业手机网站建设网站建设对公司有什么意义
  • 浙江网站建设推广公司aso安卓优化
  • 金山区网站制作福州百度推广优化排名
  • 网站建设及域名顶棒 技术支持 东莞网站建设
  • 网站设计与制作成品作品wordpress 调用
  • 牡丹江seo网站推广蜘蛛屯优化排名域名备案网站购买
  • 学做网站要懂英语吗上海金融网站建设公司
  • 如何查看网站空间商给中小企业提供网站建设服务
  • 做海淘的网站做海淘的网站谁能给我一个网址
  • 互联网如何做旅游网站公司网站建设价格低
  • 烟台网站建设给力臻动传媒wordpress重建缩略图