Codeforces Round #771 (Div. 2) A~E
Posted kaka0010
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #771 (Div. 2) A~E相关的知识,希望对你有一定的参考价值。
目录
A. Reverse
给一个 [ 1.. n ] [1..n] [1..n]的序列,可以翻转一次,求字典序最小
只需要找到第一个与下标不同的数字,然后把这个数翻转到这个位置即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 4e5 + 10;
const int mod = 998244353;
#define fi first
#define se second
#define lowbit(x) x & (-x)
int a[N];
int main()
ios::sync_with_stdio(false);
cin.tie(nullptr);
int _; cin >> _; while (_--)
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int flag = 0;
int c = 0;
for (int i = 1; i <= n; i++)
if (i != a[i])
c = i;
flag = 1;
break;
if (!flag)
for (int i = 1; i <= n; i++) cout << a[i] << ' ';
cout << endl;
continue;
int d = 0;
for (int i = 1; i <= n; i++)
if (a[i] == c)
d = i;
break;
reverse(a+c, a+d+1);
for (int i = 1; i <= n; i++) cout << a[i] << ' ';
cout << endl;
return 0;
B. Odd Swap Sort
因为只能交换相邻数组,因此需要保证偶数和奇数分别有序
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 4e5 + 10;
const int mod = 998244353;
#define fi first
#define se second
#define lowbit(x) x & (-x)
int a[N], fa[N];
int main()
ios::sync_with_stdio(false);
cin.tie(nullptr);
int _; cin >> _; while (_--)
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int flag = 0;
vector<int> c, b;
for (int i = 1; i <= n; i++)
if (a[i] % 2 == 1) c.push_back(a[i]);
for (int i = 1; i <= n; i++)
if (a[i] % 2 == 0) b.push_back(a[i]);
flag = 0;
for (int i = 1; i < b.size(); i++)
if (b[i] < b[i-1]) flag = 1;
for (int i = 1; i < c.size(); i++)
if (c[i] < c[i-1]) flag = 1;
if (flag) cout << "No" << endl;
else cout << "Yes" << endl;
return 0;
C. Inversion Graph
题意中比较重要的信息,一个是[1…n]的序列,还有一个是逆序对建边
举个例子,3 1 5 2 4
第一个数是3,因此前3个数肯定可以组成一个连通块,到第三个数被更新成5,因此前5个数肯定是一个连通块。。。
还是比较好理解的
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 4e5 + 10;
const int mod = 998244353;
#define fi first
#define se second
#define lowbit(x) x & (-x)
int a[N];
int main()
ios::sync_with_stdio(false);
cin.tie(nullptr);
int _; cin >> _; while (_--)
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
int mx = a[1], ans = 1;
for (int i = 2; i <= n; i++)
if (i > mx)
ans++;
mx = max(mx, a[i]);
cout << ans << endl;
return 0;
D. Big Brush
比较暴力的一题,考虑bfs,倒着考虑,把可以涂色的都入队,入队后将当前颜色置位0,为万能色,然后一直暴力找周围的8个点
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 4e5 + 10;
const int mod = 998244353;
#define fi first
#define se second
#define lowbit(x) x & (-x)
#define endl '\\n'
int a[1005][1005], vis[1005][1005];
struct node
int x, y, k;
;
int n, m;
int check(int x, int y)
int col = 0;
int flag = 0;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
int dx = x+i;
int dy = y+j;
if (dx > n || dy > m) return 0;
if (a[dx][dy] != col && a[dx][dy] && col) flag = 1;
if (a[dx][dy]) col = a[dx][dy];
if (flag) return 0;
else
for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) a[x+i][y+j]=0;
return col;
int main()
ios::sync_with_stdio(false);
cin.tie(nullptr), cout.tie(nullptr);
cin >> n >> m;
queue<node> q;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
int cur = check(i, j);
if (cur) q.push(i,j,cur);
vector<node> ans;
while (q.size())
node now = q.front();
q.pop();
if (vis[now.x][now.y]) continue;
vis[now.x][now.y] = 1;
// cout << now.x << ' ' << now.y << endl;
ans.push_back(now);
for (int l = -1; l <= 1; l++)
for (int r = -1; r <= 1; r++)
int dx = now.x + l;
int dy = now.y + r;
if (dx + 1 <= n && dx >= 1 && dy + 1 <= m && dy >= 1 && !vis[dx][dy])
int cur = check(dx, dy);
if (cur) q.push(dx,dy,cur);
int flag = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
if (a[i][j]) flag = 1;
if (flag)
cout << "-1" << endl;
return 0;
cout << ans.size() << endl;
reverse(ans.begin(), ans.end());
for (auto it : ans)
cout << it.x << ' ' << it.y << ' ' << it.k << endl;
return 0;
E. Colorful Operations
三个操作:1.区间覆盖颜色 2.对某种颜色加权值 3.输出单点权值
对于某种颜色的权值累加和可以开个数组单独处理,然后再修改颜色的时候对权值进行结算,先加上原先颜色的权值,再减去当前颜色的权值
至于怎么处理区间内的颜色,可以用珂朵莉树(其实就是用set模拟暴力)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N = 1e6 + 10;
const int mod = 1e9+7;
#define fi first
#define se second
#define lowbit(x) x & (-x)
#define endl '\\n'
#define auto set<node> ::iterator
template <typename T>
struct BIT
const int n;
vector<T> a;
BIT(int n) :n(n), a(n)
void add(int x, T v)
for (int i = x; i <= n; i += i&-i)
a[i] += v;
void rangeAdd(int x, int y, T v)
add(x, v);
add(y+1, -v);
T sum(int x)
T ans = 0;
for (int i = x; i > 0; i -= i & -i)
ans += a[i];
return ans;
T rangeSum(int l, int r)
return sum(r) - sum(l-1);
;
struct node
int l, r;
mutable ll val;
node(int L, int R = -1, ll V = 0):l(L), r(R), val(V)
bool operator < (const node &rhs) const
return l < rhs.l;
;
set<node> odt;
auto split(int pos)
auto it = odt.lower_bound(node(pos));
if (it != odt.end() && it->l == pos) return it;
it--;
int L = it->l, R = it->r;
ll val = it->val;
odt.erase(it);
odt.insert(node(L, pos-1, val));
return odt.insert(node(pos, R, val)).first;
vector<ll> add(N);
BIT<ll> bit(N);
void assignCodeforces Round #771 (Div. 2)(ABCDE)
Codeforces Round #771 (Div. 2)(ABCDE)
Codeforces Round #771 (Div. 2) A~E
Codeforces Round #771 (Div. 2) A~E