题面:

A:公园

DAG上想拓扑dp

然而博主记忆化搜索了一下

设f[i][j]表示从i节点走j个点出公园所用的最小时间

则$f[u][i]=min(f[v][j-1]+dis_{u,v})$;

然后记忆化搜索

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long
#define re register
#define MAXV 2005
#define MAXE 6005
using namespace std;
int v,m,n,e,l,a[MAXE],b[MAXE],ans=0;
int to[MAXE],nxt[MAXE],pre[MAXV],cnt=0,val[MAXE];
inline void add(re int u,re int v,re int w){
++cnt,to[cnt]=v,nxt[cnt]=pre[u],pre[u]=cnt,val[cnt]=w;
}
int ent[MAXE],f[MAXV][MAXV];
bool vis[MAXV];
inline void dfs(re int x){
if(x==v+1){
f[x][0]=0;
return ;
}
for(re int i=pre[x];i;i=nxt[i]){
re int y=to[i];
if(!vis[y]){
vis[y]=1;
dfs(y);
}
for(re int j=1;j<=v;j++)
f[x][j]=min(f[x][j],f[y][j-1]+val[i]);
}
}
signed main(){
//freopen("ex_park3.in","r",stdin);
scanf("%lld%lld%lld%lld%lld",&v,&m,&n,&e,&l);
for(re int i=0;i<=v+1;++i) for(re int j=0;j<=v+1;++j) f[i][j]=0x3fffffffffffffff;
for(re int i=1,x;i<=m;++i){
scanf("%lld",&x);
scanf("%lld",&a[x]);
ent[i]=x;
}
for(re int i=1,x;i<=n;++i){
scanf("%lld",&x);
scanf("%lld",&b[x]);
add(x,v+1,b[x]);
}
for(re int i=1,p,q,w;i<=e;++i){
scanf("%lld%lld%lld",&p,&q,&w);
add(p,q,w);
}
for(re int i=1;i<=m;++i){
if(vis[ent[i]]) continue;
vis[ent[i]]=1;
dfs(ent[i]);
}
for(re int i=1;i<=m;++i){
for(re int j=1;j<=v;++j){
if(f[ent[i]][j]+a[ent[i]]>l) continue;
ans=max(ans,j);
}
}
printf("%lld\n",ans);
return 0;
}

B:计划

先想一个暴力

我们预处理一个b[i],表示由i位置之后经过b[i]后是第一次出现m个不同的数

然后对于每一个询问(x,y),$ans=\sum\limits_{i=x}^{y}\frac{(y+b[i]-2i)*(y-b[i]+1)}{2}(b[i]<y)$

我们发现b[i]是单调增的,所以枚举到第一个b[i]>y就break

于是有80分

然后我们优化

我们发现$(y+b[i]-2i)*(y-b[i]+1)=y^2+y+b[i]-b[i]^2+2ib[i]-2i-2iy$

这个可以前缀和优化

那么重点就是找到第一个b[i]>y的位置,二分即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100005
#define re register
#define int long long
using namespace std;
int n,m,q,a[MAXN],b[MAXN],sum[MAXN],cnt[MAXN];
bool vis[MAXN];
inline int get(re int l){
re int num=0;
memset(vis,0,sizeof(vis));
for(re int i=l;i<=n;++i){
if(vis[a[i]]==0) num++;
vis[a[i]]=1;
if(num>=m) return i;
}
return n+1;
}
signed main(){
scanf("%lld%lld%lld",&n,&m,&q);
for(re int i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
for(int i=1;i<=n;++i){
b[i]=get(i);
if(b[i]>n) continue;
sum[i]=sum[i-1]+b[i]-b[i]*b[i]+2*i*b[i]-2*i;
cnt[i]=cnt[i-1]+i;
}
while(q--){
re int x,y,res=0,l,r,mid;
scanf("%lld%lld",&x,&y);
l=x,r=y;
while(l<=r){
mid=(l+r)>>1;
if(b[mid]<=y) l=mid+1;
else r=mid-1;
}
res+=(sum[l-1]-sum[x-1]+(l-x)*(y*y+y)-2*y*(cnt[l-1]-cnt[x-1]))/2;
printf("%lld\n",res);
}
return 0;
}

HZOI20190902模拟35题解的更多相关文章

  1. noip模拟35[第一次4题·裂了]

    noip模拟35 solutions 这是我第一次这么正式的考四个题,因为这四个题都出自同一个出题人,并不是拼盘拼出来的. 但是考得非常的不好,因为题非常难而且一直想睡觉.. 有好多我根本就不会的算法 ...

  2. [CQOI2012]模拟工厂 题解(搜索+贪心)

    [CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...

  3. NOIP第7场模拟赛题解

    NOIP模拟赛第7场题解: 题解见:http://www.cqoi.net:2012/JudgeOnline/problemset.php?page=13 题号为2221-2224. 1.car 边界 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  6. 10.9 guz模拟题题解

    感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...

  7. 10.8 wtx模拟题题解

    填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...

  8. [NOIP模拟13]题解

    A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...

  9. csp-s模拟9697题解

    题面:https://www.cnblogs.com/Juve/articles/11790223.html 96: 刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e ...

随机推荐

  1. js字符串去重复

    var str="fdafdasfdasfdsfdseeeu"; function te(str){ var hash=[]; var arr=new Array(); var s ...

  2. Perl 基础语法

    Perl 基础语法 Perl借用了C.sed.awk.shell脚本以及很多其他编程语言的特性,语法与这些语言有些类似,也有自己的特点. Perl 程序有声明与语句组成,程序自上而下执行,包含了循环, ...

  3. linux中对EINTR错误的处理

    https://www.cnblogs.com/flyfish10000/articles/2576885.html EINTR错误的产生:当阻塞于某个慢系统调用的一个进程捕获某个信号且相应信号处理函 ...

  4. The Python Standard Library

    The Python Standard Library¶ While The Python Language Reference describes the exact syntax and sema ...

  5. System Verilog的概念以及与verilog的对比

    以下内容源自:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证 ...

  6. socket远程执行命令

    两个脚本模拟远程执行命令 cmd_server.py import socket import subprocess # 运行系统命令 sk = socket.socket() addess = (' ...

  7. MybatisPlus联合分页查询

    跟单表分页查询差不多 1.编写查询语句 public interface QuestionMapper extends BaseMapper<Question> { @Select(&qu ...

  8. 解决Eclipse建立Maven Web项目后找不到src/main/java资源文件夹的办法

    问题如题,明细见下图: 解决方法: 在项目上右键选择properties,然后点击java build path,在Librarys下,编辑JRE System Library,选择workspace ...

  9. kali linux 入门(1) 基于win10和docker的环境搭建

    1. 前言 渗透测试并没有一个标准的定义.国外一些安全组织达成共识的通用说法是,渗透测试是通过模拟恶意黑客的攻击方法,来评估计算机网络系统安全的一种评估方法,这个过程包括对系统的任何弱点.技术缺陷或漏 ...

  10. C语言利用动态数组实现顺序表(不限数据类型)

    实现任意数据类型的顺序表的初始化,插入,删除(按值删除:按位置删除),销毁功能.. 顺序表结构体 实现顺序表结构体的三个要素:(1)数组首地址:(2)数组的大小:(3)当前数组元素的个数. //顺序表 ...