传送门。
题意
有 \(A\),\(B\) 两个人,有一个含 \(n\) 个字符的字符串。\(A\) 始终取最右侧的字符,\(B\) 可以取任意一个字符,问 \(B\) 所取的字符串能否胜过 \(A\),以及 \(B\) 能取的最大字符串。
分析
首先,我们 \(A\) 肯定会选择当前的最小的字符,我们就可以先把字符按大小排序,字符相同的按下标从大到小排序,将 \(B\) 每次取的的标记,跳过这些节点即可。
#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 1e5+5;
int n, m,pos[N];
char s[N],c[N];
bool vis[N];
struct node {
char num;
int id;
friend bool operator < (node fi,node se) {
return fi.num==se.num? fi.id>se.id :fi.num<se.num;
}
} b[N];
char ans[N];
signed main() {
cin>>n>>s+1;
for(int i=1; i<=n; ++i) b[i]=<%s[i],i%>;
sort(b+1,b+n+1);
for(int i=1; i<=n; ++i) pos[b[i].id]=i;
int R=n,flag=1,now=1;
for(int i=1; i<=n/2; ++i) {
while(R&&vis[pos[R]]) --R;
vis[pos[R]]=1;
while(vis[now]) ++now;
vis[now]=1;
ans[i]=b[now].num;
if(flag==1&&s[R]>b[now].num) flag=0;
else if(flag==1&&s[R]<b[now].num) flag=2;
}
if(flag) cout<<"NE\n";
else cout<<"DA\n";
for(int i=1;i<=n/2;++i) cout<<ans[i];
return 0;
}
标签:node,字符,int,题解,num,IGRA,fi,2011,id
From: https://www.cnblogs.com/djh0314/p/17997316