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;
}