老年退役选手来过时口胡一波

小凯的疑惑

考场上的普遍做法就是打表吧,规律还是很好找的
很容易看出答案是a*b-a-b

时间复杂度

比16年的D1T2不知道良心多少。。。
模拟就行了,但还是需要一定的比赛经验的,写完后多拿自制数据试一试,高分还是很容易拿的

逛公园

一开始我只会做DAG的DP,不知道怎么处理环的问题,想用tarjan缩点但发现没有用,后来发现直接记忆化搜索下去就可以了,f[i][j]表示DP到第i个点,此时最少走的额外路径长为j,因为状态不会重复,-1的情况判断0环上的点是否在最短路上就行了
dfs一遍判断0环就可以了,判断是否在最短路上可以正反做两次SPFA
时间复杂度O(T(最短路+km))O(T(最短路+km))O(T(最短路+km))
代码:

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int T,n,m,k,p,tot,goal;
int first[2][100005],dis[2][100005],f[100005][52],sta[100005];
char tim[100005][52],ok[100005];
bool vis[100005],flag;
struct edge{int v,w,next;
}e[2][200005];
int in()
{int t=0;char ch=getchar();while (ch>'9'||ch<'0') ch=getchar();while (ch<='9'&&ch>='0') t=t*10+ch-48,ch=getchar();return t;
}
void add(int x,int y,int z)
{e[0][++tot].v=y;e[0][tot].w=z;e[0][tot].next=first[0][x];first[0][x]=tot;e[1][tot].v=x;e[1][tot].w=z;e[1][tot].next=first[1][y];first[1][y]=tot;
}
int up(int x,int y){return ((x+y)%p+p)%p;}
queue<int>q;
void SPFA(int r)
{int now=(r?n:1);memset(dis[r],63,sizeof(dis[r]));dis[r][now]=0;for (q.push(now);!q.empty();q.pop()){now=q.front();for (int i=first[r][now];i;i=e[r][i].next)if (dis[r][e[r][i].v]>dis[r][now]+e[r][i].w){dis[r][e[r][i].v]=dis[r][now]+e[r][i].w;if (!vis[e[r][i].v]) vis[e[r][i].v]=1,q.push(e[r][i].v);}vis[now]=0;}
}
int dp(int x,int D)
{if (dis[1][x]+D-goal>k) return 0;if (tim[x][dis[1][x]+D-goal]==T) return f[x][dis[1][x]+D-goal];tim[x][dis[1][x]+D-goal]=T;f[x][dis[1][x]+D-goal]=(x==n);for (int v,i=first[0][x];i;i=e[0][i].next){v=e[0][i].v;f[x][dis[1][x]+D-goal]=up(f[x][dis[1][x]+D-goal],dp(v,D+e[0][i].w));}return f[x][dis[1][x]+D-goal];
}
void dfs(int x)
{ok[x]=T;sta[++sta[0]]=x;vis[x]=1;for (int v,i=first[0][x];i;i=e[0][i].next)if (e[0][i].w==0){v=e[0][i].v;if (ok[v]!=T) dfs(v);else if (vis[v]&&dis[0][v]+dis[1][v]<=k+goal)flag=1;}--sta[0];vis[x]=0;
}
void work()
{n=in();m=in();k=in();p=in();tot=0;flag=0;for (int i=1;i<=n;++i) first[0][i]=first[1][i]=0;for (int u,v,w,i=1;i<=m;++i)u=in(),v=in(),w=in(),add(u,v,w);SPFA(0);SPFA(1);goal=dis[0][n];for (int i=1;i<=n;++i)if (ok[i]!=T) dfs(i);if (flag) puts("-1");else printf("%d\n",dp(1,0));
}
main(){for (T=in();T;--T) work();}

奶酪

模拟+并查集显然,注意距离的平方可以爆long long,自行处理

宝藏

