HGOI20181031 模拟题解

sol:第一题就DP?!然后写了O(n^2) dp再考虑优化!!!(尽量部分分带上!!!)
我写了正确的dp然后优化错了,具体的dp方法是考虑到对于右侧到左侧他是没有后效性的
所以定义f[i]为i及以后最大的代价和,对于合法的j,转移f[i]=max{f[j]+P[i]},j需要满足a[i]+x[i]<a[j],j>=i
由于给出的a[i]递增然后我只要往i的右侧找到第一个合法的j然后转移就行了,复杂度O(n log n)
我错在了用堆来优化,然后把后面的删掉了,其实可以再前面的从被误删的东西转移而来。
code:
# include <bits/stdc++.h>
# ifdef O_2
# pragma GCC optimze()
# endif
# define int long long
using namespace std;
const int MAXN=1e5+;
int f[MAXN],a[MAXN],x[MAXN],p[MAXN];
int n;
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;
}
inline void write(int x)
{
if (x<) { x=-x;putchar('-');}
if (x>) write(x/);
putchar(''+x%);
}
inline void writeln(int x) { write(x);putchar('\n');}
signed main()
{
n=read();
for (int i=;i<=n;i++)
a[i]=read(),p[i]=read(),x[i]=read();
f[n]=p[n];
for (int i=n-;i>=;i--) {
f[i]=f[i+];
int j=upper_bound(a+i+,a++n,a[i]+x[i])-a;
f[i]=max(max(f[i],p[i]),f[j]+p[i]);
}
writeln(f[]);
return ;
}

sol:这道题目对于100%的数据n,m<=3000,显然发现这一定是O(n2)的算法,
然后如果对于X1到X2的最短路径设为R1,X3到X4最短路劲R2,要求R1和R2交的尽可能多,那么这个解一定更优
首先一定要在最短路上,其次要求R1和R2尽可能交的更多,我们不妨设刚开始交的地方设为i,交结束的地方设为j

