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 ...
随机推荐
- 创建Android Apps的30个经验教训
这个世界上有两种人-从经验教训中学习的人以及听从别人建议的人.这里是我一路走来学到的一些东西,分享给大家: 在添加任何第三方party之前,请三思:这真的是一个成熟的项目吗? 如果一个东西用户看不到, ...
- late_initcall和module_init的区别
在init.h中有如下定义: 详情参照:linux 设备驱动加载的先后顺序 #define pure_initcall(fn) __define_initcall("0",fn,1 ...
- VB6 对象库未注册问题
以下是个人使用VB6出现对象库未注册问题的解决方法.已成功! 一.注册ocx文件 mscomctl.ocx文件放进路径C:\Windows\System32(64是此路径,由于本人是64位系统32位未 ...
- pip更新及Requirement already up-to-date解决方法
pip更新及Requirement already up-to-date解决方法 文:铁乐与猫 2018-9-11 更新命令 将pip更新到最新版本 python -m pip install --u ...
- Python如何输出带颜色的文字方法
我们在使用python运维与开发的过程中,经常需要打印显示各种信息.海量的信息堆砌在控制台中,就会导致各种信息都显示在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上差异的字体颜色,那么就 ...
- IntelliJ IDEA 2017 激活
http://idea.lanyus.com/ 直接获取注册码 或者复制,在license server中添加: http://intellij.mandroid.cn/ http://idea.im ...
- 需求规格说明书——阿里八八“好记”APP
工作流程 ① 组长查阅相关文档.示例文件等,根据本小组项目特点进行定制需求规格说明书目录. ② 根据选题报告工作进行任务分配,追求工作量最小化.效率最大化. ③ 分工编辑文档. ④ 组长搭建Githu ...
- Alpha冲刺! Day4 - 磨刀
Alpha冲刺! Day4 - 磨刀 今日已完成 晨瑶:和大家交流了一下,反思这阶段团队遇到的问题. 昭锡:今天跟学长交流了点问题,学习了Gson使用. 永盛:Gravel 数据库重新设计. 立强:看 ...
- JS思维导图(转)
思维导图不得不说是学习及温习的极佳方法,这里转载一波网上他人的精品JS思维导图十张,共同学习,如有冒犯原著可联系本人及时处理.
- File类_常见的方法(获取,创建与删除,判断,重命名)
获取: 1.1获取文本名称 1.2获取文件路劲 1.3获取文件大小 1.4获取文件修改或创建时间 import java.io.File; import java.text.DateForma ...