Codeforces Round #593 (Div. 2)
A. Stones
思路:水题 先取第一堆中的每一个和先取第二堆中的每一个进行比较就行了
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 t, a, b, c, cnt, ans;
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> t;
while (t -- ){
ans = 0, cnt = 0;
cin >> a >> b >> c;
int x, y, z, tmp;
x = a, y = b, z = c;
tmp = min(x, y / 2);
x -= tmp, y -= tmp * 2;
cnt += 3 * tmp;
tmp = min(y, z / 2);
cnt += 3 * tmp;
ans = max(ans, cnt);
cnt = 0;
x = a, y = b, z = c;
tmp = min(y, z / 2);
y -= tmp, z -= tmp * 2;
cnt += 3 * tmp;
tmp = min(x, y / 2);
cnt += 3 * tmp;
ans = max(ans, cnt);
cout << ans << "\n";
}
return 0;
}
B. Alice and the List of Presents
思路:直接\(\left(2 ^ m - 1\right) ^ n\)
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 mod = 1e9 + 7;
ll n, m, ans;
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
ans = Pow_mod(Pow_mod(2, m, mod) - 1, n, mod);
cout << ans << "\n";
return 0;
}
C. Labs
思路:构造出类似于
\[\begin{matrix} 1 & 6 & 7\\ 2 & 5 & 8\\ 3 & 4 & 9\\ \end{matrix}\]
即可满足题意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 = 310;
int n, cnt;
int mp[N][N];
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++ ){
if (i & 1){
for (int j = 1; j <= n; j ++ )
mp[j][i] = ++ cnt;
}
else{
for (int j = n; j >= 1; j -- ){
mp[j][i] = ++ cnt;
}
}
}
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j < n; j ++ )
cout << mp[i][j] << " ";
cout << mp[i][n] << "\n";
}
return 0;
}
D. Alice and the Doll
思路:暴力模拟即可
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;
ll n, m, k, ans;
set<int> X[N], Y[N];
set<int> XX, YY;
void calc(int x, int y, int d){
int z;
set<int>::iterator xx, yy;
if (d == 1){
xx = X[x].upper_bound(y), yy = XX.upper_bound(y);
if (xx == X[x].end())
z = (*yy) - 1;
else
z = min(*xx, *yy) - 1;
if (z == y)
return ;
else{
ans += z - y;
YY.insert(x);
calc(x, z, 2);
}
}
else if (d == 2){
xx = Y[y].upper_bound(x), yy = YY.upper_bound(x);
if (xx == Y[y].end())
z = (*yy) - 1;
else
z = min(*xx, *yy) - 1;
if (z == x)
return ;
else{
ans += z - x;
XX.insert(y);
calc(z, y, 3);
}
}
else if (d == 3){
xx = X[x].lower_bound(y), yy = XX.lower_bound(y);
yy -- ;
if (xx == X[x].begin())
z = (*yy) + 1;
else{
xx -- ;
z = max(*xx, *yy) + 1;
}
if (z == y)
return ;
else{
ans += y - z;
YY.insert(x);
calc(x, z, 4);
}
}
else if (d == 4){
xx = Y[y].lower_bound(x), yy = YY.lower_bound(x);
yy -- ;
if (xx == Y[y].begin())
z = (*yy) + 1;
else{
xx -- ;
z = max(*xx, *yy) + 1;
}
if (z == x)
return ;
else{
ans += x - z;
XX.insert(y);
calc(z, y, 1);
}
}
}
int main(){
// freopen("my_in.txt", "r", stdin);
// freopen("my_out.txt", "w", stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ans = 1;
cin >> n >> m >> k;
for (int i = 1; i <= k; i ++ ){
int x, y;
cin >> x >> y;
X[x].insert(y);
Y[y].insert(x);
}
XX.insert(0), XX.insert(m + 1);
YY.insert(0), YY.insert(n + 1);
calc(1, 1, 1);
if (ans == n * m - k){
printf("Yes\n");
return 0;
}
ans = 1;
XX.clear(), YY.clear();
XX.insert(0), XX.insert(m + 1);
YY.insert(0), YY.insert(n + 1);
calc(1, 1, 2);
if (ans == n * m - k){
printf("Yes\n");
return 0;
}
printf("No\n");
return 0;
}