有趣的状压DP,延续了16年的风格,感觉比16年的D2T3难一点?
一开始我多加了一维状态,发现答案不对,只能改成f[D][S]表示最大深度为D,n个点的状态为S,转移时枚举未转移点的集合S’就可以了,实际程序中(枚举完起点后)先枚举S,然后预处理S’连到S的代价,再枚举D
时间复杂度O(n23n)O(n23n)O(n^2 3^n)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int n,m;
int dis[13][13],f[13][1<<12],w[1<<12],bit[1<<12],p[13];
stack<int>S;
int cal(int id)
{int t=1e9;for (int i=1;i<=p[0];++i) t=min(t,dis[p[i]][id]);return t;
}
main()
{scanf("%d%d",&n,&m);memset(dis,63,sizeof(dis));for (int x,y,z,i=1;i<=m;++i)scanf("%d%d%d",&x,&y,&z),dis[x][y]=dis[y][x]=min(dis[x][y],z);for (int i=1;i<=n;++i) dis[i][i]=0;for (int j=1,i=1;i<=n;++i,j<<=1) bit[j]=i;int ans=1e9,cop;for (int s=1;s<=n;++s){memset(f,63,sizeof(f));f[0][1<<s-1]=0;for (int k,state=(1<<s-1);state<(1<<n);++state)if (state&(1<<s-1)){p[0]=0;cop=((1<<n)-1)^state;for (int i=cop;i;i=(cop&i-1)) S.push(i);k=state;for (;k;k^=(k&-k)) p[++p[0]]=bit[k&-k];for (;!S.empty();S.pop())k=S.top(),w[k]=(w[k^(k&-k)]<1e9?w[k^(k&-k)]+cal(bit[k&-k]):1e9);for (int D=0;D<n;++D)for (int sub=cop;sub;sub=(cop&sub-1))if (w[sub]<1e9)f[D+1][state|sub]=min(f[D+1][state|sub],f[D][state]+w[sub]*(D+1));}for (int D=0;D<n;++D) ans=min(ans,f[D][(1<<n)-1]);}printf("%d\n",ans);
}

列队

感觉难度比不上16年的D1T2?
n,m小的时候模拟,q小的时候枚举之前询问的影响,x=1时只影响第一行和第m列组成的倒”L”型,实际上变成了序列问题,线段树或平衡树随便做,这样就有50~70了
想想16年D1T2的树链剖分
然后我就很咸鱼地没有考虑到建n+1个线段树来维护每一行和最后一列。。
运用动态开点的权值线段树,起始状态1~m-1(n)+q上均有1个,每次修改相当于在对应行(列)的线段树上删去一个数,拿vector去存大于m-1(n)的数对应的编号
时间复杂度O(qlog(max(n,m)+q))O(qlog⁡(max(n,m)+q))O(q \log (\max(n,m)+q))

#include<cstdio>
#include<vector>
#define LL long long
#define M 300005
using namespace std;
int in()
{int t=0;char ch=getchar();while (ch<'0'||ch>'9') ch=getchar();while (ch>='0'&&ch<='9') t=t*10+ch-48,ch=getchar();return t;
}
int n,m,q,cnt;
int root[M],ls[M*19],rs[M*19],del_num[M*19];
vector<LL> val[M];
int get(int &rt,int l,int r,int k)
{if (!rt) rt=++cnt;++del_num[rt];if (l==r) return r;int mid=l+r>>1,sz=mid-l+1-del_num[ls[rt]];if (sz>=k) return get(ls[rt],l,mid,k);else return get(rs[rt],mid+1,r,k-sz);
}
main()
{n=in();m=in();q=in();LL ans;for (int x,y,t,i=1;i<=q;++i){x=in();y=in();if (y==m){t=get(root[n+1],1,q+n,x);if (t<=n) ans=1LL*t*m;else ans=val[n+1][t-n-1];printf("%lld\n",ans);val[n+1].push_back(ans);}else{t=get(root[x],1,q+m,y);if (t<m) ans=1LL*x*m+t-m;else ans=val[x][t-m];printf("%lld\n",ans);val[n+1].push_back(ans);t=get(root[n+1],1,q+n,x);if (t<=n) ans=1LL*t*m;else ans=val[n+1][t-n-1];val[x].push_back(ans);}}
}

