CSP模拟赛 Lost My Music(二分,可回退化栈)
题面

题解
发现是斜率的形式,答案的相反数可以看做一条直线的斜率。那么我们要答案最小,斜率最大。维护下凸壳就行了。
考试时写了直接dfsdfsdfs+暴力弹栈拿了808080分(还以为自己是O(n)正解美滋滋)
就是直接存下根到当前点的路径上的凸包,然后回退的时候撤销操作。但这样一个点可能在子树下面被弹出多次。所以最坏情况是O(n2)O(n^2)O(n2)的(链+菊花)。
考虑怎么实现可回退化栈。可以写倍增(我不会),但是发现可以在凸包上二分到该插入的位置,然后直接存一下被删除的第一个点,然后直接把那个位置设为当前点。回退的时候修改回来就行了。这样每次只改一个点。但是由于要二分,还是O(nlogn)O(n\log n)O(nlogn)的。
CODE
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline void read(int &x) {
char ch; while(!isdigit(ch=getchar()));
for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
}
const int MAXN = 500005;
int n, x[MAXN], y[MAXN], fa[MAXN], fir[MAXN], to[MAXN], nxt[MAXN], cnt;
inline void link(int u, int v) { to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt; }
int q[MAXN];
double ans[MAXN];
inline LL Cross(LL a, LL b, LL c, LL d) { return a*d - b*c; }
int find(int i, int r) {
int l = 2, mid, re = r+1;
while(l <= r) {
mid = (l + r) >> 1;
if(Cross(x[i]-x[q[mid-1]], y[i]-y[q[mid-1]], x[i]-x[q[mid]], y[i]-y[q[mid]]) <= 0) re = mid, r = mid-1;
else l = mid+1;
}
ans[i] = (double)(y[q[re-1]]-y[i]) / (double)(x[i]-x[q[re-1]]);
return re;
}
void dfs(int u, int now) {
x[u] = x[fa[u]] + 1;
int pos = now ? find(u, now) : 1, id = q[pos];
q[pos] = u;
for(int i = fir[u]; i; i = nxt[i])
dfs(to[i], pos);
q[pos] = id;
}
int main () {
freopen("lost.in", "r", stdin);
freopen("lost.out", "w", stdout);
read(n);
for(int i = 1; i <= n; ++i) read(y[i]);
for(int i = 2; i <= n; ++i) read(fa[i]), link(fa[i], i);
dfs(1, 0);
for(int i = 2; i <= n; ++i) printf("%.10f\n", ans[i]);
}
CSP模拟赛 Lost My Music(二分,可回退化栈)的更多相关文章
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【CSP模拟赛】奇怪的队列(树状数组 &二分&贪心)
题目描述 nodgd的粉丝太多了,每天都会有很多人排队要签名. 今天有n个人排队,每个人的身高都是一个整数,且互不相同.很不巧,nodgd今天去忙别的事情去了,就只好让这些粉丝们明天再来.同时nod ...
- CSP模拟赛 number (二分+数位DP)
题面 给定整数m,km,km,k,求出最小和最大的正整数 nnn 使得 n+1,n+2,-,2nn+1,n+2,-,2nn+1,n+2,-,2n 中恰好有 mmm 个数 在二进制下恰好有 kkk 个 ...
- 【csp模拟赛4】 珠江夜游 (cruise.cpp)-二分,贪心
Problem 1 珠江夜游 (cruise.cpp) [题目描述] 小 Z 放假后难得来一趟广州游玩,当然要吃遍广州各路美食小吃然后再 到珠江新城看看远近闻名的小蛮腰啦!可当小 Z 一路吃吃吃以后, ...
- 【CSP模拟赛】Freda的旗帜
题目描述 要开运动会了,Freda承担起了制作全校旗帜的工作.旗帜的制作方法是这样的:Freda一共有C种颜色的布条,每种布条都有无数个,你可以认为这些布条的长.宽.厚都相等,只有颜色可能不同.每个 ...
- 【CSP模拟赛】Freda的迷宫(桥)
题目描述 Freda是一个迷宫爱好者,她利用业余时间建造了许多迷宫.每个迷宫都是由若干房间和走廊构成的,每条走廊都连接着两个不同的房间,两个房间之间最多只有一条走廊直接相连,走廊都是双向通过. 黄昏 ...
- 【CSP模拟赛】starway(玄学建边 最小生成树)
问題描述 小w伤心的走上了 Star way to heaven. 到天堂的道路是一个笛卡尔坐标系上一个n×m的长方形通道(顶点在(0,0))和(n,m)),小w从最左边任意一点进入,从右边任意一 ...
- HGOI20191114 CSP模拟赛 反思
Problem A 宇宙魔方 有一个$N \times N \times N$的魔方,每一次操作可以整体转动该魔方,也可以对于一层整体+X. 给出最后魔方的最终状态,其中有一个位置为-1.利用其它位置 ...
- 2019/11/12 CSP模拟赛&&考前小总结
写在前面的总结 离联赛只有几天了,也马上就要回归文化课了. 有点舍不得,感觉自己的水平刚刚有点起色,却又要被抓回文化课教室了,真想在机房再赖几天啊. 像19/11/11那场的简单题,自己还是能敲出一些 ...
随机推荐
- 八皇后问题——列出所有的解,可推至N皇后
<数据结构>--邓俊辉版本 读书笔记 今天学习了回溯法,有两道习题,一道N皇后,一道迷宫寻径.今天,先解决N皇后问题.由于笔者 擅长java,所以用java重现了八皇后问题. 注意是jav ...
- ACM集训
2019-07-18 09:06:10 emmm.... 昨天5个小时做了一道题,心情复杂,不着急慢慢来 Ivan recently bought a detective book. The book ...
- 《C++语言程序设计》初学者必备教材
很多刚开始学习C++语言的同学,都会遇到一个问题:很多教材都不适合零基础的初学者.它们有的枯燥乏味,让人难以消化吸收,有的层次结构混乱,很难理清楚知识点,有的更是难度太大,没有代码的过渡,就开始讲解算 ...
- 解决找不到mkfs.ubifs命令
解决找不到mkfs.ubifs命令 ubuntu 版本:14.04 sudo apt-get update sudo apt-get install mtd-utils sudo apt-get in ...
- Ubuntu下添加定时任务执行php文件
//添加自动下载定时任务1. vim /etc/crontab2. 添加 #每5分钟执行一次*/5 * * * * root /usr/bin/php /home/wwwroot/123.php3. ...
- FaceBook CVPR2014: DeepFace解读
DeepFace是Facebook在2014年的CVPR上提出来的,后续出现的DeepID和FaceNet也都体现DeepFace的身影,可以说DeepFace是CNN在人脸识别的奠基之作,目前深 ...
- iOS - 回顾总结Runtime原理及使用
runtime简介 因为Objc是一门动态语言,所以它总是想办法把一些决定工作从编译连接推迟到运行时.也就是说只有编译器是不够的,还需要一个运行时系统 (runtime system) 来执行编译后的 ...
- navigator(浏览器对象)Screen对象(屏幕)
浅谈navigator对象: 注意:不是所有浏览器都支持 .cookieEnabled 判断是否启用了cookie 在客户端硬盘持久保存用户私密数据的小文件 .plugins 浏览器安装的所有插件 ...
- 通过DB13备份SystemDB
配置systemdb capital user name:SYSTEM save -back Save 现在可以通过DB13备份SystemDB Done. Congratulations!
- SAP云平台上的ABAP编程环境里如何消费第三方服务
在ABAP On-Premises环境下,使用ABAP编程消费第三方服务,相信很多ABAP顾问都已经非常熟悉了,无非就是使用CL_HTTP_CLIENT或者CL_REST_HTTP_CLIENT来发送 ...