Codeforces Round #767 (Div. 2)
Codeforces Round #767 (Div. 2)
A. Download More RAM
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 110;
struct node {
ll a, b;
};
node mp[N];
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
ll T;
cin >> T;
while (T--) {
ll n, k;
cin >> n >> k;
for (ll i = 1; i <= n; ++i) {
cin >> mp[i].a;
}
for (ll i = 1; i <= n; ++i) {
cin >> mp[i].b;
}
sort(mp + 1, mp + n + 1, [&](node x, node y) {
return x.a < y.a;
});
for (ll i = 1; i <= n; ++i) {
if (mp[i].a <= k) {
k += mp[i].b;
}
}
cout << k << endl;
}
return 0;
}
B. GCD Arrays
题意:给出l和r表示有从l到r这些数,一次操作可以选择两个数取出然后将他们的乘积放回去,问能否在k次操作内使得剩余数的gcd大于1
使得gcd包含2将所有的奇数和任意一个偶数合并的操作数为奇数的个数
判断k是否大于等于奇数的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
ll T;
cin >> T;
while (T--) {
int l, r, k;
cin >> l >> r >> k;
int num = (r - l + 1)/ 2;
if((l & 1) && (r & 1)) num ++;
if(k >= num) {
cout << "YES" << endl;
continue;
}
if(r == l && r > 1) {
cout << "YES" << endl;
continue;
}
cout <<"NO" << endl;
}
return 0;
}
C. Meximum Array
题意:给一个数组a,每次可以从头选择若干连续的数字从a中删去,将他们的mex值加入到b的末尾,要求使得b数组尽可能的大,输出b数组
统计所有数字出现的次数和位置(这里使用了队列因为我觉得删的方便
对于每个mex将数字出现的位置维护
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int a[N];
queue<int> g[N];
vector<int> res;
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
ll T;
cin >> T;
while (T--) {
int n;
cin >> n;
res.clear();
for (int i = 1; i <= n; ++i) {
cin >> a[i];
g[a[i]].push(i);
}
int pos = 0;
while(pos < n) {
for (int i = 0; i <= n; ++i) {
if (g[i].empty()) {
res.push_back(i);
break;
}
pos = max(pos, g[i].front());
}
if(res[res.size() - 1] == 0) {
pos ++;
continue;
}
for(int i=0; i < res[res.size() - 1]; ++ i) {
while(g[i].size() && g[i].front() <= pos) g[i].pop();
}
}
cout << res.size() << endl;
for(auto tmp : res) cout << tmp <<" ";
cout << endl;
//init
for (int i = 0; i <= n; ++i) {
while(!g[i].empty()) g[i].pop();
}
}
return 0;
}
D. Peculiar Movie Preferences
题意:有n个字符串(长度不超过3),要求保留至少一个,使得他们连接起来形成回文串
如果一个串本身就是回文,直接留它就行,除去该情况之后
不然只要是两个拼起来是回文就行,即
(AB)(BA)
(ABC)(BA)
(AB)(CBA)
(ABC)(CBA)
对这些情况直接进行判断就行,对于BA和CBA可以构造出AB和ABC等,用set维护,剩下的一个ABC在前BA在后的额外倒过来扫一次
(至于为什么不用判别的不会证明但好像就是不用判,
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
set<string> st;
string a[N];
inline bool check(string s) {
if (s.size() == 1) return 1;
if (s.size() == 2)
return (s[0] == s[1]);
if (s.size() == 3)
return (s[0] == s[2]);
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while (T--) {
int n;
cin >> n;
st.clear();
bool flag = 0;
for (int i = 1; i <= n; ++i) {
string s;
cin >> s;
a[i] = s;
if (check(s)) flag = 1;
if (s.size() == 2) {
string t = "";
t = t + s[1] ;
t = t + s[0];
if (st.count(t)) flag = 1;
}
if (s.size() == 3) {
string t = "";
t = t + s[2];
t = t + s[1];
if (st.count(t)) flag = 1;
t = t + s[0];
if (st.count(t)) flag = 1;
}
st.insert(s);
}
if (flag) {
cout << "YES" << endl;
continue;
}
st.clear();
for (int i = n; i >= 1; --i) {
string s = a[i];
if (s.size() == 3) {
string t = "";
t = t+ s[1];
t = t + s[0];
if (st.count(t)) {
flag = 1;
break;
}
}
st.insert(s);
}
if (flag) {
cout << "YES" << endl;
} else {
cout << "NO" << endl;
}
}
}
E. Grid Xor
题意: n × n n \times n n×n 的格子里每个格子有一个数,现在告诉每个格子周围格子的异或和,问整个格子的总异或和是多少
直接转换成翻格子游戏(黑变白-白变黑那个)
相邻两个格子可以凑成六边形,然后六边形可以无缝拼接,只要再处理一下边角就行
照常谢谢hoshimi同学,明天补代码,眠了