AtCoder Beginner Contest 217
C - Inverse of Permutation
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define int long long
typedef long long LL;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//const int inf = 1e18;
//const int mod = 998244353;
const int mod = 1e9 + 7;
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
const int maxn = 1e6 + 10;
const int N = 6e6 + 100;
int a[maxn];
//vector<int> v;
map<string,set<string>> ma;
set<string> se;
void solve() {
int n;
cin>>n;
for (int i = 1; i <=n; ++i) {
int x;
cin>>x;
a[x]=i;
}
for (int i = 1; i <=n; ++i) {
cout<<a[i]<<" ";
}
cout<<"\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
// cin >> _;
while (_--) {
solve();//cout<<"\n";
}
return 0;
}
D - Cutting Woods
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define int long long
typedef long long LL;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//const int inf = 1e18;
//const int mod = 998244353;
const int mod = 1e9 + 7;
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
const int maxn = 1e6 + 10;
const int N = 6e6 + 100;
int a[maxn];
//vector<int> v;
map<string, set<string>> ma;
set<int> se;
void solve() {
int l, q;
cin >> l >> q;
se.insert(0);
se.insert(l);
while (q--){
int c,x;
cin>>c>>x;
if (c==1) se.insert(x);
else{
cout<<*se.upper_bound(x)-*--se.upper_bound(x)<<"\n";
}
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
// cin >> _;
while (_--) {
solve();//cout<<"\n";
}
return 0;
}
E - Sorting Queries
模拟,利用set排序
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define int long long
typedef long long LL;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//const int inf = 1e18;
//const int mod = 998244353;
const int mod = 1e9 + 7;
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
const int maxn = 1e6 + 10;
const int N = 6e6 + 100;
int a[maxn];
//vector<int> v;
map<string, set<string>> ma;
multiset<int> se;
queue<int> qu;
void solve() {
int q;
cin>>q;
while (q--){
int op;
cin>>op;
if (op==1){
int x;
cin>>x;
qu.push(x);
} else if (op==2){
if (!se.empty()) cout<<*se.begin()<<"\n",se.erase(se.begin());
else cout<<qu.front()<<"\n",qu.pop();
} else{
while (!qu.empty()){
se.insert(qu.front());
qu.pop();
}
}
}
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
// cin >> _;
while (_--) {
solve();//cout<<"\n";
}
return 0;
}
F - Make Pair
i到j+i消除方案数,j与k匹配,dp[i][j+i-1]=dp[j到k] * dp[k到j+i-1] * 这两段区间合并数,隔板
//todo 9/7
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define int long long
typedef long long LL;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//const int inf = 1e18;
const int mod = 998244353;
//const int mod = 1e9 + 7;
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
const int maxn = 1e3 + 10;
const int N = 6e6 + 100;
//int a[maxn];
//vector<int> v;
map<string, set<string>> ma;
multiset<int> se;
queue<int> qu;
int vis[maxn][maxn];
int dp[maxn][maxn];
int C[maxn][maxn];
void init() {
for (int i = 0; i < maxn; ++i) {
for (int j = 0; j <= i; ++j) {
if (!j) C[i][j] = 1;
else C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mod;
}
}
}
void solve() {
int n, m;
cin >> n >> m;
init();
for (int i = 0; i < m; ++i) {
int a, b;
cin >> a >> b;
vis[a][b] = vis[b][a] = 1;
}
for (int i = 1; i <= n * 2 + 1; ++i) dp[i][i - 1] = 1;
for (int i = 2; i <= 2 * n; i += 2) {
for (int j = 1; j + i - 1 <= 2 * n; ++j) {
for (int k = j; k < j + i - 1; k += 2) {
if (vis[k][j+i-1])
dp[j][j+i-1] =(dp[j][j+i-1] + dp[j][k-1] * dp[k+1][j+i-2] % mod * C[i/2][(k-j)/2]) %mod;
}
}
}
cout << dp[1][2 * n];
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
// cin >> _;
while (_--) {
solve();//cout<<"\n";
}
return 0;
}
G - Groups
i个数分j组,分第i个数时,等于单独一组 + 非单独分之前的dp * 可以分的组:j - 有它一样mod的数量
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define int long long
typedef long long LL;
typedef long long ll;
const int INF = 0x3f3f3f3f;
//const int inf = 1e18;
const int mod = 998244353;
//const int mod = 1e9 + 7;
int gcd(int a, int b) { return !b ? a : gcd(b, a % b); }
const int maxn = 1e4 + 10;
const int N = 6e6 + 100;
//int a[maxn];
//vector<int> v;
map<string, set<string>> ma;
multiset<int> se;
queue<int> qu;
int dp[maxn][maxn];
void solve() {
int n,m;
cin>>n>>m;
dp[0][0]=1;
for (int i = 1; i <=n; ++i) {
int cnt[maxn]={0};
for (int j = 1; j <= n; ++j) {
dp[j][i]=dp[j-1][i-1]+dp[j-1][i]*(i-cnt[j%m])%mod;
cnt[j%m]++;
}
}
for (int i = 1; i <=n; ++i) cout<<dp[n][i]%mod<<"\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int _ = 1;
// cin >> _;
while (_--) {
solve();//cout<<"\n";
}
return 0;
}