A - Tricky Template
题意:
输入三个全部为小写的字符串a,b,c,判断是否存在模版t(若ti为小写字母,si必须与ti相同;若ti为大写字母,si必须与ti不同(C与c视作相同)) 使得a和b与模版匹配,c与模版不匹配
思路:
如果ci==ai 或ci == bi那么对于ci来说总是会与模版匹配,如果所有位置都与模版匹配,那么就不存在这样的模版
代码:
/*
* @Author :
* @LastEditTime : 2024-01-18 23:09:58
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n;cin>>n;
string a,b,c;cin>>a>>b>>c;
int cnt=0;
for(int i=0;i<n;i++){
if(c[i]==a[i]||c[i]==b[i]){
cnt++;
}
}
cout<<((cnt==n)?"NO":"YES")<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}
B - Forming Triangles
题意:
有n根木棒,每根木棒的长度是2^ai,求出选择三根木棒使得他们可以组成三角形的方法的数量。
思路:
2^(x-1)+2^(x-1)=2^x。组成三角形的条件是任意两边之和要大于第三边,那么不存在长度完全不相等的三条边组成三角形(两条较小的边之和不可能大于第三条边)。
所以组成三角形有两种情况:1.三条边相等即C_y^3 2.两条较大的边相等cnt*C_y^2
代码:
/*
* @Author :
* @LastEditTime : 2024-01-18 23:55:59
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n;cin>>n;
vector<int> a(n);
map<int,int> mp;
for(int &ai:a) {
cin>>ai;
mp[ai]++;
}
int ans=0,cnt=0,sum=0;
for(auto [x,y]:mp){
cnt++;
if(cnt>1){
ans+=sum*(y-1)*y/2;
}
ans+=y*(y-1)*(y-2)/6;
sum+=y;
}
cout<<ans<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}
C - Closest Cities
题意:
一条线段上有多个城市,每个城市有唯一的距离自己最近的一个城市,每个城市到达离自己最近的城市所需花费的金币个数是1,到达其他的城市所需花费的金币个数是|ai-aj|。对于m个询问,计算出从一个城市到另一个城市所需要的最少金币个数。
思路:
从城市x到城市y过程中不会折返,故分别从前往后和从后往前两个方向计算出从城市ai到城市aj可能会多被计算上的金币个数sum。最后的答案就是|ai-aj|-sum。
代码:
/*
* @Author :
* @LastEditTime : 2024-01-19 11:59:14
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ff first
#define ss second
#define pi pair<int,int>
void solve(){
int n;cin>>n;
vector<int> a(n);
for(int &ai:a) cin>>ai;
vector<int> b(n),c(n);
for (int i=1;i<n;i++) {
if(i==1||a[i]-a[i-1]<a[i-1]-a[i-2]) b[i]=a[i]-a[i-1]-1;
b[i]+=b[i-1];
}
for(int i=n-2;i>=0;i--) {
if(i==n-2||a[i+1]-a[i]<a[i+2]-a[i+1]) c[i]=a[i+1]-a[i]-1;
c[i]+=c[i+1];
}
int m;cin>>m;
while(m--){
int x,y;cin>>x>>y;
x-=1;y-=1;
int ans=abs(a[x]-a[y]);
cout<<ans-(x<y?b[y]-b[x]:c[y]-c[x])<<"\n";
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;cin>>t;while(t--)
solve();
return 0;
}