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;
}
posted @ 2020-08-31 11:16  LORDXX  阅读(140)  评论(0)    收藏  举报