Educational Codeforces Round 19 C题解
2017-04-20 22:43
204 查看
题意:给你一个字符串,用一个栈作中转,求字典序最小的字符串
思路:先用线段树维护最小值,当栈为空时,入栈,判断栈顶与后缀最小值的的大小,若栈顶小于等于后缀最小值,删除栈顶,否则继续入栈;
(当时比赛时没有用栈,写得很乱,不熟练?=。=)
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1000000
#include <stack>
using namespace std;
int tree[400004];
int arr[100001];
int k = 1;
void build(int rt,int l,int r)
{
if(l==r)
{
tree[rt] = arr[k++];
return ;
}
int mid = (l+r)>>1;
build(rt<<1,l,mid);
build((rt<<1)+1,mid+1,r);
tree[rt] = min(tree[rt<<1],tree[(rt<<1)+1]);
}
int query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return tree[rt];
}
int mid = (l+r)>>1;
int ml = INF,mr = INF;
if(ql<=mid)
ml = query(rt<<1,l,mid,ql,qr);
if(qr>mid)
mr = query((rt<<1)+1,mid+1,r,ql,qr);
return min(ml,mr);
}
int main()
{
char str[100001];
gets(str);
int g = 0;
int l = 0;
stack<int>t;
while(str[g]!='\0')
{
arr[++l] = str[g++];
}
build(1,1,l);
int ans = 1;
int i = 1;
while(ans<=l)
{
if(t.empty())
{
t.push(i);
i++;
}
if(arr[t.top()]<=query(1,1,l,i,l))
{
char c;
c = arr[t.top()];
t.pop();
printf("%c",c);
ans++;
}
else
{
t.push(i);
i++;
}
}
return 0;
}
思路:先用线段树维护最小值,当栈为空时,入栈,判断栈顶与后缀最小值的的大小,若栈顶小于等于后缀最小值,删除栈顶,否则继续入栈;
(当时比赛时没有用栈,写得很乱,不熟练?=。=)
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1000000
#include <stack>
using namespace std;
int tree[400004];
int arr[100001];
int k = 1;
void build(int rt,int l,int r)
{
if(l==r)
{
tree[rt] = arr[k++];
return ;
}
int mid = (l+r)>>1;
build(rt<<1,l,mid);
build((rt<<1)+1,mid+1,r);
tree[rt] = min(tree[rt<<1],tree[(rt<<1)+1]);
}
int query(int rt,int l,int r,int ql,int qr)
{
if(ql<=l&&r<=qr)
{
return tree[rt];
}
int mid = (l+r)>>1;
int ml = INF,mr = INF;
if(ql<=mid)
ml = query(rt<<1,l,mid,ql,qr);
if(qr>mid)
mr = query((rt<<1)+1,mid+1,r,ql,qr);
return min(ml,mr);
}
int main()
{
char str[100001];
gets(str);
int g = 0;
int l = 0;
stack<int>t;
while(str[g]!='\0')
{
arr[++l] = str[g++];
}
build(1,1,l);
int ans = 1;
int i = 1;
while(ans<=l)
{
if(t.empty())
{
t.push(i);
i++;
}
if(arr[t.top()]<=query(1,1,l,i,l))
{
char c;
c = arr[t.top()];
t.pop();
printf("%c",c);
ans++;
}
else
{
t.push(i);
i++;
}
}
return 0;
}
相关文章推荐
- Educational Codeforces Round 19
- Educational Codeforces Round 19 C
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 B. Odd sum
- Educational Codeforces Round 19 题解【ABCDE】
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 F(dp+队列优化)
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 A, B, C, E(xjb)
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19 E. Array Queries
- Educational Codeforces Round 19-E. Array Queries
- Educational Codeforces Round 19
- Educational Codeforces Round 19 A. k-Factorization
- Educational Codeforces Round 19 ABCDE题解
- Educational Codeforces Round 19 E. Array Queries