我们先求出X1,X2,X3,X4到各点的最短路D1,D2,D3,D4
我们枚举i然后再枚举j 由上图可以看出就是D1[i]+D2[j]+D3[i]+D4[j]+dist(i,j)在枚举j之前我们可以O(n)求出i的最短路D5
那么就是最小化D1[i]+D2[j]+D3[i]+D4[j]+D5[j],
然后我们交换(X1,X2)or (X3,X4) 之中的任意一对然后再求min,就是D1[i]+D2[j]+D3[j]+D4[i]+D5[j],
然后对于每一次枚举Ans=Min(D1[i]+D2[j]+D3[i]+D4[j]+D5[j],D1[i]+D2[j]+D3[j]+D4[i]+D5[j],ans)
对于一个显然的情况我们最后特判就是直接 X1走到X2,X3 走到 X4 最短路虽然并没有重复的路 即 ans=Min(ans,D1[X2]+D3[X4]);
code:
# include <bits/stdc++.h>
# ifdef O_2
# pragma GCC optimze()
# endif
using namespace std;
const int MAXN=;
int n,m,X1,X2,X3,X4;
int D1[MAXN],D2[MAXN],D3[MAXN],D4[MAXN],D5[MAXN];
int tot=,head[MAXN];
bool vis[MAXN];
struct rec{ int pre,to,w;}a[MAXN*];
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;
}
inline void write(int x)
{
if (x<) { x=-x;putchar('-');}
if (x>) write(x/);
putchar(''+x%);
}
inline void writeln(int x) { write(x);putchar('\n');}
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,dist;};
int d[MAXN];
queue<node>q;
void bfs(int s)
{
memset(vis,false,sizeof(vis));
memset(d,0x3f,sizeof(d));
d[s]=; vis[s]=;
q.push((node){s,});
while (!q.empty()) {
node u=q.front();q.pop();
for (int i=head[u.id];i;i=a[i].pre) {
int v=a[i].to;
if (vis[v]) continue;
vis[v]=;
d[v]=u.dist+;
q.push((node){v,d[v]});
}
}
}
int Min(int a,int b,int c)
{
if (b<a) a=b;
if (c<a) a=c;
return a;
}
int main()
{
n=read();m=read();
X1=read();X2=read();X3=read();X4=read();
int u,v;
for (int i=;i<=m;i++) {
u=read();v=read();
adde(u,v,); adde(v,u,);
}
bfs(X1); memcpy(D1,d,sizeof(d));
bfs(X2); memcpy(D2,d,sizeof(d));
bfs(X3); memcpy(D3,d,sizeof(d));
bfs(X4); memcpy(D4,d,sizeof(d));
int ans=m;
for (int i=;i<=n;i++) {
bfs(i); memcpy(D5,d,sizeof(d));
for (int j=;j<=n;j++)
ans=Min(ans,D1[i]+D3[i]+D2[j]+D4[j]+D5[j],D1[i]+D4[i]+D3[j]+D2[j]+D5[j]);
}
ans=min(ans,D1[X2]+D3[X4]);
writeln(ans);
return ;
}
HGOI20181031 模拟题解的更多相关文章
- HGOI20181029模拟题解
HGOI20181029模拟题解 /* sxn让我一定要谴责一下出题人和他的数据! */ problem: 给出十进制数a,b,然后令(R)10=(a)10*(b)10,给出c表示一个k进制数(1&l ...
- 【 P3952】 时间复杂度 大模拟题解
题目链接 完全模拟 1.模拟结果 当我们的模拟程序执行结束时,直接执行模拟结果函数,用于比对我们的结果和数据给出的结果. bool yes(char a[],char b[]) { ;i<=;+ ...
- HGOI20181030 模拟题解
problem:给定一个序列,问你能不能通过一次交换把他弄成有序 sol: 对于0%的数据,满足数列是一个排列,然后我就打了这档分(自己瞎造的!) 对于100%的数据,显然我们先对数列进行排序然后上下 ...
- CSYZDay2模拟题解
T1.rotate [问题描述] ZYL有N张牌编号分别为1, 2,……,N.他把这N张牌打乱排成一排,然后他要做一次旋转使得旋转后固定点尽可能多.如果第i个位置的牌的编号为i,我们就称之为固定点.旋 ...
- CSYZDay1模拟题解
T1.game [问题描述] LZK发明一个矩阵游戏,大家一起来玩玩吧,有一个N行M列的矩阵.第一行的数字是1,2,…M,第二行的数字是M+1,M+2…2*M,以此类推,第N行的数字是(N-1)*M+ ...
- 2019-06-03 校内python模拟题解(所有非原题)
一起来女装吧 本题改编自USACO(USA Computing Olympiad) 1.1节的第一题 (感谢lsy同学对本题题面的贡献) 直接计算就好了 chr:将ASCII码转成字符 ord:字符对 ...
- ZOJ Monthly, June 2014 月赛BCDEFGH题题解
比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...
- hdu_5818_Joint Stacks(线段树模拟)
题目链接:hdu_5818_Joint Stacks 题意: 给你两个栈,多了个合并操作,然后让你模拟 题解: 很容易想到O(1)的单个栈操作,O(n)的合并操作,这样肯定超时,所以我们要将时间复杂度 ...
- CSU 1862 The Same Game(模拟)
The Same Game [题目链接]The Same Game [题目类型]模拟 &题解: 写这种模拟题要看心态啊,还要有足够的时间,必须仔细读题,一定要写一步,就调试一步. 这题我没想到 ...
随机推荐
- cache-fusion笔记
GRD (global resource directory)保存着所有实例中资源的分布情况 GCS (global cache service)具体执行cache fusion 工作的服务,对应 ...
- TF-IDF算法-golang实现
1.TF-IDF算法介绍 TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索(information retrie ...
- Python学习系列:PyCharm CE 安装与测试
开坑啦开坑啦~最近比赛要用Python了,开始强行学习. Mac下PyCharm CE 安装 先去百度PyCharm,一个很好用IDE,下载免费版的就够用啦: https://www.jetbrain ...
- [Oracle]System 表空间的文件丢失
如果system 表空间的文件丢失,假设有备份的情况,可以恢复.数据库需要设置为mount 状态,然后restore/recover datafile 模拟实验: SQL> select nam ...
- CodeForces-1155D Beautiful Array
Description You are given an array \(a\) consisting of \(n\) integers. Beauty of array is the maximu ...
- RyuBook1.0案例二:Traffic Monitor项目源码分析
Traffic Monitor源码分析 从simple_switch_13.SimpleSwitch13控制器继承并开发 class SimpleMonitor13(simple_switch_13. ...
- 深度学习目标检测综述推荐之 Xiaogang Wang ISBA 2015
一.INTRODUCTION部分 (1)先根据时间轴讲了历史 (2)常见的基础模型 (3)讲了深度学习的优势 那就是feature learning,而不用人工划分的feature engineeri ...
- 制作R中分词的字典的办法
在开始下面步骤之前先让自己的文件可以显示扩展名. 如何显示请谷歌. 第一步:打开一个文本文件 第二步:把你要的词复制到这个文本文件吧. 第三步:将这个文本文件的格式改为dic.即原来文件格式是txt后 ...
- PAT甲题题解-1072. Gas Station (30)-dijkstra最短路
题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内.如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个.如果平 ...
- 框架-Spring
项目中都用到了Spring.Mybatis.SpringMVC框架,首先来谈一谈Spring框架,Spring框架以IOC.AOP作为主要思想. IOC----控制反转 IOC的全称为Inversio ...