HGOI20191115 模拟赛 题解
Problem A 表演
有$n$个有点权的点,$m$个有边权的边。对于每个点$u$,输出从这个点出发到$v$,其路径权值的两倍加上v的点权和最小的值。
对于$100\%$的数据,满足$1 \leq n,m \leq 2\times 10^5 $
Solution :
考虑一个简单的转移,$f[u]$表示点$u$的最小答案,最初$f[u]$ 为$u$的点权。
每一次更新,就是相邻的两个点$u,v$之间,用边权的两倍来更新答案。
如果在图上DP,那么就相当于,将初始这些点权加入priority_queue,跑最短路即可。
时间复杂度为$O(m log_2 n)$
# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=2e5+;
struct rec{ int pre,to,w;}a[N<<];
int n,m,tot;
bool inq[N];
int head[N],d[N],val[N];
namespace Fast_IO {
inline int read() {
int x=,w=; char c=;
while (c<''||c>'') w|=c=='-',c=getchar();
while (c>='' && c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return w?-x:x;
}
void write(int x) {
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(''+x%);
}
void writeln(int x) {
write(x); putchar('\n');
}
};
using namespace Fast_IO;
void adde(int u,int v,int w) {
a[++tot].pre=head[u];
a[tot].to=v;
a[tot].w=w*;
head[u]=tot;
}
struct Node {
int id,val;
};
struct cmp {
bool operator () (Node a,Node b) {
return a.val > b.val;
}
};
priority_queue<Node,vector<Node>,cmp>q;
void dijkstra() {
for (int i=;i<=n;i++) {
d[i]=val[i];
inq[i]=true;
q.push((Node){i,val[i]});
}
while (q.size()) {
int u=q.top().id; q.pop(); inq[u]=false;
for (int i=head[u];i;i=a[i].pre) {
int v=a[i].to;
if (d[v]>d[u]+a[i].w) {
d[v]=d[u]+a[i].w;
if (!inq[v]) q.push((Node){v,d[v]});
}
}
}
}
signed main() {
n=read();m=read();
for (int i=;i<=m;i++) {
int u=read(),v=read(),w=read();
adde(u,v,w); adde(v,u,w);
}
for (int i=;i<=n;i++) val[i]=read();
dijkstra();
for (int i=;i<n;i++) write(d[i]),putchar(' ');
writeln(d[n]);
return ;
}
exciting.cpp
Problem B 逮虾户
要求的车速是一个大于等于0的值,设第$i$次估计的车速为$v_i$,走的路程为$s_i$,
设$v'$表示真实速度,则有偏差值$d$的定义式为 $d = v' - v_i$。
考虑对速度的估计的偏差值d每一次都恒定。
给出$n$次测算的结果$s_i , v_i$,和这几次测试总共的用时$t$,输出$d$的值。
对于$100\%$的数据满足$1 \leq n\leq 10^3,1 \leq s_i \leq 10^3 , |v_i| \leq 10^3$
Solution :
考虑$t$这个函数是在$n+1$段不连续的定义域中单调减的。
所以,我们可以做$n+1$二分,就能找到些定义域中和d最相近的。
、 注意,最后统计答案的时候,需要check一下实际车速大于等于0.
时间复杂度为$O(n ^2 log_2 S)$,其中$S$表示确定实数域大小。
# include <bits/stdc++.h>
using namespace std;
const int N=1e3+;
const double eps = 1e-;
struct rec{double s,v;}a[N];
int n,t;
vector<double>ans;
bool cmp (rec x, rec y) {
return x.v>y.v;
}
double f (double x) {
double res = ;
for (int i=;i<=n;i++) res += (double)a[i].s/(double)(x+a[i].v);
return res;
}
double work(double l,double r) {
while (fabs(r-l)>=eps) {
double mid = (l+r)/2.0;
if (f(mid)<=t) r=mid;
else l=mid;
}
return l;
}
double calc(double x) {
return fabs(f(x)-t);
}
int main() {
scanf("%d%d",&n,&t);
for (int i=;i<=n;i++) scanf("%lf%lf",&a[i].s,&a[i].v);
sort(a+,a++n,cmp);
double l=-1e9;
for (int i=;i<=n;i++) {
ans.push_back(work(l,-a[i].v-eps));
l=-a[i].v+eps;
}
ans.push_back(work(l,1e9));
double res = ans[], delta =calc(ans[]);
for (int i=;i<ans.size();i++) {
bool ok = true;
for (int j=;j<=n;j++) if (a[j].v+ans[i]<eps) {
ok = false; break;
}
if (!ok) continue;
double tmp = calc(ans[i]);
if (tmp <= delta) {
res = ans[i]; delta = tmp;
}
}
printf("%.10lf\n",res);
return ;
}
dejavu.cpp
Problem C 跳一跳
如果序列中任意相邻两个元素,都是极值点,其中一个是极大值点,另外一个极小值点。
那么这个序列叫做波浪序列。
给出对于长度为$n$序列,输出最长波浪序列的长度。
对于$100\%$的数据满足 $1 \leq n \leq 10^5 , 1 \leq a_i \leq 10^9 $
Solution :
由于元素只进行比较,所以我们可以将其离散化。
设$f[i][0]$表示第$i$个元素作为极小点为结尾的最长波浪序列长度,$f[i][1]$表示第$i$个元素作为极大点为结尾的最长波浪序列长度。
转移方程为:$f[i][0] = max(f[j][1] + 1) (a_i < a_j) , f[i][1] = max (f[j][0] + 1) (a_i > a_j)$
可以用值域线段树来维护这个$DP$。时间复杂度为$O(n log_2 n)$
# include <bits/stdc++.h>
using namespace std;
const int N=1e5+;
int a[N],n,f[N][];
vector<int>tmp;
namespace Fast_IO {
inline int read() {
int x=,w=; char c=;
while (c<''||c>'') w|=c=='-',c=getchar();
while (c>='' && c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return w?-x:x;
}
void write(int x) {
if (x<) x=-x,putchar('-');
if (x>) write(x/);
putchar(''+x%);
}
void writeln(int x) {
write(x); putchar('\n');
}
};
using namespace Fast_IO;
struct Segment_Tree {
int tr[N<<];
# define ls (x<<)
# define rs (x<<|)
# define mid (l+r>>)
# define lson ls,l,mid
# define rson rs,mid+,r
void update(int x,int l,int r,int pos,int opx) {
if (l==r) {
tr[x]=max(tr[x],opx);
return;
}
if (pos<=mid) update(lson,pos,opx);
else update(rson,pos,opx);
tr[x]=max(tr[ls],tr[rs]);
}
int query(int x,int l,int r,int opl,int opr) {
if (opl<=l && r<=opr) return tr[x];
int ret=;
if (opl<=mid) ret=max(ret,query(lson,opl,opr));
if (opr>mid) ret=max(ret,query(rson,opl,opr));
return ret;
}
}tr0,tr1;
int main() { n=read();
for (int i=;i<=n;i++) {
tmp.push_back(a[i]=read());
}
sort(tmp.begin(),tmp.end());
tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
int m = tmp.size();
for (int i=;i<=n;i++) {
a[i]=lower_bound(tmp.begin(),tmp.end(),a[i])-tmp.begin()+;
}
int ans = ;
for (int i=;i<=n;i++) {
f[i][]=f[i][]=;
if (a[i]->=) f[i][] = max(f[i][],tr0.query(,,m,,a[i]-)+);
if (a[i]+<=m) f[i][] = max(f[i][],tr1.query(,,m,a[i]+,m)+);
ans = max(ans,max(f[i][],f[i][]));
tr0.update(,,m,a[i],f[i][]);
tr1.update(,,m,a[i],f[i][]);
}
writeln(ans);
return ;
}
jump.cpp
HGOI20191115 模拟赛 题解的更多相关文章
- NOIP第7场模拟赛题解
NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 20220303模拟赛题解and总结
目录 总结 A.不幸的7 B.选举 C. 差的绝对值之和 D. 路径通过 总结 初一第一 一般,最后一题没打好 不难发现,教练出水了,可能是信心赛 A.不幸的7 暴力,没有逻辑可言 #include& ...
- 【洛谷】xht模拟赛 题解
前言 大家期待已久并没有的题解终于来啦~ 这次的T1和HAOI2016撞题了...深表歉意...表示自己真的不知情... 天下的水题总是水得相似,神题各有各的神法.--<安娜·卡列妮娜> ...
- PKUSC 模拟赛 题解_UPD
之前挖了两个大坑 一个是day1下午的第二题 另一个是day2上午的第五题 先说day1下午的第二题吧 我们显然不能O(n^2)的dp,所以我们只能算贡献 首先对于任意一个边界点而言,他对答案的贡献路 ...
- 10.6-10.7 牛客网NOIP模拟赛题解
留个坑... upd:估计这个坑补不了了 如果还补不了就删了吧
- 2019 蓝桥杯国赛 B 组模拟赛 题解
标签 ok #include<bits/stdc++.h> using namespace std; /* 求阶乘 去除尾部0 每次求阶乘时:结果去除尾0,并对 1e6取余 */ type ...
- 『7.5 NOIP模拟赛题解』
T1 Gift Description 人生赢家老王在网上认识了一个妹纸,然后妹纸的生日到了,为了表示自己的心 意,他决定送她礼物.可是她喜爱的东西特别多,然而他的钱数有限,因此他想 知道当他花一 ...
- 『7.3 NOIP模拟赛题解』
T1 gift Description 夏川的生日就要到了.作为夏川形式上的男朋友,季堂打算给夏川买一些生日礼物. 商店里一共有种礼物.夏川每得到一种礼物,就会获得相应喜悦值Wi(每种礼物的喜 ...
随机推荐
- kubernetes 水平伸缩及yaml格式编写
Replication Controller:用来部署.升级PodReplica Set:下一代的Replication ControllerDeployment:可以更加方便的管理Pod和Repli ...
- 消息服务百科全书——Kafka基本原理介绍
架构 1.1 总体架构 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理. 为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息. 一 ...
- Windows 证书签名的伪造
Windows 系统中的一些非常重要文件通常会被添加数字签名,其目的是用来防止被篡改,能确保用户通过互联网下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性.保护了用户不会被病毒.恶意 ...
- 深度学习之卷积神经网络CNN及tensorflow代码实现示例
深度学习之卷积神经网络CNN及tensorflow代码实现示例 2017年05月01日 13:28:21 cxmscb 阅读数 151413更多 分类专栏: 机器学习 深度学习 机器学习 版权声明 ...
- LASSO回归与L1正则化 西瓜书
LASSO回归与L1正则化 西瓜书 2018年04月23日 19:29:57 BIT_666 阅读数 2968更多 分类专栏: 机器学习 机器学习数学原理 西瓜书 版权声明:本文为博主原创文章,遵 ...
- oracle学习笔记03
一:表空间 /* 创建表空间:逻辑单位,通常我们新建一个项目,就会去创建表空间,在表空间中创建用户,用户去创建表. 语法:create tablespace 表空间名字 datafile '文件的路径 ...
- UPX编译及so加固
UPX编译及so加固 来源 https://www.cnblogs.com/Reverser/p/5778042.html 参考 http://www.cnblogs.com/fishou/p/420 ...
- Python的global指令的作用
Python的global指令的作用 学过其他常用编程语言的同学一定清楚,Python是一个语法非常宽容的语言.它是个变量的定义可以省略.直接赋值.根据赋值结果自动确定变量类型的弱类型语言. 但是这样 ...
- ORACLE和SQL查询库数据量
ORACLE根据账号查询每张表数据量: select t.table_name,t.num_rows from user_tables t ORDER BY NUM_ROWS DESC; SQL SE ...
- 十九,基于helm搭建EFK日志收集系统
目录 EFK日志系统 一,EFK日志系统简介: 二,EFK系统部署 1,EFK系统部署方式 2,基于Helm方式部署EFK EFK日志系统 一,EFK日志系统简介: 关于系统日志收集处理方案,其实有很 ...