APIO2022
前言
5.18
写完了网络流打算之后用网络流骗分。
写了两道 APIO 历年,发现好难,不想写了。
5.23
把 dev 的缺省源删了,多练练头文件,不让考试时挂在这里。
发了练习用的网站,发现 2/3 是交互题/ll。
对了,才知道 Batch 就是一般意义上的“传统题”,而 Communication 好像是交互题。
人傻了 APIO 的题这么难,2019~21 我分别抄题解做了 2,1,1 道题(甚至 2021 的那道还没过 5.31 补好了 雨林跳跃)。
5.25
学了一下 线段树分治,感觉好奇妙,不知道考场上用不用得到。
官方发的练习题做了 1,2 不会 3。
洛谷上帖子说这三道评分约蓝红蓝或绿红绿,wtcl。
Practice T1
点击展开
Trans
下标从 \(0\) 开始。
有一个机器,输入一个长度为 \(n\) 的序列 \(\{a\}\),返回 \(\{b\}\) 序列,\(b_i=a_{p_i}\ \text{xor} \ x\),其中 \(\{p\}\) 为机器内置的 \(n\) 排列(\(0\) 到 \(n-1\)),\(x\) 为机器内定的值。你只能向机器中输入一次一个序列 \(\{a\}\),其中值域 \([0,n+2]\),然后得到返回 \(\{b\}\),请猜出 \(\{p\}\)。
\(3\le n\le 128,0\le x\le 255\)
Sol
以下的 \(/\) 均代表除法+下取整。
首先我们认同,如果猜的数列 \(\{a\}\) 值互不相同,且我们求出了 \(x\) 的值,那 \(\{p\}\) 就迎刃而解了。
分类讨论。设 \(k\) 使得 \(2^k-1\le n,2^{k+1}-1>n\)。
我们只要询问 \(\{1,2,3,\dots,2^k-1,2^k,\dots,n\}\) 即可。
我们发现将这些数 \(/ 2^k\) 后会有两种值 \(0,1\),值的个数分别为 \(2^k-1,n-2^k+1\)。
由于 \(2^k-1>n-2^k+1\),我们对于 \(\{b\}\) 统计同样的东西(\(/ 2^k\)),多的那类就对应 \([1,2^k-1]\) 这部分。
多的那部分值就是 \(x/2^k\),我们直接将 \((x/2^k)\times 2^k\) 异或掉 \(\{b\}\),接下来只有 \(x\bmod 2^k\) 的部分了。
由于 \([0,2^k-1]\) 异或一个 \(<2^k\) 的 \(x\) 后还是 \([0,2^k-1]\) 这些数,我们开桶查询 \(\{b\}\) 中 \([0,2^k-1]\) 少了哪个数,就对应着原来 \(\{a\}\) 中 \([1,2^k-1]\) 缺失的 \(0\),所以 \(x\bmod 2^k\) 就是那个缺失的数。
类似上一种情况的做法,但是 \(2^k-1=n-2^k+1\),无法像上一种这样做。
我们发现 \(n+2=2^{k+1}\) 正好是 \(2\) 的幂,这说明要用。
我们询问 \(\{a\}=\{1,2,3,\dots,2^k-1,2^k,\dots,n-2,n-1,2^{k+1}\}\)。
由于 \(\{a\}\) 中只有 \(2^{k+1}/2^{k+1}=1\),所以我们能快速定位到原 \(2^{k+1}\) 在 \(\{b\}\) 中的位置,记为 \(pos\)。
然后 \(x=b_{pos}\ \text{xor} \ 2^{k+1}\) 就结束了。
Detail
注意分类讨论中第二类不能 \(\{a\}=\{\color{red}{0},1,2,\dots,2^k-1,2^k,\dots,n-3,\color{red}{n-2},2^{k+1}\}\)。
因为当 \(n=6\) 时(其实就是小数据部分的锅),\((n-2)-(2^k-1)=1\),这时 \(2^{k+1}\) 和 \(2^k(=n-2)\) 就无法区分了。
Code
点击查看代码
#include<bits/stdc++.h> #include"machine.h" using namespace std; #define For(i,j,k) for(int i=j;i<=k;i++) #define pb emplace_back #define sec second #define fir first map<int,int> mp; bool vis[1000]; vector<int> guess_permutation(int n){ vector<int> que,res; int a=0; while((1<<(a+1))-1<=n) a++; if((1<<(a+1))-2==n){ For(i,0,n-2) que.pb(i); que.pb((1<<(a+1))); res=use_machine(que); mp.clear(); For(i,0,n-1) mp[res[i]>>(a+1)]++; int mn=0,cnt=n+1; for(auto i:mp){ if(i.sec<cnt){ mn=i.fir; cnt=i.sec; } } int pos=0,x; while((res[pos]>>(a+1))!=mn) pos++; x=res[pos]^(1<<(a+1)); For(i,0,n-1) res[i]^=x; res[pos]=n-1; return res; } For(i,1,n) que.pb(i); res=use_machine(que); mp.clear(); For(i,0,n-1) mp[res[i]>>a]++; int mx=0,cnt=0; for(auto i:mp){ if(i.sec>cnt){ mx=i.fir; cnt=i.sec; } } mx<<=a; For(i,0,n-1) res[i]^=mx; For(i,0,(1<<a)-1) vis[i]=0; For(i,0,n-1) if(res[i]<(1<<a)) vis[res[i]]=1; int mis=0; while(vis[mis]) mis++; For(i,0,n-1) res[i]^=mis; For(i,0,n-1) res[i]--; return res; }
Practice T2
就是前缀和板子,不再赘述。
5.26
重修了一下分数规划。
出发!!!
路上很不顺。
然后到处堵车(查核酸+下雨)。
我们 1:30 才到,这边午餐供应 1 点结束,我、xay、yjj、yzc、zty、wn、xyr AA 点了KFC吃。
一车大佬一起讨论 practice T3 终于会了。
感觉集体降智。——yjj
Practice T3
点击展开
Trans
有人给了你 \(n\le 4e4\) 个点,每个点的两个坐标为整数 \(\in[0,5e8)\),然后让你 encode 成一个长度为 \(3n\) 的整数序列,每一个值域 \([0,2e9]\)。
之后这个人会把这个序列打乱还给你,让你还原出最初的 \(n\) 个点的坐标,注意 \(n\) 个点之间的顺序无关紧要。
Sol
我们大体的思路为:\(n\) 个值存 \(X\) 坐标(末尾两个二进制位存 10,然后 \(4\times 5e8\) 正好 \(2e9\)),同理 \(n\) 个存 \(Y\)(末尾 11),然后存一个 \(n\) 的排列 \(\{p\}\),使得 \(X\) 坐标第 \(i\) 小的对应 \(Y\) 坐标第 \(p_i\) 小的构成一个点。
前面的 \(X,Y\) 存起来没有问题,但是最后排列的值域会达到 \(2\times 4e4\times 4e4=3.2e9>2e9\)(末尾标识符 0,\(i\) 下标,\(p_i\) 的值)。
我们发现我们其实浪费了信息资源,因为这样 \(3.2e9\) 我们甚至可以存一个 \(n\) 长度值域 \([1,n]\) 的整数序列了,所以有排列的性质我们没有用到。
对了!
所以再加上占位符也不超过 \(2e9\)。
所以我们对 \(\{p\}\) 求一个前缀和 \(\{q\}\),这样 \(\{q\}\) 一定是单调不减的。
所以我们直接存 \(\{q\}\) 加占位符即可,最后将乱序的 \(\{q\}\) 排序后差分即得到 \(\{p\}\),问题就迎刃而解。
Code
点击查看代码
#include<bits/stdc++.h> #include"treasure.h" using namespace std; #define vi vector<int> #define For(i,j,k) for(int i=j;i<=k;i++) #define Rof(i,j,k) for(int i=j;i>=k;i--) #define pb emplace_back #define mkp make_pair #define fir first #define sec second struct node{int x,y,rk;}; bool cmp (node x,node y){return x.x<y.x;} bool cmp2(node x,node y){return x.y<y.y;} int n; vi encode(vi X,vi Y){ vi res,p; vector<node> v; n=X.size(); For(i,0,n-1) v.pb((node){X[i],Y[i],0}); sort(v.begin(),v.end(),cmp2); For(i,0,n-1) v[i].rk=i; sort(v.begin(),v.end(),cmp); For(i,0,n-1) p.pb(v[i].rk); For(i,0,n-1) res.pb(1+4*X[i]); For(i,0,n-1) res.pb(3+4*Y[i]); For(i,1,n-1) p[i]+=p[i-1]; For(i,0,n-1) res.pb(2*p[i]); return res; } vi decode(vi w){ n=w.size()/3; vi X,Y,res,p; for(int i:w){ if(i&1){ if(i&2) Y.pb(i>>2); else X.pb(i>>2); }else{ p.pb(i>>1); } } sort(X.begin(),X.end()); sort(Y.begin(),Y.end()); sort(p.begin(),p.end()); Rof(i,n-1,1) p[i]-=p[i-1]; For(i,0,n-1){ res.pb(X[i]); res.pb(Y[p[i]]); } return res; }
然后 APIO 主办方还发了衣服、袋子和牌子,感觉好好主要是颜色鲜艳。
我大杭二九个人就硬生生把我 rand 去和别的学校的老哥住了。什么叫铁眉笔啊。
不过结果论来看好像室友是 Hydrooj 站长并且认识了。感觉变成了欧皇。——wyl
宾馆和 zqs 住。
一直摸鱼,打雀魂,iwanna。
晚饭就挺好吃的,还有兰州拉面,但是全装在一盘了,味道混了。
然后做核酸:6:30 的时候超多人,7:10 的时候完全没人,直接做好。
然后问了门卫大叔,说小卖部在大门出门右左转 10m。
宾馆内有自助售货机卖的是老坛酸菜牛肉main。
然后 wyl 拉我们去玩狼人杀,然后我把wsy zqs wds拉过去了。
一开始他们三个蒙在鼓里。
然后就活起来了。
有一局我是预言家,然后直接选警长我一个新手能这样一定是真预言家。然后就一路开挂,直到被刀了最后输了。
再一局就我、wsy、zqs三个新手是狼,然后二中一般不相信我们是狼,而且wds是干扰选项,就开挂胜利。
22:45 了,不早了睡了,明天早上还有课。
晚上和zqs在谈政策聊太久了也有可能是出门玩太激动了,导致 0:30 才睡。
5.27
早上 6:45 的闹钟把我吵醒。
早饭海星,培根鸡蛋薯条西柚汁真解油。
7:00 开吃吃完 7:23,这时二中一堆人才过来,但是好像自助餐被吃得不多了。
上午 3.5h 的课好无聊啊我打游戏+睡觉。
本来台下安静的,但是 djq 不会控场,后面大家吵起来了 a bit。
旁边一位看起来文静的教练也是进行的一个骂,然后主动和我说:
djq 讲的,会的人听得懂,不会的人还是听不懂。
其实我觉得 djq 讲得确实不算差,但是口音比较 naive,而且设备的问题不会用 PPT、记事本,然后讲各种计数+卷积+多项式exp/ln,听得云里雾里。
为啥我对多项式一窍不通啊——我 & 5ab
然后 djq 感觉就是纯理论人,不太会啥电脑软件。
于是不用 PPT,直接手写 latex 在记事本上给我们看。
体会一下,一整节课都是这样的东西:
评价:
好吧,上午就这样浑浑噩噩过去了。
看了一眼之后的讲义,比 djq 的友好太多了,心里有了安慰。
ez 的说下午的集合幂级数就集体不去了,因为lj讲过。
然后吃了午饭做了核酸,还算快。
由于明天比赛大概率会饿,我去小卖部买了点旺仔QQ糖(和wsy wds zqs分了吃)充饥的东西。
然后我发现没有房卡上不去了,我想着先蹭到 6 楼再上 8 楼,谁想到我个笨蛋连个楼梯都找不到,只能回 1 楼叫 wsy 把我带上来。
所有人都知道了,但是不知道去哪里:
下午讲 FWT,还好大致懂了但是代码绝对不会写。
不过讲例题的时候还是云里雾里的,咱就是说不要把自己定义的记号和一般化的记号搞混啊。
一天下来被多项式折磨死。
做多项式题就像嗑药——pinkrabbit
啥多项式 exp ln inv pow 都不会。
我是不会说下午的课 wsy wds 在麦块屠龙的。
xmc 的赞赏:
摸鱼的时候看房卡,发现:
@侃哥侃英语 人 类 低 质 量 翻 译 鉴 赏(9)
饭非常好评。自助餐能吃饱还挺好吃。——wyl
晚饭吃了真假羊肉串:
我、wyl、wwc、wxw、wn、xay、yzc、xyr、zty、tyq 几个甚至偷闲玩了一局狼人杀,可刺激了。
当时十一人局,我及wwc、yzc、xyr是狼,然后预言家、女巫、骑士、守卫、警长。
一开始 wwc 当警长被 xay 骑士戳死了 qwq。
然后因为 yzc新手一直笑场外,xyr 当时力挺 wwc,然后两晚死三狼。
就剩我了,还有 6 个好人。
然后我就一点一点攻于心计挑拨离间,他们也看我小白,就没太怀疑我。
六杀,太爽了。
晚上开幕式,信息量巨大。
开局先随机抽了几个幸运儿上台演讲。
然后放了一个关于准备工作和入场的 VCR有 wyl 入住做核酸的三个角度特写/ww。
甚至还有舞蹈和萨克斯才艺晚会。
之后让本校(南京外国语学校)的孙悠然女同学大佬演讲。
最后就是重(物理)头戏——dzd(杜子德)教授。
简介
1984年至1996年,于中科院计算所从事研究工作;
1996年9月至2004年3月,任中国计算机学会专职副秘书长;
1998年5月,创建中国计算机学会青年计算机科技论坛 YOCSEF;
1998年起,负责全国青少年信息学奥林匹克竞赛 NOI,任竞赛委员会主席。成功策划和组织由中国主办的2000国际信息学奥林匹克竞赛(IOI 2000),任执行委员会主席;
2004年4月至2021年3月,任中国计算机学会秘书长;
2005年被选举为首任IOI主席;
2006年被中科院计算所聘为研究员;
2021年3月起任香港中文大学(深圳)校长顾问;
2021年9月起任深圳市人工智能与机器人研究院执行院长。
然后由于话筒不好+本身特有的口音,非常滑稽。
当然听得清楚的话也非凡:
开幕式时正好领了密码条。
关于密码条没有密码这回事。
我爸发了去年初二选手大佬们的成绩,ssfd。
wyl 传来话:lj 让我们认真对待,好好考。
5.28
昨天又睡晚了,感觉考试不妙。
匆匆吃了早饭,然后去一楼牡M丹D厅试机。
lj给我买了尖叫,感谢虽然后面发现水随便拿。
发现是 NOI Linux 系统!!!连 Dev 都没,能用的只有 VSCode 和 CodeBlock,心态一崩。
然后我去尝试 VSCode,根本不会,同 wsyear 转向 CodeBlock。
Sleep 键就在 Backspace 上面,按到不止一次了,强制拆除拆按键能手。
这时 dzd 来观摩了,我们鼓掌欢迎。
发现 CodeBlock 和 Dev 挺像的,好像没有想象中的那么不顺。
然后开始狂打缺省源。
开考了,结果同时埃及主办方的服务器崩了,最后是技术发 ftp pdf 题面,此时已经 20min 了,心态二崩。
然后发现我昨天好像吃坏了,出去闹肚子了,心态三崩。
终于能好好写题了。
T1 一眼就蒙,好像 practice T3 信息压缩传递题。
T2 发现暴力超好写 \(O(m+nk)\) 拿了 \(60\) 跑路。
T3 感觉是全场最简单的,稍微想了想 91.36 就满足了直接润。
「哈哈哈 150 多,我好强!」——当时的自信
然后又去想 T1,推了 1h 验证是正解就开始打。
打打打打交了两发 WA 了。
然后我的代码就是冗长,加上 CodeBlock bzd咋调试,APIO 独特的交互方式,直接肉眼调。
最后一发交了评测机 queue 能绕地球。
属实是 API 赛制了。
总共去厕所了 \(6\) 次监考都惊呆了!
赛后发现宝玲了 /ll,心态四崩。
然后就一直玩狼人杀,晚上的 OI 活动也没去ez的说就是国家队答疑,还在隔壁房间打雀呢。
5.29
早起抢饭。
lxl 讲课,我是一点都没听懂,问了一圈 ez 的他们说本来懂的,结果现在不会了。
然后中间 dzd 混入看到我们在玩IO游戏,这时主持人直接欢迎,网线那头的 lxl 都懵了。
中间 lxl 接外卖电话+水群,xswl。
中午 lj 带我们吃小龙虾/se。
\(10\) 人 \(20\) 斤+各种副菜。
再次感谢 lj。
然后下午我们就摸鱼玩狼人杀,没去听 NP-hard。其实 wn 去听了回来评价太理论+偏+不考。
xay 还穿了 bmh 短袖,非常有亲切感但是把校徽拆了。
修宝!我的修宝!——ez人的蜜汁行为(?)
有必要狼人杀单独出一章了。
闭幕式不去了,听说是各省表演文艺晚会就真的只是唱歌。
然后就整理东西润了ahahaha。
车上甚至还在玩狼人杀(双身份)。
lj 说让我学学 yzc(coding)。
车上知道了 lj 的男孩小学了。
回程为啥这么快啊,只要 2h。
回杭州了,悲喜交加。
(↑既然 zty 空间里放我照片那我也不客气了哈)
认识的人 + 新认识的
wdssean wsyear daniel
wn wyl wxw wwc xyr yjj zty xay yzc
tyq fkq(PrincessQi)why(缩写,不是英文) szh xze(Macesuted)
狼人杀
转自 wyl:
一群萌新 xjb 打。全是血压操作。节目效果太好了记一下。
R1
A(真预):我是真预,我金水 B。
B(好人,A 右手第一个):我不是预言家,我觉得 A 给我发的金水有问题,出他。
R2
A(萌新,狼人,晚上):哈哈哈哈哈哈哈哈哈。
然后第二天被盲出了。
R3
场上还剩三个人。警长一民一狼。
民和狼对了个眼神把整场的警长冲了。
R4
狼美板子第一晚死了三个人。分别是预言家女巫平民。
怎么回事呢?
原来是狼人刀了预言家。女巫私人恩怨把狼美毒了带走了平民没交药。
直接把预言家气了个半死。第二晚女巫被刀了还自救不了。
关键这把后面狼人还犯病给好人赢了。太神奇了。
R5
丘比特三狼局 A(非恋狼人)第一晚自刀骗银水。
上警成功后第二晚接着自刀被守卫守了。
这时候两个狼队友被连起来吃毒了。
第三晚,接着自刀,把自己刀死了。
R6
(一个近似白狼骑的板)
A(白痴):我是石像鬼,我昨天摸了 B(法官)是个守墓人,哦,我还是女巫,我昨天银水 C,哦哦不对,我是预言家我查杀 C,对的对的。
于是从今以后跳白痴都这么干。
收获
并没有听懂啥课。
APIO比赛并没有打好。
学会了狼人杀。
面基了ez的人。
认识了外校的(结果发现是 Luogu 熟人)。
APIO 三道题题解
Emmm 考虑了一下还是直接等 Luogu 的题解吧。
完结撒花。
本文来自博客园,作者:ShaoJia,版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?