Codeforces Global Round 5
Codeforces Global Round 5
A. Balanced Rating Changes
-
思路:\(n\)为偶数 则这n个数里面奇数的个数一定为偶数 那么就每次令一个答案为\(\frac{a_i}{2} - 1\) 另一个答案为\(\frac{a_i}{2} + 1\)(注意\(a_i\)的正负性
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
int n, x;
vector<int> a, ans;
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 0; i < n; i ++ ){
cin >> x;
a.push_back(x);
}
int flag = 1;
for (int i = 0; i < n; i ++ ){
if (a[i] & 1){
if (flag == 1){
if (a[i] >= 0)
ans.push_back(a[i] / 2);
else
ans.push_back(a[i] / 2 - 1);
}
else{
if (a[i] >= 0)
ans.push_back(a[i] / 2 + 1);
else
ans.push_back(a[i] / 2);
}
flag *= -1;
}
else
ans.push_back(a[i] / 2);
}
for (int i = 0; i < n; i ++ )
cout << ans[i] << "\n";
return 0;
}
B. Balanced Tunnel
-
思路:模拟搞搞就行
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 1e5 + 10;
int n, ans;
int a[N], b[N], res[N];
bool vis[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ )
cin >> a[i];
for (int i = 1; i <= n; i ++ )
cin >> b[i];
int j = 1;
for (int i = 1; i <= n; i ++ ){
vis[a[i]] = true;
for (; j <= n; j ++ ){
if (res[a[i]] || a[i] == b[j])
break;
if (!vis[b[j]])
res[b[j]] = 1;
}
}
for (int i = 1; i <= n; i ++ )
if (res[i])
ans ++ ;
cout << ans << "\n";
return 0;
}
C. Balanced Removals
-
思路:一维可以根据x坐标对所有点排序 然后成对移除 二维的时候把每个x相同的点单独处理 然后剩下y不同的进行排序 继续成对移除 分别都剩下一个数 就一起处理 三维同理
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 5e4 + 10;
int n;
struct Point{
int x, y, z, id;
}p[N], tmp[N];
inline bool cmp(const Point &p1, const Point &p2){
if (p1.x != p2.x)
return p1.x < p2.x;
if (p1.y != p2.y)
return p1.y < p2.y;
return p1.z < p2.z;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ ){
cin >> p[i].x >> p[i].y >> p[i].z;
p[i].id = i;
}
sort(p + 1, p + n + 1, cmp);
int j = 0;
for (int i = 1; i <= n; i ++ ){
if (p[i].x == p[i + 1].x && p[i].y == p[i + 1].y && i < n){
cout << p[i].id << " " << p[i + 1].id << "\n";
i ++ ;
}
else
tmp[ ++ j ] = p[i];
}
int k = 0;
for (int i = 1; i <= j; i ++ ){
if (tmp[i].x == tmp[i + 1].x && i < j){
cout << tmp[i].id << " " << tmp[i + 1].id << "\n";
i ++ ;
}
else
p[ ++ k ] = tmp[i];
}
for (int i = 1; i < k; i += 2 )
cout << p[i].id << " " << p[i + 1].id << "\n";
return 0;
}
D. Balanced Playlist
-
思路:先特判下\(mina * 2\)是否\(\geq maxa\) 然后把\(a\)重复三遍 注意跳出条件
-
AC代码
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll mult_mod(ll x, ll y, ll mod){
return (x * y - (ll)(x / (long double)mod * y + 1e-3) * mod + mod) % mod;
}
ll pow_mod(ll a, ll b, ll p){
ll res = 1;
while (b){
if (b & 1)
res = mult_mod(res, a, p);
a = mult_mod(a, a, p);
b >>= 1;
}
return res % p;
}
ll gcd(ll a, ll b){
return b ? gcd(b, a % b) : a;
}
const int N = 3e5 + 10;
const int INF = 0x3f3f3f3f;
int n;
int max_a = -INF, min_a = INF;
int a[N];
multiset<int> st;
int main(){
#ifndef ONLINE_JUDGE
freopen("my_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ ){
cin >> a[i];
a[i + 2 * n] = a[i + n] = a[i];
max_a = max(max_a, a[i]), min_a = min(min_a, a[i]);
}
if (min_a * 2 >= max_a){
for (int i = 1; i < n; i ++ )
cout << "-1 ";
cout << "-1\n";
return 0;
}
int j = 0;
for (int i = 1; i <= n; i ++ ){
for (;;){
if ((!st.empty() && (*( -- st.end())) > 2 * a[j + 1]) || (j == 3 * n))
break;
st.insert(a[ ++ j ]);
}
cout << j - i + 1 << " ";
st.erase(st.lower_bound(a[i]));
}
return 0;
}