题面:

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. C++调用python(C++)

    C++源代码:python部分就是正常的python代码 #include <string.h> #include <math.h> #include "iostre ...

  2. SQL Server SQLFetch()

    { /* 摘要 SQLFetch从结果集中提取下一个数据行集, 并返回所有绑定列的数据. 语法 C++ SQLRETURN SQLFetch( SQLHSTMT     StatementHandle ...

  3. 一图读懂POLARDB Box数据库一体机的云原生力量!

    2019杭州云栖大会上,阿里云宣布正式推出高性能数据库一体机——POLARDB Box,用户部署在自有数据中心即可享受云数据库的便捷体验,同时还为Oracle等传统数据库用户提供一键迁移功能,最多节省 ...

  4. LUOGU P2564 [SCOI2009]生日礼物 (队列+模拟)

    传送门 解题思路 还是比较好想的,用一个队列,然后把所有点放在一起排个序,依次入队.每次检查队头元素的种类是否为当前入队元素种类,是的话就一直\(pop\),每次更新答案即可. 代码 #include ...

  5. window.location 对象中各种方法的用途

    一.简介 属性 描述 hash 从井号 (#) 开始的 URL(锚) host 主机名和当前 URL 的端口号 hostname 当前 URL 的主机名 href 完整的 URL pathname 当 ...

  6. (转)第04节:Fabric.js用路径画不规则图形

    在Canvas上画方形.圆形.三角形都是很容易的,只要调用fabric对应的方法就可以了,但这些都是规则的图形,如果你想画一个不规则的图形,这时候你可以用fabric.js提供的路径绘图方法.所谓路径 ...

  7. iOS开发JSON字符串和字典互转

    1.相关属性简述 NSJSONReadingOptions读取属性: typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) { NSJSONRead ...

  8. Spring事物管理机制简单学习

    首先spring并不直接管理事物,而是提供了多种事物管理器,他们将事务管理的职责委托给Hibernate或者JTA等持久化机制所提供的相关平台框架的事务来实现. Spring管理事物的接口是org.s ...

  9. c#使用打印机

    在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便,但是这 ...

  10. 主页面与iframe页面之间的javascript函数的调用

    1:在主页面里调用iframe页里面的javascript函数 <script type="text/javascript"> var childWindow = $( ...