2021牛客暑期多校训练营2
文章目录
C:Draw_Grids
解释
不能形成环,只能形成树,所以有nm个点,那就能连nm-1边。
代码
int n,m; cin>>n>>m;
int ans = n*m - 1;
cout<<(ans % 2 ? "YES": "NO")<<endl;
D:Er_Ba_Game
解释
注意细节
代码
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
string s[3] = {"first","second","tie"};
signed main(){
int tt; cin>>tt;
while(tt --){
int a1,b1,a2,b2; cin>>a1>>b1>>a2>>b2;
if(a1 > b1) swap(a1,b1);
if(a2 > b2) swap(a2,b2);
if(a1 == 2 && b1 == 8){
if(a2 == 2 && b2 == 8) cout<<s[2]<<endl;
else cout<<s[0]<<endl;
}else if(a2 == 2 && b2 == 8){
if(a1 == 2 && b1 == 8) cout<<s[2]<<endl;
else cout<<s[1]<<endl;
}else if((a1 == b1 && a2 != b2) || (a2 == b2 && a1 != b1)){
if(a1 == b1) cout<<s[0]<<endl;
else cout<<s[1]<<endl;
}else if(a1 == b1 && a2 == b2){
if(a1 > a2) cout<<s[0]<<endl;
else if(a2 > a1) cout<<s[1]<<endl;
else cout<<s[2]<<endl;
}else if(a1 != b1 && a2 != b2){
if((a1 + b1) % 10 > (a2 + b2) % 10) cout<<s[0]<<endl;
else if((a1 + b1) % 10 < (a2 + b2) % 10) cout<<s[1]<<endl;
else{
if(b1 > b2) cout<<s[0]<<endl;
else if(b1 < b2) cout<<s[1]<<endl;
else cout<<s[2]<<endl;
}
}
}
return 0;
}
F:Girlfriend
解释
不会阿氏圆就硬推圆心和半径,要知道球冠,球缺,之后就是两个球体积交的板子来源
代码
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
const int mod = 1e9 + 7;
const double PI = acos(-1.0);
struct point {
double x, y, z;
point() {} // 构造函数
point(double a, double b, double c) :x(a), y(b), z(c) {}
void in() { cin >> x >> y >> z; }
};
inline point operator+(point a, point b) { return point(a.x + b.x, a.y + b.y, a.z + b.z); }
inline point operator-(point a, point b) { return point(a.x - b.x, a.y - b.y, a.z - b.z); }
inline point operator*(double k, point a){ return point(a.x * k, a.y * k, a.z * k); } // 常数 k 乘以一个向量or点
inline double distance(point a) { return sqrt(a.x * a.x + a.y * a.y + a.z * a.z); } // 点到原点的距离 distance(A-B)即是AB的距离
//用阿圆 得出球体的球心 和半径 AP/BP=k 传出O球心坐标 和R半径
//void getsphere(point A, point B,double k, point& O, double& R){
// O = B + 1/ (k * k - 1)*(B-A);
// R = k / (k * k - 1) * distance(A-B);
//}
#define Squ(x) ((x) * (x))
void getsphere(point a, point b,double k, point& O, double& R){
k *= k;
double down = 1 - k;
double A = 2 * (k*b.x-a.x) / down;
double B = 2 * (k*b.y-a.y) / down;
double C = 2 * (k*b.z-a.z) / down;
double D = (Squ(a.x)-k*Squ(b.x) + Squ(a.y)-k*Squ(b.y) + Squ(a.z)-k*Squ(b.z)) / down;
O = {-A/2,-B/2,-C/2};
R = sqrt((Squ(A)+Squ(B)+Squ(C)-4*D)/4.0);
}
// R是球的半径 H是球缺的高度
double Spherical_Cap(double R, double H){
return PI * H * H * (R - H / 3.0);
}
// curved surface of spherical cap 球冠
double Cureer_Surface_Of_Spherical_Cap(double R, double H){
return 2 * PI * R * H;
}
// 计算重叠球体体积大小
double Overlapping_volume_sphere(point A, double R1, point B, double R2) {
double d = distance(A - B);
if(d > R1 + R2) return 0;
else if(d < fabs(R1 - R2)) {
if(R1 < R2) swap(R1, R2);
return R2*4.0/3 * PI * R2 * R2;
}
else{
double h1 = R1 - (R1 * R1 + d * d - R2 * R2) / (2 * R1 * d) * R1; // 用余弦定理来算
double h2 = R2 - (R2 * R2 + d * d - R1 * R1) / (2 * R2 * d) * R2;
return Spherical_Cap(R1, h1) + Spherical_Cap(R2, h2);
}
}
signed main(){
IOS
int tt; cin>>tt;
while(tt --) {
point A, B, C, D;
A.in(), B.in(), C.in(), D.in();
double k1, k2; cin >> k1 >> k2;
point O1, O2;
double R1, R2;
getsphere(A, B, k1, O1, R1);
getsphere(C, D, k2, O2, R2);
double p = Overlapping_volume_sphere(O1, R1, O2, R2);
cout << fixed << setprecision(3) << p << endl;
}
return 0;
}
G:League_of_Legends*
解释
代码
I:Penguins
解释
跑BFS,注意细节,没一个格子标记是要记录它是从哪个方向来的,边界或则障碍物都不前进。
代码
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
const int N = 20 + 10;
const int mod = 1e9 + 7;
const double eps = 1e-9;
#define int long long
int dx[] = {1,0,0,-1};
int dy[] = {0,-1,1,0};
char dir[] = {'D','L','R','U'};
bool book[N][N][N][N][4];
string mpa[N],mpb[N];
struct Node{
int x1,y1,x2,y2;
string s;
};
string ans = "";
queue<Node> qe;
void bfs(){
qe.push({20,20,20,1,""});
while(!qe.empty()){
Node t = qe.front();qe.pop();
if(t.x1 == 1 && t.y1 == 20 && t.x2 == 1 && t.y2 == 1){
ans = t.s;
break;
}
for(int i=0;i<4;i++){
int x1 = dx[i] + t.x1;
int y1 = dy[i] + t.y1;
int x2 = dx[i] + t.x2;
int y2 = dy[i] + t.y2;
if(i == 1 || i == 2){
x2 = dx[3-i] + t.x2;
y2 = dy[3-i] + t.y2;
}
if(x1 <= 0 || x1 > 20 || y1 <= 0 || y1 > 20 || mpa[x1-1][y1-1] == '#') x1 = t.x1,y1 = t.y1;
if(x2 <= 0 || x2 > 20 || y2 <= 0 || y2 > 20 || mpb[x2-1][y2-1] == '#') x2 = t.x2,y2 = t.y2;
if(book[x1][y1][x2][y2][i]) continue;
book[x1][y1][x2][y2][i] = true;
if(x1 != t.x1 || x2 != t.x2 || y1 != t.y1 || y2 != t.y2){
qe.push({x1,y1,x2,y2,t.s+dir[i]});
}
}
}
}
void slove(){
int x1 = 20,y1 =20,x2 = 20,y2 = 1;
mpa[x1-1][y1-1] = 'A',mpb[x2-1][y2-1] = 'A';
for(int i=0;i<(int)ans.size();i++){
char ch = ans[i];
int k = 0;
if(ch == 'D') k = 0;
else if(ch == 'L') k = 1;
else if(ch == 'R') k = 2;
else k = 3;
int xx1 = dx[k] + x1;
int yy1 = dy[k] + y1;
int xx2 = dx[k] + x2;
int yy2 = dy[k] + y2;
if(k == 1 || k == 2){
xx2 = dx[3-k] + x2;
yy2 = dy[3-k] + y2;
}
if(xx1 <= 0 || xx1 > 20 || yy1 <= 0 || yy1 > 20 || mpa[xx1-1][yy1-1] == '#') xx1 = x1,yy1 = y1;
if(xx2 <= 0 || xx2 > 20 || yy2 <= 0 || yy2 > 20 || mpb[xx2-1][yy2-1] == '#') xx2 = x2,yy2 = y2;
if(xx1 != x1 || yy1 != y1) mpa[xx1-1][yy1-1] = 'A';
if(xx2 != x2 || yy2 != y2) mpb[xx2-1][yy2-1] = 'A';
x1 = xx1,y1 = yy1;
x2 = xx2,y2 = yy2;
}
}
signed main(){
for(int i=0;i<20;i++) cin>>mpa[i]>>mpb[i];
bfs();
cout<<(int)ans.size()<<endl;
cout<<ans<<endl;
slove();
for(int i=0;i<20;i++) cout<<mpa[i]<<" "<<mpb[i]<<endl;
return 0;
}
K:Stack
解释
代码
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 10;
int n,m;
int cnt[N],ne[N],ans[N],d[N];
bool plas = true;
void top_sort(){
queue<int> qe;
vector<int> ve;
for(int i=1;i<=n;i++) if(!d[i]) qe.push(i);
while(!qe.empty()){
int t = qe.front();qe.pop();
ve.push_back(t);
int j = ne[t];
if(--d[j] == 0) qe.push(j);
}
for(int i=0,j=n;i<n;i++,j--) ans[ve[i]] = j;
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
cout<<endl;
}
signed main(){
IOS
cin>>n>>m;
for(int i=1;i<=n;i++){
int a,b; cin>>a>>b;
cnt[a] = b;
if(b > a) plas = false;
}
if(!plas){
cout<<-1<<endl;
return 0;
}
stack<int> stk;
stk.push(1);
for(int i=2;i<=n;i++){
if((int)stk.size() > cnt[i]-1 && cnt[i]){
int last = 0;
while((int)stk.size() > cnt[i]-1){
last = stk.top();
stk.pop();
}
ne[last] = i;
d[i] ++;
if((int)stk.size()) d[stk.top()] --;
}
if((int)stk.size()) ne[i] = stk.top(),d[stk.top()] ++;
stk.push(i);
}
top_sort();
return 0;
}