hdu 3183 A Magic Lamp RMQ ST 坐标最小值

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183

题目大意:

从给定的串中挑出来m个数使得剩余的数字最小,串的序列不能改变

思路:

  • 将问题转化为求在n个数中挑选n-m个数,使之最小。假设最极端的情况,所有最大的数字都在左侧,占据了m个位置,那么我们需要挑选的最小的数字的第一位就是在m+1位上。依次类推,第二位在m+2位上,最后一位也就在原串的最后一位上。反过来,假设最大的数字都在右侧,占了m个位置。那么我们需要挑选的最小数字的最后一位就是在n-m位上,倒数第二位在n-m-1位上,最终最后一位就是在第一位上。至此,可以得到我们挑选最小数的第一位的取值范围就是[1,m+1]。类比可得,第二位取值范围[2,m+2],...。假设我们此时已经求出了第一位所在的位置x,那么第二位数字的范围就可以进一步缩小为[x+1,m+2],依次我们可以求出全部的数字。同时要注意,ST表中保存的是该段区间最小值的下标。
  • ST在线 预处理O(nlogn) 查询O(1) 运行时间:15ms
  • 这道题注意的细节有很多,写了很久才敢提交还是WA了3发。/(ㄒoㄒ)/~~要注意题中说n不会大于串的长度是不成立的,要来特判

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn = 1005;
int minindex[maxn][10],data[maxn],res[maxn];
inline void init(int len) {
for(int i=1; i<=len; ++i) minindex[i][0]=i;
for(int j=1; j<=10; ++j) {
for(int i=1; i<=len; ++i) {
if((i+(1<<j)-1)<=len) {
int t1=minindex[i][j-1],t2=minindex[i+(1<<(j-1))][j-1];
if(data[t1]<=data[t2]) minindex[i][j]=t1;
else minindex[i][j]=t2;
}
}
}
}
inline int ask(int l, int r) {
int k=31-__builtin_clz(r-l+1);
int t1=minindex[l][k],t2=minindex[r-(1<<k)+1][k];
if(data[t1]<=data[t2]) return t1;
else return t2;
}
int main() {
char s[1005];
int n,len,l,r,ip1,ip2;
while(~scanf("%s %d",s,&n)) {
memset(minindex,0,sizeof(minindex));
len=strlen(s);
for(int i=0; i<len; ++i) {
data[i+1]=s[i]-'0';
}
if(n>=len) {
printf("0\n");
continue;
}
init(len);
len=len-n;
l=1,r=n+1;
ip2=1;
for(int i=1; i<=len; ++i) {
ip1=ask(l,r);
res[ip2]=data[ip1];
++ip2;
l=ip1+1;
++r;
}
ip2--;
for(l=1; l<=ip2; ++l) {
if(res[l]) break;
}
if(l>ip2) {
printf("0\n");
continue;
}
for(int i=l; i<=ip2; ++i) printf("%d",res[i]);
printf("\n");
}
return 0;
}

最新文章

  1. python实现查看目录下重复的文件
  2. Trie / Radix Tree / Suffix Tree
  3. 父窗口的treeview在调用其他窗体的ShowDialog后闪烁问题
  4. HttpClient通过Post上传文件(转)
  5. robot.libdocpkg package
  6. mysql在高内存、IO利用率上的几个优化点 (sync+fsync) 猎豹移动技术博客
  7. Android Native/Tombstone Crash Log 详细分析(转)
  8. Angular form
  9. Using YARN with Cgroups testing in sparkml cluster
  10. mybatis拦截器分页
  11. ng指令控制一个元素的影藏的与显示几种方法的使用
  12. 拆分字符and读取properties文件
  13. wpf通过VisualTreeHelper找到控件内所有CheckBox和TextBox并做相应绑定
  14. freemarker报错之十三
  15. PageBase 公共基础类
  16. Linux命令rz
  17. vs code軟件操作
  18. Avoid Inputing Password While Pushing/Pulling Git Project
  19. SQL Server 中的一些概念
  20. offsetTop、offsetLeft、offsetWidth、offsetHeight的用法

热门文章

  1. nginx + tomcat + redis 部署项目,解决session共享问题。
  2. 操作系统--进程管理1--单个CPU情况
  3. git使用教程之git基础
  4. escape、unescape、encodeURIComponent、decodeURLComponent
  5. 对比jquery获取属性的方法props、attr、data
  6. SVN Upgrade working copy
  7. css3 滚动条出现 页面不跳动
  8. Python-数据类型-转摘
  9. mac电脑安装apache,不能启动
  10. 分布式网络文件系统--MooseFS