HZOI20190902模拟35题解
题面:
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题解的更多相关文章
- noip模拟35[第一次4题·裂了]
noip模拟35 solutions 这是我第一次这么正式的考四个题,因为这四个题都出自同一个出题人,并不是拼盘拼出来的. 但是考得非常的不好,因为题非常难而且一直想睡觉.. 有好多我根本就不会的算法 ...
- [CQOI2012]模拟工厂 题解(搜索+贪心)
[CQOI2012]模拟工厂 题解(搜索+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1327574 链接题目地址:洛谷P3161 BZOJ P26 ...
- 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/ ...
- HGOI NOIP模拟4 题解
NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...
- 10.9 guz模拟题题解
感谢@guz 顾z的题题解 考试共三道题,其中 第一题help共10个测试点,时间限制为 1000ms,空间限制为 256MB. 第二题escape共20个测试点,时间限制为1000ms2000ms, ...
- 10.8 wtx模拟题题解
填坑 orz w_x_c_q w_x_c_q的模拟赛(150pts,炸了) money 题目背景: 王小呆又陷入自己的梦里.(活在梦里...) 题目描述: 王小呆是一个有梦想的小菜鸡,那就是赚好多好多 ...
- [NOIP模拟13]题解
A.矩阵游戏 其实挺水的? 考场上根本没有管出题人的疯狂暗示(诶这出题人有毛病吧这么简单的东西写一大堆柿子),而且推公式能力近乎没有,所以死掉了. 很显然乘法有交换率结合率所以操作顺序对最终结果没什么 ...
- csp-s模拟9697题解
题面:https://www.cnblogs.com/Juve/articles/11790223.html 96: 刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e ...
随机推荐
- Windows 设置IP解决方案
{ super + e / windows + e Mouse Right play down network link }
- js 常见功能总会
一.随着页面滚动,元素到达可视区域,显示特殊样式 <!DOCTYPE html> <html lang="en"> <head> <met ...
- 1636: Pascal山脉
1636: Pascal山脉 时间限制: 1 Sec 内存限制: 128 MB提交: 51 解决: 15[提交][状态][讨论版] 题目描述 小卡卡顺着老者所指的方向,来到了Pascal神峰的顶峰 ...
- c# sleep 例子
using System; using System.Threading; public class arr { public static void Main() { //int[] arr; // ...
- VS中检测数据库链接
在程序中链接数据库,总要为链接语句发愁.可以尝试在链接前,从VS中测试下链接,测试成功的话,可以直接将链接语句复制到程序中. 在VS中,选择“工具”——“连接到数据库”,如下:
- 数据库小技巧:使用distinct去除重复行
这里有2个表 问题question表 楼层question_floor表 需求:已知某用户的id为uid,实现“我的回复”功能,即查看我回复的所有问题 遇到的问题:如果直接对question表和que ...
- PyInstaller打包Python源文件为可执行程序exe
1. 安装PyInstaller 使用命令:pip install PyInstaller时可能会由于网络的问题出现以下问题: pip._vendor.urllib3.exceptions.ReadT ...
- 二分图最佳匹配KM算法 /// 牛客暑期第五场E
题目大意: 给定n,有n间宿舍 每间4人 接下来n行 是第一年学校规定的宿舍安排 接下来n行 是第二年学生的宿舍安排意愿 求满足学生意愿的最少交换次数 input 2 1 2 3 4 5 6 7 8 ...
- FineUI使用记录
@{ ViewBag.Title = "Grid/Grid"; var F = Html.F();} @section body { @(F.Grid().IsFluid(true ...
- php socket模拟http中post或get提交数据
php socket模拟http中post或者get提交数据的示例代码. 代码: sock_post.php: <?php /** * php socket模拟post\get请求 * 编辑:脚 ...