cf gym 101124
Posted yeah17981
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf gym 101124相关的知识,希望对你有一定的参考价值。
和新队友的第一次训练
体验良好
debug到头秃
好困啊靠
给一个四边形相框的宽度和边框内侧四条边+对角线AD的程度,求外侧周长
如图,对四个点做垂线(因为懒所以只挑了两个角来做),将总长度分为a+b+c+d+八个小三角形的底边,同一个角上的两个小三角形的高和斜边相同,所以全等,所以角平分。因为平行关系,所以内框和外框的角相等。即小三角形的底边长=h/(tan(内角大小/2))
内角大小根据余弦定理后求反余弦函数得到,分成两部分的内角的大小可以调用两次余弦定理后反函数的和求得。
#include<bits/stdc++.h>
using namespace std;
double get1(double a,double b,double c)
{
return acos((b*b+c*c-a*a)/(b*c*2));
}
double get2(double a,double w)
{
return w*2/tan(a/2);
}
int main()
{
double w,a,b,c,d,e;
cin>>w>>a>>b>>c>>d>>e;
printf("%.3lf\\n",a+b+c+d+get2(get1(b,a,e)+get1(c,d,e),w)+get2(get1(a,b,e)+get1(d,c,e),w)+get2(get1(e,a,b),w)+get2(get1(e,c,d),w));
}
每张桌上有一上一下两张牌,每次移动都去找与当前桌子朝下的牌数字相同的朝上的牌,已知初始位置,求某个瞬间的位置
预处理每一个环(o(n)),在预处理每个初始位置在环中的id(o(n))
查询的时候用(id+time)%长度,然后在环中找到这个id对应的位置
#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 100010;
pii desk[N];
bool vis[N];
vector<int> g[N];//环
int h[N];
int gcnt;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n, k;
cin >> n >> k;
unordered_map<int, int> mp;
for(int i = 1; i <= n; i++)
{
int up, down;
cin >> up >> down;
desk[i] = {up, down};
mp.insert({up, i});
}
unordered_map<int, int> dtog; // 用桌号得有环图编号(圈)
for(int i = 1; i <= n; i++)
{
if(!vis[i]) // 开始构建有环图
{
vis[i] = true;
g[++gcnt].push_back(i);
dtog[i] = gcnt;
int start = desk[i].first, curDown = desk[i].second;
do{
int nextDesk = -1;
if(mp.find(curDown) != mp.end()) nextDesk = mp[curDown];
if(nextDesk != -1 && nextDesk != i)
{
g[gcnt].push_back(nextDesk);
dtog[nextDesk] = gcnt;
curDown = desk[nextDesk].second;
vis[nextDesk] = true;
}
else break;
}while(1);
}
}
for(int i=1;i<=gcnt;i++)
{
for(int j=0;j<g[i].size();j++)
{
int y=g[i][j];
h[y]=j;
//cout<<y<<" ";
}
//cout<<endl;
}
while(k--)
{
ll dn, time;
cin >> dn >> time;
int gn = dtog[dn];
int startPos = 0;
startPos = h[dn];
time += (ll)startPos;
time %= g[gn].size();
//y=
//cout <<startPos<<" "<< g[gn].size()<<" time = " << time << " ans = " << g[gn][time] << endl;
cout << g[gn][time] <<endl;
}
//system("pause");
}
两个b,轮流操作n(n初始值为1),每次可以在n上乘2-9,问谁赢
找规律,以18的次方分割
#include <iostream>
#include <iomanip>
#include <cstring>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
int main()
{
double n;
while(cin >> n)
{
while(n>18)
{
n=n/18;
}
if(n<=9)
{
cout<<"Stan wins.\\n";
}
else
{
cout<<"Ollie wins.\\n";
}
}
return 0;
}
以上是关于cf gym 101124的主要内容,如果未能解决你的问题,请参考以下文章
cf gym 100960 G. Youngling Tournament set+树状数组
CF Gym 102059E Electronic Circuit (set存图删点)