Codeforces Round #662 (Div. 2)
A - Rainbow Dash, Fluttershy and Chess Coloring
打表找规律
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#include <iomanip>
#pragma GCC optimize(2)
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
char ch = getchar(); ll x = 0, f = 1;
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
int T, n;
int main() {
T = read();
while(T--)
{
n = read();
if (n == 1) {
printf("%d\n", 1);
}
else {
printf("%d\n", n / 2 + 1);
}
}
}
B - Applejack and Storages
首先确定,如果有一个数字个数大于等于8,那么一定可以。
其次,如果数量在\([4,7]\)的盒子数量大于等于2,那么一定可以。
如果没有,考虑\([4,7]\)的盒子数量等于1,那么单独考虑这一个盒子。首先这个盒子只能做正方形,因此数量减少4。然后计算他还剩下的个数,是否大于等于2,因为这个时候他就可以作为长方形的两条边。然后统计数量在\([2,3]\)的盒子数量,是否大于等于两个即可。
其他情况无法做到。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#include <iomanip>
#pragma GCC optimize(2)
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
char ch = getchar(); ll x = 0, f = 1;
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
const int N = 2e5 + 10;
int cnt[N];
int box[N];
int a[N];
int n, q;
int main() {
n = read();
int num = n;
upd(i, 1, n)a[i] = read(), cnt[a[i]]++;
int temp1 = 0, temp2 = 0;
upd(i, 1, 1e5)if (cnt[i]) {
box[cnt[i]]++;
if (cnt[i] >= 8)temp2++;
else if (cnt[i] < 8 && cnt[i] >= 4)temp1++;
}
q = read();
char op[2];
int x;
while(q--){
scanf("%s", op);
x = read();
if (op[0] == '+')
{
box[cnt[x]]--;
if (cnt[x] >= 8)temp2--;
else if (cnt[x] < 8 && cnt[x] >= 4)temp1--;
cnt[x]++; num++;
box[cnt[x]]++;
if (cnt[x] >= 8)temp2++;
else if (cnt[x]< 8 &&cnt[x] >= 4)temp1++;
}
else {
if (cnt[x] >= 8)temp2--;
else if (cnt[x] < 8 && cnt[x] >= 4)temp1--;
box[cnt[x]]--;
cnt[x]--; num--;
box[cnt[x]]++;
if (cnt[x] >= 8)temp2++;
else if (cnt[x] < 8 && cnt[x] >= 4)temp1++;
}
if (num<8) {
puts("no");
}
else {
if (temp2) {
puts("yes");
}
else {
if(temp1>=2)puts("yes");
else {
if (temp1 == 0)puts("no");
else {
int pos = 0;
upd(i, 4, 7)if (box[i])pos = i;
int left = pos - 4;
int need = 0;
if (left >= 2)need++;
upd(i, 2, 3)if (box[i])need++;
if (need >= 2)puts("yes");
else puts("no");
}
}
}
}
}
return 0;
}
C - Pinkie Pie Eats Patty-cakes
贪心即可
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#include <iomanip>
#pragma GCC optimize(2)
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
char ch = getchar(); ll x = 0, f = 1;
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
int T, n;
const int N = 1e5 + 10;
int a[N];
int cnt[N];
vector<pir>vec;
int id[N];
int main() {
T = read();
while (T--) {
vec.clear();
n = read();
upd(i, 1, n)cnt[i] = 0;
upd(i, 1, n)a[i] = read(), cnt[a[i]]++, id[i] = i;
upd(i, 1, n)if (cnt[i])vec.push_back(make_pair(cnt[i], i));
sort(vec.begin(), vec.end());
int maxx = vec.back().first;
int sum = 1;
dwd(i, vec.size() - 2, 0) {
if (vec[i].first == maxx)sum++;
else break;
}
int left = n - sum * maxx;
int need = left / (maxx - 1);
printf("%d\n", need + sum - 1);
}
return 0;
}
D - Rarity and New Dress
dp。
我们将这个菱形拆分出来看。他是一个向上的等腰三角形和向下的等腰三角形组成。令\(up[i][j]\)表示,第i行第j列,向上最多能有多高的等腰三角形。
更新\(up[i+1][j]\),\(up[i+1][j]=min(min(向左延申最远,向右延申最远), up[i][j]+1)\)\((col[i][j]==col[i+1][j])时\)。
故扫两遍dp,自顶而下,和自底而上。然后最后合在一起更新答案即可。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<climits>
#include<stack>
#include<vector>
#include<queue>
#include<set>
#include<bitset>
#include<map>
//#include<regex>
#include<cstdio>
#include <iomanip>
#pragma GCC optimize(2)
#define up(i,a,b) for(int i=a;i<b;i++)
#define dw(i,a,b) for(int i=a;i>b;i--)
#define upd(i,a,b) for(int i=a;i<=b;i++)
#define dwd(i,a,b) for(int i=a;i>=b;i--)
//#define local
typedef long long ll;
typedef unsigned long long ull;
const double esp = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int inf = 1e9;
using namespace std;
ll read()
{
char ch = getchar(); ll x = 0, f = 1;
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
typedef pair<int, int> pir;
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lrt root<<1
#define rrt root<<1|1
const int N = 2e3 + 10;
int n, m;
char grp[N][N];
int lf[N][N], rt[N][N];
int up[N][N], dw[N][N];
int main() {
n = read(), m = read();
upd(i, 1, n) {
scanf("%s", grp[i] + 1);
}
upd(i, 1, n) {
upd(j, 1, m) {
if (grp[i][j] == grp[i][j - 1])lf[i][j] = lf[i][j - 1] + 1;
else lf[i][j] = 1;
}
dwd(j, m, 1)
if (grp[i][j] == grp[i][j + 1])rt[i][j] = rt[i][j + 1] + 1;
else rt[i][j] = 1;
}
upd(j, 1, m) {
up[1][j] = 1;
dw[n][j] = 1;
}
upd(i, 2, n) {
upd(j, 1, m) {
if (grp[i][j] == grp[i - 1][j]) {
int dist = min(lf[i][j], rt[i][j]);
up[i][j] = min(dist, up[i - 1][j] + 1);
}
else up[i][j] = 1;
}
}
dwd(i, n-1, 1) {
upd(j, 1, m) {
if (grp[i][j] == grp[i + 1][j]) {
int dist = min(lf[i][j], rt[i][j]);
dw[i][j] = min(dist, dw[i + 1][j] + 1);
}
else dw[i][j] = 1;
}
}
int ans = 0;
upd(i, 1, n) {
upd(j, 1, m) {
ans += min(up[i][j], dw[i][j]);
}
}
cout << ans << endl;
return 0;
}
橙橙橙

浙公网安备 33010602011771号