B. Monsters
题意:你的攻击力为k,你优先攻击血量最多的怪物,血量相同击杀编号小的,问怪物被击杀的顺序,
思路:我们可以知道最后肯定存在一个状态,所有怪物就差一次攻击就死了,这个状态取决于其血量是否可以整除k,那么我们计算这种状态,排序一下就行
#include <bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define xx first
#define yy second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e6 + 10, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int n, k;
struct node
{int x, id;
} a[N];
bool cmp(node a, node b)
{if (a.x == b.x)return a.id < b.id;return a.x > b.x;
}
int ans[N];
void solve()
{int n, k;cin >> n >> k;for (int i = 1; i <= n; i++){int xx;cin >> xx;if (xx % k != 0)a[i].x = xx % k;elsea[i].x = k;a[i].id = i;}sort(a + 1, a + 1 + n, cmp);for (int i = 1; i <= n; i++){cout << a[i].id << " ";}cout << endl;
}
signed main()
{Ysanqian;int T;// T = 1;cin >> T;while (T--)solve();return 0;
}
C. Binary String Copying
题意:给你一个01串,m个操作,每次给出左端点,右端点,将其左右端点之间的字符串排序
思路:对区间[ l , r ],如果区间已经有序等于没操作.
对于一个区间,显然前缀的0和后缀的1是没用的,所以我们只需找到第一个1的位置 l ′,最后一个0的位置 r ′,其实等价于给[l ′ , r ′]排序,拿个set维护以下这种等价类有多少种即可
思路转之知乎大佬
#include <bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e6 + 10, M = 1 << 10, inf = 0x3f3f3f3f, mod = 998244353;
int n, m;
void solve()
{string s;set<PII> res;cin >> n >> m;cin >> s;vector<int> pre(n, -1), back(n, n); // 初始化就是把1111......000000这种情况解决了,这样就是无前缀0,无后缀1,相当于(-1~n)for (int i = 0; i < n; i++) // 前缀0{if (i != 0)pre[i] = pre[i - 1];if (s[i] == '0')pre[i] = i;}for (int i = n - 1; i >= 0; i--) // 后缀1,逆序前缀就行{if (i != n - 1)back[i] = back[i + 1];if (s[i] == '1')back[i] = i;}for (int i = 1; i <= m; i++){int l, r;cin >> l >> r;l--, r--;int rr = pre[r], ll = back[l];if (ll > rr)res.insert({-1, -1});elseres.insert({ll, rr});}cout << res.size() << endl;
}
signed main()
{Ysanqian;int T;// T=1;cin >> T;while (T--)solve();
}