AcWing 4888. 领导者 提供一种multiset思路
原题链接
简单
作者:
再躺平是狗
,
2025-03-13 21:36:36
·湖南
,
所有人可见
,
阅读 1
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <math.h>
#include <map>
#include <set>
#include <queue>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6 + 10, mod = 1e9 + 7;
int n, m, k;
int g[N], h[N];
int ans;
void solve()
{
cin >> n;
string s;
cin >> s;
s = " " + s;
for(int i = 1; i <= n; i++)
{
g[i] = g[i - 1];
h[i] = h[i - 1];
if(s[i] == 'G') g[i] ++;
else h[i] ++;
}
multiset<int> gs, hs;
multiset<int> acnt, bcnt; // 需要考虑重合问题
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
if(s[i] == 'G')
{
if(g[x] - g[i - 1] == g[n]) // 这个可以是答案
{
//情况2
auto it = hs.lower_bound(i);
int d = distance(it, hs.end());
auto it2 = bcnt.lower_bound(i);
int D = distance(it2, bcnt.end());
ans += d - D;
acnt.insert(x);
}
gs.insert(x);
}
else
{
if(h[x] - h[i - 1] == h[n])
{
auto it = gs.lower_bound(i);
int d = distance(it, gs.end());
auto it2 = acnt.lower_bound(i);
int D = distance(it2, acnt.end());
ans += d - D;
bcnt.insert(x);
}
hs.insert(x);
}
}
cout << ans + acnt.size() * bcnt.size() << endl; // 最后加上情况1
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int T = 1;
// cin >> T;
while (T--)
{
solve();
}
return 0;
}