NOIP2017(不算是题解)相关推荐

  1. noip2017爆炸记——题解总结反省(普及组+提高组)

    相关链接: noip2018总结 noip2017是我见过的有史以来最坑爹的一场考试了. 今年北京市考点有一个是我们学校,我还恰好被分到了自己学校(还是自己天天上课的那个教室),于是我同时报了普及提高 ...

  2. NOIP2017提高组初赛 个人理解+题解

    NOIP2017复赛总结+题解 今年初赛好难啊 单选 第一题就懵逼 谁知道Pascal什么时候用不了啊 听说是2019年 选项里没有啊 那就2020年吧,果然错,答案是2022 第二题还是很正常,负数 ...

  3. b+树时间复杂度_前端大神用的学习笔记:线段树和树状数组

    全文篇幅较长,细心理解一定会有收获的♪(^∇^*). 1|0线段树 1|1一些概念     线段树是一种二叉搜索树,每一个结点都是一个区间(也可以叫作线段,可以有单点的叶子结点),有一张比较形象的图如 ...

  4. 【NOIP题解】NOIP2017 TG D2T3 列队

    列队,NOIP2017 TG D2T3. 树状数组经典题. 题目链接:洛谷. 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. ...

  5. 牛客题库 题解 | #[NOIP2017]图书管理员#

    链接:#[NOIP2017]图书管理员# 题目牛客网是互联网求职神器,C++.Java.前端.产品.运营技能学习/备考/求职题库,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨 ...

  6. 洛谷 P3959 [NOIP2017]宝藏 题解

    通向地底的传送门 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决 ...

  7. P3955 [NOIP2017 普及组] 图书管理员C++题解

    洛谷来源:P3955 [NOIP2017 普及组] 图书管理员 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/sol ...

  8. [NOIP2017 普及组]跳房子 【题解】

    题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 n n ...

  9. 【NOIP2017 提高组正式赛】列队 题解

    题目大意 有一个 \(n\times m\) 的方阵,每次有 \((x,y)\) 离开,离开后有两个命令 向左看齐.这时第一列保持不动,所有学生向左填补空缺.这条指令之后,空位在第 \(x\) 行第 ...

最新文章

  1. latex中\begin{verbatim}以及\verb有什么用?
  2. android sliding tab,android – 刷新SlidingTabLayout
  3. python假设产品列表如下请首先打印出商品列表_Python列表练习题
  4. 发现Diolar 的边缘检测程序好像也有缺点
  5. Mysql的master,slave的配置
  6. HTML5新增视频标签(HTML5)
  7. 计算机期末考试知识,干货|计算机期末复习宝典
  8. 进程创建函数fork
  9. 服务器虚拟机要怎么安装,服务器虚拟机怎么安装
  10. 易语言MYQQ框架群管机器人如何获取用户信息
  11. CC1310F128RGZR 无线收发器 微控制器
  12. EVO Evaluation of SLAM 4 --- ORB-SLAM3 编译和利用数据集运行
  13. 麦弗逊悬架硬点布置 根据设计输入,布置麦弗逊悬架硬点坐标,匹配转向拉杆断开点,匹配车轮外倾角和前束值,从而获得硬点初版坐标
  14. 扁平化数据处理成tree树形结构
  15. python 存储字典_python 字典存储
  16. Messaging——Solace PubSub+
  17. elasticsearch性能测试工具rally深入详解
  18. 2019最新android实例开发视频教程
  19. 课5 视频分镜的处理
  20. python hadoop wordcount_Hadoop之wordcount实例-MapReduce程序

热门文章

  1. 化繁就简 · 万物互联,华为云All-Connect企业级云网络正式发布
  2. 老兵的十年职场之路(一)
  3. 给一线讲产品·8期|VPC、子网、安全组,是什么关系?
  4. swf文件关键字查找_牛鹭学院:学员笔记|文件(夹)的出生、成长到死亡
  5. mysql8.0.12不能用_使用最新版本MySQL8.0.12报错记录
  6. 基于spiking卷积的脉冲时间编码
  7. LSTM公式详解推导
  8. m1 MacBook Air安装原生版本Emacs之方法
  9. 小米自然语言处理工程师招聘条件与自己的对应整理
  10. python 录入数据不重复_python Django批量导入不重复数据