NOI 2023 游记
觉得应该写一写游记,毕竟大考机会很少,把每次考试的策略记下来没准会有用。
Day ?
没进省队,意料之中,买了 D。当时 pdqb 心情不好,没有报名,血亏。
教练说不应在国赛上做过多准备,我觉得很对。
Day -9
久仰 UNR 大名,没想到这天就是 Day 0,我还没背笔试呢!没有参加。
看了 UNR 2022 D1T1,很快写完了,然后 WA 了两发才过。
Day -8
UNR Day 1。没有切 T1,觉得这场比赛不太好,就没再管了,赛后写了个 T1 最短代码,后来有人更短了。
Day -7
高一有模拟赛,所以没参加 UNR Day 2。
Day -2
和教练、fzj2007 坐高铁,然后打车,晚上到了成都七中旁边的酒店,十二点多才睡,睡前闲着没事给 Dr_Gilbert 发了 [糗大了]
Day -1
教练说早点过去报道,没准儿能买到纪念品,于是我们很早就去了,被拍了好多照片,还被采访了。好多照片被剪到了开幕式里,由于采访时我俩的发言太拉胯,只被剪进去了一点。fzj 把名字签到了空着的签名版的中间,我签到了他左下方。送了不少纪念品,但没发现能买的。我以为 D 类宿舍会被分到一起,然而并不是,和我同住的是 fzj2007、Ignotus 和 ice_cup。中午原来是打算等高二的来了之后一起吃必胜客,结果高二的堵半路上了,王老师带着我们吃的火锅。晚饭在学校吃的,非常有水平,以后的饭都有水平,不再赘述。写了原神。
Day 0
开幕式非常有水平,好评!下午试机、笔试,等着进去的时候我问了问 Ignotus:“不带座次条扣几分?”Ignotus:“
结果笔试真的考了这题!我寻思门口也没贴这题啊(门口啥也没贴),要不是我问了,就要扣分了,Ignotus 好闪,拜谢 Ignotus!笔试用机子登录自己的账号线上答题,题目与给的题库有一定区别,有的题我不确定,好在有惊无险。
得分
Day 1
考试日。感觉纪律不如中考严。机位 D043。
08:00~08:10
开始答题,秒了 T1。
08:10~09:15
写完 T1 了,连过
09:15~10:30
写 T1 的拍。我不太会使 Linux,过程中终端崩了两次(考后分析应该是我数据造错了,导致程序 RE)。写拍的时间竟然跟写 T1 的时间一样长,严重失误。
10:30~12:36
开始做 T2,直接看部分分。前一段时间不知道在干啥,好像是吃东西和上厕所?厕所有人喊“怎么调不出来线段树合并啊!”
想了一下
int r=0;
memset(g,0,sizeof g);
for(int i=n;i;--i) ++g[f[i]],r+=g[i]+1;
return r;
考后发现这就是 return n*2-1。
一看表卧槽怎么这么晚了,赶紧写
ps:十分弱智的俩小时,不知道当时我在干啥。
12:36~13:00
狂写 T3 爆搜,写完了。收卷。
出去之后老师问分,我垫底了。ice_cup 说他打表发现答案与树的形态无关,还打出来了
出分了,没挂,得分
主要失误在于写拍时间过长、中间俩小时不知道在干啥、T3 预留时间过短以至于没写
晚上听讲题,T2 正解也与树的形态无关,差评!
查成绩时看到坐我右边的人了是 ZJ-02。
Day 1.5
虽然叫 Day 1.5,但其实是 Day 1 和 Day 2 中间的一整天。原计划为社会活动,但大运会将在成都举办,上面不允许我们乱跑,于是改为活力嘉年华。
先射箭,第三箭射到第二箭上了,没上靶,寄。然后去敲锣,通关。然后扔飞盘,通关。然后反复尝试另一个扔飞盘,过不去,决定回去排队射箭。在活动快结束时轮到我了,通关,喜提钥匙扣。fzj2007 射中十环,拜谢 fzj2007!Ignotus 通关我觉得最难的“穿越火线”,拜谢 Ignotus!Alex_Wei Ak Day 1.5(通关所有活动),拜谢 Alex_Wei!
排队太久,太阳太闪,有点头疼,睡了一觉好点了。
晚上 fzj2007 押 Day 2 考字符串,我打算复习 SA,然后忘了,成功伏笔。
Day 2
考前问了问 fzj2007 和 Ignotus,得知历年 D2T1 可做,于是打算刚一刚 T1,但想正解不能超过
07:52~08:00
发现 Alex_Wei 坐我右边,杨耀良在我左边监考。
08:00~10:??
开考,做 T1,发现
10:??~11:08
为什么过不去还拍不出来?这么大的样例咋调啊?然后发现样例输出比我答案小很多。仔细读题,发现“你只需输出答案对 long long 换成 int,然后加了一堆取模。然后,然后它就过了所有样例。我懵了,看来之前的写法溢出了,而 sanitizer 没查出来,浪费了我几十分钟,差评!
Alex_Wei 经常上厕所,看他游记,原来是上一次厕所切一道题。听到杨耀良一边监考一边吃东西。
11:08~12:00
发现 T2 暴力有
T3 打算模拟退火,但是发现不好退,保险起见写了个
12:00~13:00
感觉时间够用,想到 Ignotus 说过“SA rk 里有 if(rk[i]<1) rk[i]=1; 考试就结束了。
出场问分,没有垫底。
下午查分,右边 Alex_Wei 那聚着一堆人,他
得分
主要失误在于又双叒叕没有一次写对 Dijkstra,以及没写出 SA。
upd:看代码发现写对 SA 了,
考完一共
Day 3
颁奖,蒋婷婷宣布分数线的时候全场鸦雀无声,结果 Ag 真就
成都下雨,飞机晚点了。
徽章
主要在 Day -2 换了徽章,我有个徽章掉到柜子缝里捡不出来了,还有个徽章给 HE 的淸梣ling留着,后来他徽章不够了没跟我换,所以只换了
1kri
Acestar
Alex_Wei
APJifengc
asmend
Chen_jr
_Cx330
Delov
Dr_Gilbert
fzj2007
_gch_
H_Kaguya
ice_cup
Ignotus
Johnsonloy
Linshey
Mitama
peop1e
sleeping_crawlers
SoyTony
steven144
worldvanquisher
youwike
zfy2006
zhoukangyang
?
?
?
代码
Day 1 看完成绩之后回宿舍,学长说可以把自己的代码拍下来,但是我懒得再去了,就没拍,后悔。Day 2 拍了,以便调试寄了的 D2T2。
home > HE-17 > trade > trade.cpp
#include<bits/stdc++.h>
using namespace std;
const int N=262200,p=998244353;
int n,m,q,f[N],sz[N],h[N],ans;
const long long inf=0x3f3f3f3f3f3f3f3f;
long long g[N];
struct node{
bool sz;
long long tag;
vector<pair<int,long long>>vec;
void build(){
vector<pair<int,long long>>tmp;
for(auto x:vec) if(!tmp.size()||x.second<tmp.back().second) tmp.push_back(x);
vec=tmp,sz=1,tag=0;
}
void upd(int x){
tag-=f[x];
if(sz&&vec.back().first==x) vec.pop_back();
sz=!vec.empty();
}
int sum(){return sz?(vec.back().second+tag)%p:0;}
}tr[N];
vector<int>son[N];
#define ls (i<<1)
#define rs (ls|1)
vector<pair<int,int>>e[N];
long long dis[N];
bool vis[N];
void dij(int s){
for(int x:son[s]){
if(x!=s) e[x].push_back({x/2,f[x]});
dis[x]=inf,vis[x]=0;
}
dis[s]=0;
priority_queue<pair<long long,int>,vector<pair<long long,int>>,greater<pair<long long,int>>>q;
for(int k=0,x=s;k<son[s].size();++k){
while(vis[x]&&q.size()) x=q.top().second,q.pop();
if(vis[x]) break;
vis[x]=1;
// printf("updated %d in %d\n",x,s);
for(auto y:e[x])
if(dis[y.first]>dis[x]+y.second)
q.push({dis[y.first]=dis[x]+y.second,y.first});
}
for(int x:son[s]){
if(x!=s) e[x].pop_back();
if(dis[x]<inf) tr[x].vec.push_back({s,dis[x]+g[x]-g[s]});
}
}
void add(int&x,int y){if((x+=y)>=p) x-=p;}
int main(){
freopen("trade.in","r",stdin);
freopen("trade.out","w",stdout);
scanf("%d%d",&n,&m),q=1<<n;
for(int i=2;i<q;++i) scanf("%d",&f[i]),g[i]=g[i/2]+f[i];
for(int i=1,u,v,w;i<=m;++i) scanf("%d%d%d",&u,&v,&w),e[u].push_back({v,w});
for(int i=1;i<q;++i) for(int j=i;j;j/=2) son[j].push_back(i);
for(int i=1;i<q;++i) dij(i),tr[i].build();
int _sz,_sum;
// for(int i=1;i<q;++i){
// printf("%d:",i);
// for(auto y:tr[i].vec) printf("(%d,%lld)",y.first,y.second);
// puts("");
// }
for(int i=q-1;i;--i){
sz[i]=son[i].size();
if(ls<q){
_sz=_sum=0;
for(int x:son[rs]) add(_sum,tr[x].sum()),_sz+=tr[x].sz;
ans=(ans+(h[ls]+sz[ls]*1ll*f[ls])%p*_sz+_sum*1ll*(sz[ls]+1))%p;
_sz=_sum=0;
for(int x:son[ls]) add(_sum,tr[x].sum()),_sz+=tr[x].sz;
ans=(ans+(h[rs]+sz[rs]*1ll*f[rs])%p*_sz+_sum*1ll*(sz[rs]+1))%p;
add(ans,h[i]);
}
h[i/2]=(h[i/2]+h[i]+sz[i]*1ll*f[i])%p;
// printf("i=%d ans=%lld\n",i,ans);
for(int x:son[i]) tr[x].upd(i);
}
printf("%d",ans);
return 0;
}
home > HE-17 > string > string.cpp
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
char s[N];
int rk[N],sa[N],st[20][N],lg[N];
void ss(int n){
static int id[N],bu[N],p;p=0;
for(int i=1;i<=n;++i) ++bu[s[i]],lg[i]=lg[i-1]+(2<<lg[i-1]==i);
for(int i='b';i<='z';++i) bu[i]+=bu[i-1];
for(int i=n;i;--i) sa[bu[s[i]]--]=i;
for(int i=1;i<=n;++i) rk[sa[i]]=s[sa[i]]==s[sa[i-1]]?p:++p;
for(int i=1;i<n&&p<n;i<<=1){
memset(bu,0,sizeof bu);
for(int j=n-i+1;j<=n;++j) id[j+i-n]=j;
for(int j=1,k=i;j<=n;++j) if(sa[j]>i) id[++k]=sa[j]-i;
for(int j=1;j<=n;++j) ++bu[rk[j]];
for(int j=2;j<=p;++j) bu[j]+=bu[j-1];
for(int j=n;j;--j) sa[bu[rk[id[j]]]--]=id[j],id[j]=rk[j];p=0;
for(int j=1;j<=n;++j) rk[sa[j]]=id[sa[j]]==id[sa[j-1]]&&id[sa[j]+i]==id[sa[j-1]+i]?p:++p;
}
for(int i=1,k=0;i<=n;++i){
if(k) --k;
if(rk[i]<1) rk[i]=1;
if(rk[i]>1) while(s[i+k]==s[sa[rk[i]-1]+k]) ++k;
st[0][rk[i]]=k;
}
for(int i=1,p=2;p<=n;++i,p<<=1)
for(int j=1;j+p-1<=n;++j)
st[i][j]=min(st[i-1][j],st[i-1][j+(p>>1)]);
// for(int i=1;i<=n;++i) printf("%d ",rk[i]);puts("");
// sort(sa+1,sa+n+1);
// for(int i=1;i<=n;++i) printf("%d ",sa[i]);puts("");
// for(int i=1;i<=n;++i) printf("%d ",lg[i]);puts("");
}
int lcp(int x,int y){
x=rk[x]+1,y=rk[y];
int t=lg[y-x+1];
return min(st[t][x],st[t][y-(1<<t)+1]);
}
bool cmp(int x,int y,int l){/*printf("cmp(%d,%d)",x,y);*/return rk[x]<rk[y]&&lcp(x,y)<l;}
int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
int c,t,x,r,n,q,ans;
scanf("%d%d",&c,&t);
while(t--){
scanf("%d%d%s",&n,&q,s+1);
memcpy(s+n+1,s+1,n),reverse(s+n+1,s+n*2+1);
// for(int i=1;i<=n*2;++i) printf("%c",s[i]);puts("");
ss(n*2);
while(q--){
ans=0,scanf("%d%d",&x,&r);
for(int i=1;i<=r;++i) ans+=cmp(x,2*n-x-2*i+2,i);
printf("%d\n",ans);
}
}
return 0;
}
home > HE-17 > book > book.cpp