Codeforces Round #540 (Div. 3) A,B,C,D1,D2,F1

A. Water Buying

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
int main() {
	std::ios::sync_with_stdio(0);
	int q;
	cin>>q;
	while(q--) {
		ll n;
		int a,b;
		cin>>n>>a>>b;
		double tb = b/2.0;
		if(n*a<=n*tb) cout<<n*a<<endl;
		else cout<<(n/2)*b+(n%2)*a<<endl;
	}
	return 0;
}

B. Tanya and Candies

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn = 2e5+5;
ll a[maxn], odd[maxn], even[maxn];
int main() {
	std::ios::sync_with_stdio(0);
	int n;
	cin >> n;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if (i%2 == 1) {
			odd[i] = odd[i-1]+a[i];
			even[i] = even[i-1];
		} else {
			odd[i] = odd[i-1];
			even[i] = even[i-1]+a[i];
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; ++i) {
		ll a = odd[i-1] + even[n]-even[i];
		ll b = even[i-1] + odd[n]-odd[i];
		if (a == b)
			ans++;
	}
	cout << ans << endl;
	return 0;
}

C. Palindromic Matrix

bj聚聚写的


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn = 25;
int G[maxn][maxn];
int num[1010];
vector<int> ID[5];
int n;
int main() {
	std::ios::sync_with_stdio(0);
	cin >> n;
	int tp;
	for (int i = 1; i <= n * n; ++i) {
		cin >> tp;
		num[tp]++;
	}
	for (int i = 1; i <= 1000; ++i) {
		if (num[i] == 0)
			continue;
		if (num[i] % 2 == 1)
			ID[1].push_back(i);
		else {
			if (num[i] % 4 == 0)
				ID[4].push_back(i);
			else
				ID[2].push_back(i);
		}
	}
	if (n % 2 == 1) {
		int cnt2 = 0;
		if (ID[1].size() != 1) {
			cout << "NO" << endl;
		} else {
			G[(n + 1) / 2][(n + 1) / 2] = ID[1][0];
			num[ID[1][0]]--;
			if (num[ID[1][0]] != 0) {
				if (num[ID[1][0]] % 4 != 0)
					ID[2].push_back(ID[1][0]);
				else
					ID[4].push_back(ID[1][0]);
			}
			if (ID[2].size() > n / 2 * 2)
				cout << "NO" << endl;
			else {
				int k2 = 0, k4 = 0;
				int li = 1, lj = 1;
				while (li <= n / 2) {
					while (k2 < ID[2].size() && num[ID[2][k2]] == 0)
						k2++;
					if (k2 < ID[2].size()) {
						G[li][(n + 1) / 2] = G[n - li + 1][(n + 1) / 2] = ID[2][k2];
						num[ID[2][k2]] -= 2;
						if (num[ID[2][k2]])
							ID[4].push_back(ID[2][k2]);
						li++;
						k2++;
					} else {
						break;
					}
				}
				while (lj <= n / 2) {
					while (k2 < ID[2].size() && !num[ID[2][k2]])
						k2++;
					if (k2 < ID[2].size()) {
						G[(n + 1) / 2][lj] = G[(n + 1) / 2][n - lj + 1] = ID[2][k2];
						num[ID[2][k2]] -= 2;
						if (num[ID[2][k2]])
							ID[4].push_back(ID[2][k2]);
						lj++;
						k2++;
					} else {
						break;
					}
				}
				while (li <= n / 2) {
					while (!num[ID[4][k4]] && k4 < ID[4].size())
						k4++;
					G[li][(n + 1) / 2] = G[n - li + 1][(n + 1) / 2] = ID[4][k4];
					num[ID[4][k4]] -= 2;
					li++;
				}
				while (lj <= n / 2) {
					while (!num[ID[4][k4]] && k4 < ID[4].size())
						k4++;
					G[(n + 1) / 2][lj] = G[(n + 1) / 2][n - lj + 1] = ID[4][k4];
					num[ID[4][k4]] -= 2;
					lj++;
				}
				for (int i = 1; i <= n / 2; ++i) {
					for (int j = 1; j <= n / 2; ++j) {
						while (!num[ID[4][k4]])
							k4++;
						num[ID[4][k4]] -= 4;
						G[i][j] = G[n - i + 1][j] = G[i][n - j + 1] = G[n - i + 1][n - j + 1] = ID[4][k4];
					}
				}
				cout << "YES" << endl;
				for (int i = 1; i <= n; ++i) {
					for (int j = 1; j <= n; ++j)
						cout << G[i][j] << " ";
					cout << endl;
				}
			}
		}
	} else {
		if (!ID[1].empty() || !ID[2].empty()) {
			cout << "NO" << endl;
		} else {
			int k = 0;
			for (int i = 1; i <= n / 2; ++i) {
				for (int j = 1; j <= n / 2; ++j) {
					while (num[ID[4][k]] == 0)
						k++;
					num[ID[4][k]] -= 4;
					G[i][j] = G[n - i + 1][j] = G[i][n - j + 1] = G[n - i + 1][n - j + 1] = ID[4][k];
				}
			}
			cout << "YES" << endl;
			for (int i = 1; i <= n; ++i) {
				for (int j = 1; j <= n; ++j)
					cout << G[i][j] << " ";
				cout << endl;
			}
		}
	}
	return 0;
}

