[Codeforces #514] Tutorial
Link:
很简单的一场比赛打崩了也是菜得令人无话可说……
D:
一眼二分,发现对于固定的半径和点,能包含该点的圆的圆心一定在一个区间内,求出区间判断即可
此题一个重要性质就是圆与$x$轴相切,画出圆心所在直线后就能想到上述贪心了
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<db,db> P;
const db eps=1e-;
const int MAXN=1e5+;
struct Data{db l,r;int id;}a[MAXN];
int n,cnt1,cnt2;P dat[MAXN]; bool cmp(Data a,Data b)
{return a.l<b.l;}
db sqr(db x){return 1.0*x*x;}
bool cal(db r,int k)
{
db b=*dat[k].X;
db c=sqr(dat[k].X)+sqr(dat[k].Y-r)-sqr(r);
if(sqr(b)-*c<-eps) return false;
a[k].id=k;
a[k].l=(b-sqrt(sqr(b)-*c))/2.0;
a[k].r=(b+sqrt(sqr(b)-*c))/2.0;
return true;
}
bool check(db r)
{
if(cnt1) r=-r;
for(int i=;i<=n;i++)
if(!cal(r,i)) return false;
db mn=1e60,mx=-1e60;
for(int i=;i<=n;i++)
mn=min(mn,a[i].r),mx=max(mx,a[i].l);
return mx<=mn;
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%lf%lf",&dat[i].X,&dat[i].Y);
cnt1+=dat[i].Y<;cnt2+=dat[i].Y>;
}
if(n==) return printf("%.6lf",dat[].Y/2.0),;
if(cnt1&&cnt2) return puts("-1"),; //实数二分最好直接枚举次数,否则精度可能不够
// 也可以相对误差和eps比较
db l=,r=1e16;
for(int i=;i<=;i++)
{
db mid=(l+r)/2.0;
if(check(mid)) r=mid;
else l=mid;
}
printf("%.6lf",l);
return ;
}
Problem D
做的时候先想的凸包,想到正解后把一个$int$开成$double$后调不出来……
所以发现输出全是整数时要敏感啊……
注意:实数二分不用$fabs(l-r)$,会爆精度,最好卡次数
E:
可以先预处理每个点向上走的最远距离在树上$dp$,
不过其实直接从低向上贪心走就好了,在之前被走过的点就不用走了
可以并查集维护也可以直接暴力走
#include <bits/stdc++.h> using namespace std;
#define X first
#define Y second
#define pb push_back
typedef double db;
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=2e5+;
ll S,w[MAXN],pre[MAXN],res;
int n,L,f[MAXN],ufs[MAXN],vis[MAXN],dep[MAXN],out[MAXN]; int find(int x)
{return x==ufs[x]?x:find(ufs[x]);}
int main()
{
scanf("%d%d%lld",&n,&L,&S);
for(int i=;i<=n;i++) scanf("%lld",&w[i]);
for(int i=;i<=n;i++)
scanf("%d",&f[i]),out[f[i]]++;
for(int i=;i<=n;i++)
{
ufs[i]=i;
if(w[i]>S) return puts("-1"),;
}
for(int i=;i<=n;i++)
dep[i]=dep[f[i]]+,pre[i]=pre[f[i]]+w[i]; queue<int> q;
for(int i=;i<=n;i++)
if(!out[i]) q.push(i);
while(!q.empty())
{
int t=q.front();q.pop();
if(vis[t]) continue;
int cur=t;res++;
int len=;ll sum=;
while(len<=L&&sum<=S)
{
int nxt=find(cur);
len+=dep[cur]-dep[nxt]+;
sum+=pre[cur]-pre[nxt]+w[nxt];
if(len>L||sum>S) break;
vis[nxt]=;if(!f[nxt]) break; ufs[nxt]=find(f[nxt]);out[f[nxt]]--;
if(!out[f[nxt]]&&!vis[f[nxt]]) q.push(f[nxt]);
cur=f[nxt];
}
}
printf("%lld",res);
return ;
}
Problem E
以后做完签到题后把所有题先看一遍再决定顺序!
[Codeforces #514] Tutorial的更多相关文章
- Codeforces 514 D R2D2 and Droid Army(Trie树)
题目链接 大意是判断所给字符串组中是否存在与查询串仅一字符之差的字符串. 关于字符串查询的题,可以用字典树(Trie树)来解,第一次接触,做个小记.在查询时按题目要求进行查询. 代码: #define ...
- codeforces#514 Div2---1059ABCD
1059A---Cashier http://codeforces.com/contest/1059/problem/A 题意: Vasya每天工作\(l\)个小时,每天服务\(n\)个顾客,每个休息 ...
- [Codeforces #172] Tutorial
Link: Codeforces #172 传送门 A: 一眼看上去分两类就可以了 1.每个矩形只有两条边相交,重合的形状为菱形 2.每个矩形四条边都有相交 对于情况1答案为$h*h/sin(a)$ ...
- [Codeforces #210] Tutorial
Link: Codeforces #210 传送门 A: 贪心,对每个值都取最大值,不会有其他解使答案变优 #include <bits/stdc++.h> using namespace ...
- [Codeforces #196] Tutorial
Link: Codeforces #196 传送门 A: 枚举 #include <bits/stdc++.h> using namespace std; #define X first ...
- [Codeforces #174] Tutorial
Link: Codeforces #174 传送门 A: 求原根的个数,有一条性质是原根个数为$\phi(\phi(n))$,多了一个不会证的性质 如果要确定哪些是原根的话还是要枚举,不过对于每个数不 ...
- [Codeforces #190] Tutorial
Link: Codeforces #190 传送门 A: 明显答案为$n+m-1$且能构造出来 #include <bits/stdc++.h> using namespace std; ...
- [Codeforces #211] Tutorial
Link: Codeforces #211 传送门 一套非常简单的题目,但很多细节都是错了一次才能发现啊…… 还是不能养成OJ依赖症,交之前先多想想corner case!!! A: 模拟,要特判0啊 ...
- [Codeforces #192] Tutorial
Link: Codeforces #192 传送门 前两天由于食物中毒现在还要每天挂一天的水 只好晚上回来随便找套题做做找找感觉了o(╯□╰)o A: 看到直接大力模拟了 但有一个更简便的方法,复杂度 ...
随机推荐
- 03.WebView演练-iOS开发Demo(示例程序)源代码
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong //转载请注明出处--本文永久链接:h ...
- Spring Boot中使用Spring Security进行安全控制
我们在编写Web应用时,经常需要对页面做一些安全控制,比如:对于没有访问权限的用户需要转到登录表单页面.要实现访问控制的方法多种多样,可以通过Aop.拦截器实现,也可以通过框架实现(如:Apache ...
- [NOIP2003]栈 题解(卡特兰数)
[NOIP2003]栈 Description 宁宁考虑的是这样一个问题:一个操作数序列,从1,2,一直到n(图示为1到3的情况),栈A的深度大于n. 现在可以进行两种操作: 1.将一个数,从操作数序 ...
- Android SDK的安装与环境变量的配置
配置Andriod环境变量前提是要先安装好JAVA环境 1.下载Android SDK,点击安装,放在任意不含空格.特殊符号和中文的路径即可. 2.默认路径安装后,安装完成,开始配置环境变量. 3.打 ...
- MAC泛洪攻击
先来解释一下啥是泛洪攻击 交换机里有一张专门记录MAC地址的表,为了完成数据的快速转发,该表具有自动学习机制:泛洪攻击即是攻击者利用这种学习机制不断发送不同的MAC地址给交换机,充满整个MAC表,此时 ...
- 【Git/GitHub学习笔记】一键更新多个git仓库至远程
因为同时在本地维护几个Github的仓库,每次更新后每个仓库要重复三步提交同步,有点麻烦. 发现可以写.sh文件来实现一键更新. 比如我要更新我的BlogBackup和CodeRepo两个仓库的代码如 ...
- SQLite3数据库的操作
数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件. 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中. 打开数据 ...
- linux自动创建dev node
通过驱动模块的加载在/dev下创建设备文件,在驱动模块卸载时又自动的删除在/dev下创建的设备文件非常方便.而这个过程就是通过device_create()和device_destroy()内核函数完 ...
- 64_r2
ruby-gnomecanvas2-0.90.4-7.fc26.3.x86_64.rpm 13-Feb-2017 08:00 75794 ruby-gnomecanvas2-devel-0.90.4- ...
- React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?
〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...