A题
简单列举每一个情况然后输出答案即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
char a,b,c;
cin>>a>>b>>c;
for(int i=0;i<=2;i++){
if(a=='<'&&c=='<'){
cout<<'B'<<endl;
break;
}
if(a=='<'&&b=='>'){
cout<<'A'<<endl;
break;
}
if(a=='>'&&b=='<'){
cout<<'A'<<endl;
break;
}
if(a=='>'&&c=='>'){
cout<<'B'<<endl;
break;
}
if(b=='<'&&c=='>'){
cout<<'C'<<endl;
break;
}
if(b=='>'&&c=='<'){
cout<<'C'<<endl;
break;
}
}
}
B题 开一个数组存储是否为儿子,如果是判断是否为第一个,如果不是则输出No,本题有点过载代码写的不太好。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,char>PII;
int main(){
int n,m;
cin>>n>>m;
int b[105]={0};
vector<PII>a(m+1);
for(int i=1;i<=m;i++){
cin>>a[i].first;
cin>>a[i].second;
if(a[i].second=='M'){
int p=a[i].first;
b[p]=1;
}
}
for(int i=1;i<=m;i++){
if(a[i].second=='M'){
int t=a[i].first;
if(b[t]==0){
cout<<"No"<<endl;
continue;
}
else {
cout<<"Yes"<<endl;
b[t]=0;
}
}
else {
cout<<"No"<<endl;
}
}
return 0;
}
C题
本题题意比较难懂 但是放在C题肯定不会很难,点数较少,可用邻接矩阵查找是否有边,是双射所以都要存,本题可以用全排列模拟一编就可以,函数next_permutation是可以把一个列的全排列方法全部算出一遍,首先必须数列要有序,然后模拟一遍代码就可以
int ans=max;
do{
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) continue;
if(g[i][j]!=h[p[i]][p[j]]){
res+=w[p[i]][p[j]];
}
}
}
ans=min(ans,res/2);
}while(next_permutation(p+1,p+1+n));
D题
由于坐标是10的九次方级别,但是数量是10的五次方,所以要把坐标离散化,然后求前缀和,最后用二分来解决答案。
for(int i=1;i<=n;i++){
cin>>x[i];
}
for(int i=1;i<=n;i++){
int a;
cin>>;
;
sum[i]=sum[i-1]+a;
}
cin>>q;
while(q--){
int l,r;
cin>>l>>r;
int L=lower_bound(x+1,x+1+n,l)-x; int R=upper_bound(x+1,x+1+n,r)-x-1;
if(L>R){
cout<<0<<endl;
}else{
L--;
if(L<0) L=0;
cout<<sum[R]-sum[L]<<endl;
}
}
E题
这个题主要是要把重复的地方想办法换一种思路转化,假如2,3,2里f一到二和一到三里有两个二而第一个2的作用在R等于2之前有用 但到了3就是另一个2发挥的作用 了 所以求 f(l,r)的之和就是求每一个数在他自己的区间发挥作用的数量
cin>>a[i];
pos[a[i].push_back(i);
for(int i=1;i<=n;i++){
int last=0;
for(auto j:pos[i])res+=(j-last)*(n-j+i),last=j;
cout<<res;