2022河南萌新联赛第(六)场:郑州大学ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛牛客竞赛OJ (nowcoder.com)
2022河南萌新联赛第(六)场:郑州大学ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛牛客竞赛OJ (nowcoder.com)
1.A-想要更多的0_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)
A-想要更多的0_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com) - silky__player - 博客园 (cnblogs.com)
单独写了一篇,因为对如何找[0,n]区间出现一个数字的次数不是特别清楚
2.B-求四边形内一点_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)
稍微演算一下就好
#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define int long long
#define pb push_back
#define IOS cin.tie(0)->sync_with_stdio(false);
#define inf 0x7fffffff
#define endl "\n"
/*
*/
signed main(){
double x1,y1,x2,y2;
cin>>x1>>x2>>y1>>y2;
double k=(y2-y1)/(x2-x1);
double x=(x1*y1+x2*y2)/(k*(x1+x2)+y1+y2);
cout<<x<<" "<<k*x<<endl;
return 0;
}
3.C-盲打_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)
这看代码应该就可以理解
#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define int long long
#define pb push_back
#define IOS cin.tie(0)->sync_with_stdio(false);
#define inf 0x7fffffff
#define endl "\n"
/*
*/
string s[4];
int tt;
signed main(){
s[1]=" qwertyuiop";
s[2]=" asdfghjkl";
s[3]=" zxcvbnm";
cin>>tt;
while(tt--){
string t;
cin>>t;
for(auto now:t){
if(now>='A'&&now<='Z'){
cout<<"3 1 ";
now=now-'A'+'a';
}
for(int i=1;i<=3;i++){
for(int j=1;j<s[i].size();j++){
if(s[i][j]==now){
cout<<i<<" "<<j<<endl;
}
}
}
}
}
return 0;
}
4.D-树上祖先询问_2022河南萌新联赛第(六)场:郑州大学 (nowcoder.com)
提供两种写法
1.lca
直接考虑求a集合的lca看在b集合中是否存在a集合的lca,注意1不能是1的祖先.
#include<bits/stdc++.h>
using namespace std;
#define fel(i,x,y) for(int i=x;i<=y;i++)
#define feh(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
#define pb push_back
#define IOS cin.tie(0)->sync_with_stdio(false);
#define inf 0x7fffffff
#define endl "\n"
/*
就是dfs序和top如果b集合中存在一个点时a中所有集合所有点的lca即可
*/
const int N=1e5+100;
int son[N],fa[N],sz[N],d[N],top[N],n,q;
vector<int>b[N];
int s1[20],s2[20];
void dfs1(int x,int f){
sz[x]=1;
d[x]=d[f]+1;
son[x]=0;
for(auto i:b[x]){
if(i==fa[x]){
continue;
}
dfs1(i,x);
sz[x]+=sz[i];
if(sz[son[x]]<sz[i]) son[x]=i;
}
}
void dfs2(int x,int topx){
top[x]=topx;
if(son[x]) dfs2(son[x],topx);
for(auto i:b[x]){
if(i!=fa[x]&&i!=son[x]){
dfs2(i,i);
}
}
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(d[top[x]]>=d[top[y]]){
x=fa[x];
}
else y=fa[y];