2021牛客暑期多校训练营2,签到题CDFKI

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021牛客暑期多校训练营2,签到题CDFKI相关的知识,希望对你有一定的参考价值。

2021牛客暑期多校训练营2

题号 标题 已通过代码 通过率 团队的状态
A Arithmetic Progression 点击查看 6/72 未通过
B Cannon 点击查看 34/104 未通过
C Draw Grids 点击查看 1537/2307 通过(结论-奇偶性)
D Er Ba Game 点击查看 1588/3007 通过(模拟)
E Gas Station 点击查看 1/20 未通过
F Girlfriend 点击查看 620/3053 通过(计算几何)
G League of Legends 点击查看 27/372 未通过
H Olefin 点击查看 7/17 未通过
I Penguins 点击查看 590/1301 通过(四维BFS)
J Product of GCDs 点击查看 79/1721 未通过
K Stack 点击查看 824/6451 通过(单调栈)
L WeChat Walk 点击查看 23/177 未通过

在这里插入图片描述

//D
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int calc(int a, int b){
	if(a>b)swap(a,b);
	if(a==2 && b==8)return 1e9+10;
	if(a==b)return 100000*a;
	return 1000*((a+b)%10)+b;
}

int main(){
	int T;  cin>>T;
	while(T--){
		int a, b, c, d;  cin>>a>>b>>c>>d;
		int ans1 = calc(a,b), ans2 = calc(c,d);
		if(ans1>ans2)cout<<"first\\n";
		else if(ans1<ans2)cout<<"second\\n";
		else cout<<"tie\\n";
	}
	return 0;
}


//I
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;

string s[2][30];
struct node{int x1,y1,x2,y2,step,id;};
int dy[][4]={{-1,1,0,0},{1,-1,0,0}};
int dx[][4]={{0,0,-1,1},{0,0,-1,1}};
int vis[25][25][25][25];
int check(int x,int y,int i){if(x>=0&&x<=19&&y>=0&&y<=19&&s[i][x][y]=='.')return 1;return 0;}
int tot=1, ed, op[25*25*25*25], pre[25*25*25*25];//路径打印
map<int, node>ma;
int bfs(){
	queue<node>q;
	q.push(node{19,19,19,0,0,1});
	vis[19][19][19][0] = 1;
	op[1]=-1;  ma[1]=q.front();
	while(q.size()){
		node t = q.front(); q.pop();
		if(t.x1==0&&t.y1==19&&t.x2==0&&t.y2==0){ed=t.id;return t.step;}
		for(int i = 0; i < 4; i++){
			node nt = t;
			nt.x1 += dx[0][i];  nt.y1 += dy[0][i];
			nt.x2 += dx[1][i];  nt.y2 += dy[1][i];
			nt.step++;
			if(!check(nt.x1,nt.y1,0))nt.x1=t.x1,nt.y1=t.y1;
			if(!check(nt.x2,nt.y2,1))nt.x2=t.x2,nt.y2=t.y2;
			if(vis[nt.x1][nt.y1][nt.x2][nt.y2])continue;
			vis[nt.x1][nt.y1][nt.x2][nt.y2] = 1;
			nt.id=++tot;  q.push(nt);
			ma[nt.id] = nt;  pre[nt.id] = t.id;  op[nt.id] = i;//路径打印
		}
	}
}
void print(int x){
	if(!x)return;  print(pre[x]);
	if(op[x]==0)printf("L");
	if(op[x]==1)printf("R");
	if(op[x]==2)printf("U");
	if(op[x]==3)printf("D");
	s[0][ma[x].x1][ma[x].y1]='A';
	s[1][ma[x].x2][ma[x].y2]='A';
}

int main(){
	for(int i = 0; i < 20; i++)
		cin>>s[0][i]>>s[1][i];
	cout<<bfs()<<"\\n";
	print(ed);
	cout<<"\\n";
	for(int i = 0; i < 20; i++)
		cout<<s[0][i]<<" "<<s[1][i]<<"\\n";
	return 0;
}


在这里插入图片描述

//C
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
typedef long long LL;
int main(){
	int n, m;  cin>>n>>m;
	if(n*m%2==0){
		cout<<"YES\\n";
	}else{
		cout<<"NO\\n";
	}
	return 0;
}


在这里插入图片描述

//F
#include<bits/stdc++.h>
using namespace std;
const double pi = acos(-1);

struct V{
	double x,y,z;
	V(){}
	V(double a,double b,double c):x(a),y(b),z(c){}
	void in(){scanf("%lf%lf%lf",&x,&y,&z);}
};
inline V operator+(V a,V b){return V(a.x+b.x,a.y+b.y,a.z+b.z);}
inline V operator-(V a,V b){return V(a.x-b.x,a.y-b.y,a.z-b.z);}
inline V operator*(double k,V a){return V(k*a.x,k*a.y,k*a.z);}
inline double len(V c){return sqrt(c.x*c.x+c.y*c.y+c.z*c.z);}
inline double dist(V a,V b){return len(a-b);}

inline void proc(V a,V b,double k,V &O,double &R){
	O=b+1/(k*k-1)*(b-a); //球心
	R=k/(k*k-1)*dist(a,b); //半径
}

int main(){
	int T;  cin>>T;
	while(T--){
		//获得球心和半径
		V A, B, C, D, O1, O2;
		A.in();B.in();C.in();D.in();
		double k1,k2, r1,r2;
		scanf("%lf%lf",&k1,&k2);
		proc(A,B,k1,O1,r1);
		proc(C,D,k2,O2,r2);
		
		//模板: 计算两球相交部分体积
		if(r1<r2)swap(r1,r2),swap(O1,O2);
		double d = dist(O1,O2);
		if(d>r1+r2)printf("0\\n");//相离
		else if(d<r1-r2)printf("%lf\\n",pi*4/3*r2*r2*r2);//包含
		else{
			double h1=r1-(r1*r1+d*d-r2*r2)/(2*d),h2=r2-(r2*r2+d*d-r1*r1)/(2*d);
			printf("%lf\\n",pi*(r1-h1/3)*h1*h1+pi*(r2-h2/3)*h2*h2);
		}
	}
	return 0;
}


在这里插入图片描述

//K
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int a[maxn], b[maxn];
int main(){
	int n, k;  cin>>n>>k;
	for(int i = 1; i <= k; i++){
		int p, x;  cin>>p>>x;  b[p] = x;
	}
	for(int i = 1; i <= n; i++){
		if(!b[i])b[i]=b[i-1]+1;//没有指定,直接加入元素
		else{
			if(b[i]>b[i-1]+1){//指定了但不够,无解
				cout<<"-1\\n";
				return 0;
			}
		}
	}
	stack<int>s; int x = 0;
	for(int i = n; i >= 1; i--){
		while(b[i]>s.size())s.push(++x);//如果大小不够,就按顺序加入元素直到大小够了为止
		a[i] = s.top(); s.pop();//出栈顶
	}
	for(int i = 1; i <= n; i++)
		cout<<a[i]<<" ";
	return 0;
}

以上是关于2021牛客暑期多校训练营2,签到题CDFKI的主要内容,如果未能解决你的问题,请参考以下文章

2021牛客暑期多校训练营7,签到题FHI

2021牛客暑期多校训练营6,签到题CFHI

2021牛客暑期多校训练营10,签到题FH

2021牛客暑期多校训练营5,签到题BDHJK

2021牛客暑期多校训练营4,签到题CFIJ

2021牛客暑期多校训练营3,签到题BEFJ