您的位置:首页 > 其它

hduacm 3183 rmq

2015-06-04 13:55 176 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3183
问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小 查询最小用rmq

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;

const int maxn = 10000 + 5;

int N,M,d[maxn][20];
char s[maxn];

struct RMQ{
void init()
{
N = strlen(s);
for (int i = 0;i<N;i++)
d[i][0] = s[i];
for (int k = 1;(1<<k)<=N;k++)
{
for (int i = 0;i<N;i++)
d[i][k] = min(d[i][k-1],d[i+(1<<(k-1))][k-1]);

}
}
int query(int L,int R)
{
int k = 0;
while (1<<(k+1)<=R-L+1) k++;
return min(d[L][k],d[R-(1<<k)+1][k]);
}
};

RMQ rmq;

int main()
{
while (~scanf("%s%d",s,&M))
{
rmq.init();
M = N - M;
int mv = 0;
bool flag = true;
for (int i = M;i;i--)
{
int c = rmq.query(mv,N-i);
while (mv<N&&s[mv]!=c) mv++;
mv++;
if (c=='0'&&flag)
continue;
flag = false;
printf("%c",c);

}
if (flag)
printf("0");
printf("\n");
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: