NOI Day1线上同步赛梦游记
Preface
第一次体验NOI,虽然不是正式选手,但是打打同步赛还是挺涨姿势的,也算是体验了一把。
Day1很爆炸,一方面是NOI题目的难度高于自身的水平,另一方面也出现了比较大的失误,T1一个数组没有清空导致树的部分分全部爆0了;T3可能是蜜汁Hash写挂(or 题意理解错误?)导致暴力(不过话说好多网络赛的人T3都爆零了)
不禁想到如果是自身参加NOI虽然不太现实,出现这样的SB错误会不会后悔呢?
后面两题不会,静候未来填坑。
归程
整套题目看起来唯一可做的题目(对于我来说),所以读完题目就马上看了下部分分
woc,CCF这么良心的吗?所以就来了一波大力分类讨论:
- 前30pts(\(1\to 6\)):海拔仅有一种且为\(1\),这不是良心送分么?我从终点开始往回刷一遍DJ(别问我为什么不用SPFA),每一次判断洪水高度是否\(>1\)即可,若是直接输出最短路径(反正一条路都没有了,只能靠脚了),否则输出\(0\)(直接飙车到达即可)
- 后面的10pts(\(15\to16\)):注意到数据范围很小,我们还是先预处理。对于每一次询问,我们从起点开始BFS,期间只能经过高度大于洪水高度的边,然后再所以能够到达的点中找出离终点最近的点击即可。
- 中间的25pts(\(7\to 11\)):保证数据为链or树,由于树的特殊性,我们直接考虑树怎么做。首先最短路是要跑的(直接用DJ也行,不过自己再写一个BFS什么的会更快),然后我们直接以终点为根,预处理出LCA数组(用来跳father)以及倍增数组(记录每一段树链上权值最小的边)。考虑洪水淹没的过程,只要一条边断了,这条路就不得不停止。所以我们树上倍增找到第一条被淹没的边,然后在输出这个点到根的路径长度即可(用前面的两个数组做类似于倍增LCA的过程)。
- 中间的15pts(\(13\to 14\)):这个我们注意到离线这个重要性质。我们把所以操作读进来,按洪水高度从大到小排个序。这时候我们发现对于操作的进行其实就是个不断地给原图加边的一个过程,所以我们用并查集维护,顺便维护每一个联通块内的点距离终点最近的距离即可。
然后满分算法蒟蒻就不会了,其实按照上面的离线方法是可以跑在线的情况的,只不过需要可持久化并查集。然后由于我很菜,一直都没调出来,所以还是等着以后再填吧。
具体同步赛的时候由于树的情况倍增数组没有清空,所以少得了15pts(还好我把链和暴力一起做了),并且最后离线想到了懒得写了(在刚T2,T3)
这里上分类讨论CODE(能过前16组数据,所以在Luogu上这一题显示过了,好像还很快)
#include<cstdio>
#include<cctype>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int N=2e5+5,M=4e5+5,MINER_N=1505,P=21;
struct edge
{
int to,next,v,h;
}e[M<<1];
struct data
{
int num,s;
bool operator <(const data a) const { return a.s<s; }
};
struct double_edge
{
int l,r,s;
}a[M];
struct ques
{
int x,h,id;
}b[N>>1];
priority_queue<data> small;
int n,m,q,k,s,ans,x,y,l,h,cnt,head[N],dis[N],t,que[MINER_N],f[N][P],father[N][P],sum[N],fa[N],Ans[N>>1];
bool flag,vis[N],get[MINER_N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void write(int x)
{
if (x>9) write(x/10);
putchar(x%10+'0');
}
inline void double_add(int x,int y,int v,int h)
{
e[++cnt].to=y; e[cnt].next=head[x]; e[cnt].v=v; e[cnt].h=h; head[x]=cnt;
e[++cnt].to=x; e[cnt].next=head[y]; e[cnt].v=v; e[cnt].h=h; head[y]=cnt;
}
inline int min(int a,int b)
{
return a<b?a:b;
}
inline void clear(void)
{
memset(head,-1,sizeof(head)); cnt=ans=0; flag=1;
memset(f,0,sizeof(f)); memset(sum,0,sizeof(sum));
}
inline void Dijkstra(int s)
{
memset(dis,63,sizeof(dis)); memset(vis,0,sizeof(vis));
small.push((data){s,0}); dis[s]=0;
while (!small.empty())
{
int now=small.top().num; small.pop();
if (vis[now]) continue; vis[now]=1;
for (register int i=head[now];~i;i=e[i].next)
if (dis[e[i].to]>dis[now]+e[i].v)
{
dis[e[i].to]=dis[now]+e[i].v;
small.push((data){e[i].to,dis[e[i].to]});
}
}
}
inline void reset(int now)
{
for (register int i=0;i<P-1;++i)
if (father[now][i]) father[now][i+1]=father[father[now][i]][i],f[now][i+1]=min(f[now][i],f[father[now][i]][i]);
}
inline void DFS(int now,int fa)
{
register int i; father[now][0]=fa; reset(now);
for (i=head[now];~i;i=e[i].next)
if (e[i].to!=fa) f[e[i].to][0]=e[i].h,sum[e[i].to]=sum[now]+e[i].v,DFS(e[i].to,now);
}
inline void solve1(int x,int h)
{
write(ans=(h>=1?dis[x]:0)); putchar('\n');
}
inline void solve2(int x,int h)
{
for (register int i=P-1;i>=0;--i)
if (father[x][i]&&f[x][i]>h) x=father[x][i];
write(ans=sum[x]); putchar('\n');
}
inline void solve3(int x,int h)
{
register int i,H=0,T=1; memset(get,0,sizeof(get));
que[1]=x; get[x]=1; int res=dis[x];
while (H<T)
{
int now=que[++H];
for (i=head[now];~i;i=e[i].next)
if (e[i].h>h&&!get[e[i].to]) res=min(res,dis[e[i].to]),get[e[i].to]=1,que[++T]=e[i].to;
}
write(ans=res); putchar('\n');
}
inline bool cmp1(double_edge a,double_edge b)
{
return a.s>b.s;
}
inline bool cmp2(ques a,ques b)
{
return a.h>b.h;
}
inline int getfa(int k)
{
return k^fa[k]?fa[k]=getfa(fa[k]):k;
}
inline void unionn(int x,int y)
{
int fx=getfa(x),fy=getfa(y);
if (fx!=fy)
{
if (dis[fx]<dis[fy]) fa[fy]=fx; else fa[fx]=fy;
}
}
inline void solve4(void)
{
register int i,p=1;
for (i=1;i<=q;++i)
read(b[i].x),read(b[i].h),b[i].id=i;
sort(a+1,a+m+1,cmp1); sort(b+1,b+q+1,cmp2);
for (i=1;i<=n;++i) fa[i]=i;
for (i=1;i<=q;++i)
{
while (p<m&&a[p].s>b[i].h) unionn(a[p].l,a[p].r),++p;
Ans[b[i].id]=dis[getfa(b[i].x)];
}
for (i=1;i<=q;++i)
write(Ans[i]),putchar('\n');
}
int main()
{
//freopen("return.in","r",stdin); freopen("return.out","w",stdout);
register int i; read(t);
while (t--)
{
read(n); read(m); clear();
for (i=1;i<=m;++i)
{
read(x); read(y); read(l); read(h); a[i]=(double_edge){x,y,h};
double_add(x,y,l,h); if (h^1) flag=0;
}
if (m!=n-1) Dijkstra(1); else DFS(1,0); read(q); read(k); read(s);
if (!k&&q==100000&&!flag&&m!=n-1) { solve4(); continue; }
while (q--)
{
read(x); read(y); x=(1LL*x+k*ans-1)%n+1; y=(1LL*y+k*ans)%(s+1);
if (flag) { solve1(x,y); continue; }
if (m==n-1) solve2(x,y); else solve3(x,y);
}
}
return 0;
}
冒泡排序
那个板子其实刚开始是错的而且同步赛好像并没有更正
蒟蒻表示这种数学向的题目太恐怖,所以一直企图切出前\(11\)个点的状压DP
然而什么也没搞出来,最后交了个全排列证明我曾经来过水了8分
你的名字
字符串什么也不会好吧Hash的奇技淫巧我还是挺熟练的的菜鸡表示看到题目直接弃疗。
直奔12pts的Hash暴力而去,最后爆\(0\)了,我应该是看错题意了。
反正一堆dalao说着线段树套SAM就水过,我还是回去老老实实学ACWA自动机吧
Postscript
反正我太菜了也没什么关系只要不是真的NOI爆炸我还是可以接受的
争取明年同步赛不要翻低级错误吧不敢说出去NOI的我
NOI Day1线上同步赛梦游记的更多相关文章
- NOI Day2线上同步赛崩盘记
Preface 蒟蒻愉快的NOI线上赛Day2之行,不过因为太菜就凉了 这次由于策略&&网络的问题,最后两题都没有交,结果就靠T1稳住拿了75分就回家了. 我真是太菜了. 屠龙勇士 首 ...
- 设置 svn 与 web线上同步
默认你已经配置好了svn服务 1.假设我们的线上网站目录为:/data/www/xxx 2.假设svn的仓库目录为:/data/svn/repo 一.checkout一份svn到线上网站目录 svn ...
- NOI 2018网络同步赛(游记?)
刚中考完那段时间比较无聊,报名了一个同步赛,报完名才发现成绩单是要挂到网上的,而且因为报的早给了一个很靠前的考号...那布星啊,赶紧学点东西,于是在一周内学了网络流,Treap以及一些数论. Day1 ...
- 【NOI 2019】同步赛 / 题解 / 感想
非常颓写不动题怎么办…… 写下这篇博客警示自己吧…… 游记 7.16 我并不在广二参加 NOI,而是在距离广二体育馆一公里远的包间打同步赛(其实就是给写不动题找个理由) 上午身体不舒服,鸽了半天才看题 ...
- NOI2021 同步赛游记
写在前面的话 为什么叫游记呢?因为我第一天是在划水中度过的,错过了对原题的发现. O n e I n D a r k \tt OneInDark OneInDark 无比风光地去了浙江,却倒霉地遇上了 ...
- rsync实现负载均衡集群文件同步,搭建线上测试部署环境
闲来无事,搭建一个负载均衡集群,至于负载均衡集群搭建过程,找时间写下.这次主要写集群之间的文件同步,以及线上测试环境的搭建. 笔者看过很多公司都没有线上测试环境,真是崩溃了,不造怎么确保线上线下环境一 ...
- 使用percona-xtrabackup实现对线上zabbix监控系统数据库mariadb5.5.47的主从同步
使用percona-xtrabackup实现对线上zabbix监控系统数据库的主从同步 业务背景: zabbix3.0.4是业务的主要监控,部署在一台单机中,为避免数据丢失先对其做数据主从同步,因主数 ...
- Git版本控制,rsync同步文件,完成线上部署
之前项目开发完成,测试阶段,借着此时,由于公司暂时用两台aliyun ecs 做业务层,所以每次都需要同步线上文件,进而想着搞一搞服务器端(小公司,新项目,先小搞一把),搭建一套小的版本控制上线的 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 H题 Rock Paper Scissors Lizard Spock.(FFT字符串匹配)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
随机推荐
- 使用 Java 8 语言功能
Android Studio 3.0 及以上版本支持所有 Java 7 语言功能,以及部分 Java 8 语言功能(具体因平台版本而异). 本页介绍您可以使用的 Java 8 语言功能.如何正确配置项 ...
- mysql的高级特性-存储过程
定义: 存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来执行这些sql语句命令. 语法: DELIMITER // 声明语句结束符,用于区分; CEATE PROCED ...
- maven——依赖管理
管理包依赖是 Maven 核心功能之一,下面通过如何引入 jar 包:如何解析 jar 包依赖:包冲突是如何产生:如何解决包冲突:依赖管理解决什么问题:什么是依赖范围:使用包依赖的最佳实践等 6 个问 ...
- 洗礼灵魂,修炼python(15)--列表进阶话题—>列表解析/列表生成器
是的,我是想到什么知识点就说什么,没有固定的主题,我的标题都是在写完博客再给的.本篇博文说说列表进阶话题.其实列表应该是比较熟悉的了,而毫不夸张的说,在实际的开发中,列表也是使用的最多的,以后你会体会 ...
- 安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败
安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server ...
- Django之model模块创建表完整过程
Django中,与数据库相关的模块是model模块,它提供了一种简单易操作的API方式与数据库交互,它是通过ORM映射的方式来操作数据库,一个类对应数据库一张表,一个类属性,对应该表的一个字段,一个实 ...
- EF扩展 更新指定字段
using System.Data.Entity.Infrastructure; using System.Threading.Tasks; /// <summary> /// EF扩展 ...
- windows 实用技巧
以下内容版权归原作者所有!!!如果侵权,立即删除. 1.系统激活:https://mp.weixin.qq.com/s/Kl_iEeSSxSprblfSRZ6yEQ 2.百度云下载:https://w ...
- .net 调用R语言的函数(计算统计值pvalue 对应excel :ttest)
Pvalue 计算 项目设计pvalue计算,但是由于.net 没有类似的公式或者函数,最终决定使用.net 调用R语言 采用.net 调用r语言的公用函数 需要安装 r语言环境 https://mi ...
- Django电商项目---完成注册页面和用户登录day1
完成基本的创建项目.用户注册.登录.注销功能 创建Django项目,创建df_user的App 创建静态文件夹static(跟manage.py保持在同一级别下) 复制静态文件(css + image ...