CF1599A 题解
DaiRuiChen007 · · 题解
CF1599A 题解
思路分析
首先注意到
又因为我们的切换过程应该要尽可能得简单,因此我们考虑对
如上图所示,圆圈中的数表示
而当我们从
我们发现每次转移的时候只会选择当前序列的最大值或最小值,因此我们可以先从左到右扫描一遍,记录一下每次操作选择的放置方向和砝码是当前的最大值还是最小值,最后倒序依次考虑,用 multiset 从后到前依次分配权值。
从上面的分析可以看出,对于任何的一组数据,我们都给出了合法的构造,并且与
时间复杂度
代码呈现
#include<bits/stdc++.h>
#define MIN 0
#define MAX 1
using namespace std;
const int MAXN=2e5+1;
char str[MAXN],op[MAXN];
int a[MAXN],ch[MAXN],val[MAXN];
signed main() {
int n;
scanf("%d",&n);
multiset <int> s;
for(int i=1;i<=n;++i) scanf("%d",&a[i]),s.insert(a[i]);
scanf("%s",str+1);
ch[1]=MIN,op[1]=str[1];
for(int i=2;i<=n;++i) {
if(str[i-1]=='L') {
if(i%2==0) {
if(str[i]=='L') op[i]='R',ch[i]=MIN;
if(str[i]=='R') op[i]='R',ch[i]=MAX;
} else {
if(str[i]=='L') op[i]='L',ch[i]=MIN;
if(str[i]=='R') op[i]='R',ch[i]=MAX;
}
} else {
if(i%2==0) {
if(str[i]=='L') op[i]='L',ch[i]=MAX;
if(str[i]=='R') op[i]='L',ch[i]=MIN;
} else {
if(str[i]=='L') op[i]='L',ch[i]=MAX;
if(str[i]=='R') op[i]='R',ch[i]=MIN;
}
}
}
for(int i=n;i>=1;--i) {
if(ch[i]==MIN) val[i]=*s.begin(),s.erase(s.begin());
if(ch[i]==MAX) val[i]=*prev(s.end(),1),s.erase(prev(s.end(),1));
}
for(int i=1;i<=n;++i) printf("%d %c\n",val[i],op[i]);
return 0;
}