A
签到.
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t;
string a,b;
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
while(t--) {
cin>>a;
cin>>b;
if(a[0]-'a' == b[0]-'a' || a[0]-'A' == b[0]-'a' || a[0]-'a' == b[0]-'A' || a[0]-'A' == b[0]-'A') cout<<"Yes\n";
else cout<<"No\n";
}
return 0;
}
B
先不考虑交换操作,当$n$ 为奇数时,先手必胜,$n$ 为偶数时,后手必胜。而对于交换操作,分类讨论分析一下后我们发现,每次交换对于可操作数字总数只会产生偶数的变化,不会影响上述结论.
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t,n;
int a[30],b[30],c[30],cnt,sum;
void solve() {
if(n & 1) cout<<"qcjj\n";
else cout<<"zn\n";
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
while(t--) {
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
solve();
}
return 0;
}
C
马拉车板子题,等复习过字符串算法后再补题
D
暴力枚举所有的交换操作,做 $n$ 次最大字段和即可.
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int n,k;
int a[1010];
LL ans=1e18,dp[1010];
void getans() {
for(int i=1;i<=n;i++) {
dp[i]=a[i]+max(dp[i-1],0ll);
ans=max(ans,dp[i]);
}
for(int i=1;i<=n;i++) dp[i]=0;
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
ans=-ans;
if(k == 0) getans();
else {
for(int i=1;i<n;i++) {
swap(a[i],a[i+1]);
getans();
swap(a[i],a[i+1]);
}
}
cout<<ans<<"\n";
return 0;
}
E/F
待补.
G/H
直接给 $a_1,a_2,a_3$ 赋值,总计有 $3^3=27$ 种可能,枚举每种组合,判断是否符合所有的约束条件即可.
当然你也可以像官方题解那样整一个大分类讨论(我考场上写这玩意吃了好几发罚时2333).
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int t,n;
int x[100],y[100],z[100],a[4][30],cnt;
bool cmp(int u,int v) {
return u < v;
}
bool check() {
for(int i=1;i<=cnt;i++) {
bool flag=true;
for(int j=1;j<=n;j++) {
if(cmp(a[x[j]][i],a[y[j]][i]) != z[j]) {
flag=false;
break;
}
}
if(flag) return true;
}
return false;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>t;
for(int i=1;i<=3;i++)
for(int j=1;j<=3;j++)
for(int k=1;k<=3;k++) a[1][++cnt]=i,a[2][cnt]=j,a[3][cnt]=k;
while(t--) {
cin>>n;
for(int i=1;i<=n;i++) cin>>x[i]>>y[i]>>z[i];
if(check()) cout<<"YEs\n";
else cout<<"No\n";
}
return 0;
}
I
幽默数学题,不会开摆
J
分别计算每个人对期望的贡献,考虑到直接计算需要容斥,我们选择反向计算每个人不会被选中的概率.以男嘉宾为例,有公式 $\sum_{i=1}^n(1-\prod_{e(i,j)}(1-d\,\lbrack j\rbrack\,)\,)$,其中 $e(i,j)$ 表示 $i$ 与 $j$ 有边相连.
(官方题解里这题的公式写错了)
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=2e5+10;
int x[N],y[N],d1[N],d2[N];
int n,m,k;
double ans1[N],ans2[N],sum1,sum2;
void solve() {
for(int i=1;i<=n;i++) ans1[i]=1;
for(int i=1;i<=m;i++) ans2[i]=1;
for(int i=1;i<=k;i++) {
int u=x[i],v=y[i];
if(d2[v]) ans1[u]*=(1.0-1.0/d2[v]);
if(d1[u]) ans2[v]*=(1.0-1.0/d1[u]);
}
for(int i=1;i<=n;i++) sum1+=1.0-ans1[i];
for(int i=1;i<=m;i++) sum2+=1.0-ans2[i];
cout<<"float\n";
cout<<fixed<<setprecision(10)<<sum1<<" "<<sum2<<"\n";
return;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=k;i++) {
cin>>x[i]>>y[i];
d1[x[i]]++; d2[y[i]]++;
}
solve();
return 0;
}
K
L/M
设 $k_i$ 为 $a_i$ 在十进制下的位数,题目即让我们求满足 $a_j*10^{k_i} \, mod \, 36 + a_i \,mod \, 36 =36$ 的二元组 $(i,j)$ 的数量.我们枚举 $a_i$ ,对于 $a_j$ ,因为我们只关心它模 $36$后的值,所以并不需要一一枚举,只需要预处理出每一个余数对应的数的个数,计算答案时统一加上即可,复杂度 $O(36n)$.
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define int long long
const int N=2e5+10;
LL a[N],k[N],num[40],ans,b[30];
int n;
void solve() {
b[1]=10;
for(int i=2;i<=22;i++) b[i]=b[i-1]*10%36;
for(int i=1;i<=n;i++) {
for(int j=0;j<36;j++) {
int tmp=j*b[k[i]]%36 + a[i]%36;
if(tmp == 36 || tmp == 0) {
ans+=num[j];
if(a[i]%36 == j) ans--;
}
}
}
cout<<ans<<"\n";
return;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) {
cin>>a[i];
num[a[i]%36ll]++;
int tmp=a[i],js=0;
while(tmp) {
tmp/=10ll;
js++;
}
k[i]=js;
}
solve();
return 0;
}