h聚聚50行代码

#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define pb push_back
#define Rep(i,a,b) for(int i=a;i<=b;i++)
#define F first
#define S second
using namespace std;
int n,x,ed=1001,mp[25][25],cnt[1005],pro[4]={4,2,1};
vector< pair<int, pair<int,int> >> pos;
int get(int pos) { return n+1-pos; }
int main() {
	scanf("%d",&n);
	Rep(i,1,n*n) scanf("%d",&x),cnt[x]++;
	Rep(i,1,(n+1)/2) Rep(j,1,(n+1)/2) {
		if(i!=get(i)&&j!=get(j)) pos.pb({4, {i,j}});
		else if((i==get(i)||j==get(j))&&!(i==get(i)&&j==get(j))) pos.pb({2, {i,j}});
		else pos.pb({1, {i,j}});
	}
	Rep(k,0,2) {
		int cur=pro[k],st=1;
		for(auto it:pos) {
			if(it.F!=cur) continue;
			int i=it.S.F,j=it.S.S;
			while(st<ed&&cnt[st]<cur) st++;
			if(st==ed) return 0*printf("No\n");
			mp[i][j]=mp[i][get(j)]=mp[get(i)][j]=mp[get(i)][get(j)]=st;
			cnt[st]-=cur;
		}
	}	
	puts("Yes");
	Rep(i,1,n) Rep(j,1,n) printf("%d%c",mp[i][j],j==n?'\n':' ');  	
	return 0;
}

 

D1/D2. Coffee and Coursework (Hard/Easy Version)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=2e5+5;
ll a[maxn],s[maxn],b[maxn];
ll n,m,sum=0;
bool cmp(int x,int y) {
	return x>y;
}
bool ck(int t) {
	ll res=0,cnt=0;
	for(int j=1; j<=n;) {
		for(int i=j; i<=j+t-1 && i<=n; ++i) {
			res+=max(b[i]-cnt,(ll)0);
		}
		cnt++;
		j=j+t;
	}
	if(res>=m) {
		return true;
	}
	return false;
}
int main() {
	std::ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1; i<=n; ++i) {
		cin>>a[i];
		b[i]=a[i];
		sum+=a[i];
	}
	sort(b+1,b+1+n,cmp);
	if(sum<m)	cout<<-1<<endl;
	else {
		int le=1,ri=n,mid,ans=-1;
		while(le<=ri) {
			cout<<le<<" "<<ri<<endl;
			mid=(le+ri)>>1;
			if(ck(mid)) {
				ri=mid-1;
				ans=mid;
			} else	le=mid+1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

F1. Tree Cutting (Easy Version)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=3e5+50;
int ans=0,color[maxn],r[maxn],b[maxn],red=0,blue=0;
vector<int> G[maxn];
void dfs(int u,int fa) {
	if(color[u]==1) r[u]=1;
	if(color[u]==2) b[u]=1;
	for(int i=0;i<G[u].size();i++) {
		int v=G[u][i];
		if(v==fa) continue;
		dfs(v,u);
		r[u]+=r[v],b[u]+=b[v];	
	} 
	if(r[u]==red&&b[u]==0||b[u]==blue&&r[u]==0) ++ans;
}
int main() {
	std::ios::sync_with_stdio(0);
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) {
		cin>>color[i];
		if(color[i]==1) red++;
		if(color[i]==2) blue++;
	}
	for(int i=1;i<n;i++) {
		int u,v;
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	}
	dfs(1,0);
	cout<<ans<<endl;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值