THUPC2023游记

2023.2

THUPC 报名!

和 unputdownable,猫猬兽组队,队名 XJ 五队。

devin 让我们填毕业年份 2028。/qd

收货地址填了 重庆市第114514中学冯阳阳纪念谷学校

upd 性别填 其他 被拒了。/qd

2023.3.4

THUPC 2023 初赛测试赛!

\(3\)\(4\)\(13\) 点联络群消息:

## OJ网址

thupc2023.thusaac.com

## 环境测试 (https://thupc2023.thusaac.com/contest/4/home)

- 时间:2023/3/4 13:00 ~ 2023/3/5 10:00
- 语言及编译选项与正式初赛相同
- 所有参加环境测试的选手**共用**如下账号,因此您的提交能够被其他人看见  
  密码条:
  username: thupc_test
  password: ec76d8
- 正式比赛使用的用户名和密码条将在报名截止(2023/3/5 10:30)后生成并通过报名网站 (https://signup.thupc2023.thusaac.com/)发放

然后发现公用号可以发提问!

已解决 提问 THUPC测试 03-04 13:14:07 解决 THUPC测试 03-04 13:14:22
我, 03-04 13:14:07:
膜拜国际特级大师周康阳大佬

乐。

然后此时由于 NOI 春测刚结束,没管,去口胡了春测,感觉梦回普及组!不过被最后一道 Itst 题拉回现实了。

然后开摆。

大概下午 \(3\) 点半左右开始做题。

题面下载

然后去提问区问了一句:

我, 03-04 15:34:54:
测试赛题解赛后会公开吗

回复是

管理员, 03-04 16:54:54:
这三道题是「CodePlus 8 × HWS第五期 - 决赛」复刻,已经帮您联系出题人,希望他们不鸽🙏

/qd

发现没人过 B,开题看了眼。

感觉是憨憨数位 dp,枚举取模后结果即做完。

然后开始写,第一次交 MLE 了(开了 map),第二次交 TLE 了(递归大常数),最后卡了卡常才过。

代码:

// 膜拜国际特级大师周康阳大佬,今天在 THUPC 测试赛首页称您为大夏尊贵的大名,一股敬佩之油生然而,您在 THUPC 测试赛为国争光,扬我华威名,向您献上最为真挚的膜拜。

// 那就是希望。
// 即便需要取模,也是光明。

#include <algorithm>
#include <stdio.h>
#include <vector>
typedef long long llt;
typedef unsigned uint;typedef unsigned long long ullt;
typedef bool bol;typedef char chr;typedef void voi;
typedef double dbl;
template<typename T>bol _max(T&a,T b){return(a<b)?a=b,true:false;}
template<typename T>bol _min(T&a,T b){return(b<a)?a=b,true:false;}
template<typename T>T lowbit(T n){return n&-n;}
template<typename T>T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<typename T>T lcm(T a,T b){return(a!=0||b!=0)?a/gcd(a,b)*b:(T)0;}
template<typename T>T exgcd(T a,T b,T&x,T&y){if(b!=0){T ans=exgcd(b,a%b,y,x);y-=a/b*x;return ans;}else return y=0,x=1,a;}
template<typename T>T power(T base,T index,T mod)
{
    T ans=1%mod;
    while(index)
    {
        if(index&1)ans=ans*base%mod;
        base=base*base%mod,index>>=1;
    }
    return ans;
}
const ullt Pow10[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,
                    10000000000,100000000000,1000000000000,10000000000000,
                    100000000000000,1000000000000000,10000000000000000,
                    100000000000000000,1000000000000000000,-1llu};
uint Nxt[10][10],A[10],tp,a,b,c;
ullt M[3][19][2][10][305][305];
bol Gone[3][19][2][10][305][305];
ullt Lim;
ullt count(uint id,uint NowBit,uint Allzero,uint KmpNow,uint ModB,uint LeftModC){
    if(KmpNow==tp||(!Allzero&&!ModB))return 0;
    if(!~NowBit)return!Allzero&&!LeftModC&&!id;
    if(!LeftModC)return 0;
    if(Gone[id][NowBit][Allzero][KmpNow][ModB][LeftModC])
        return M[id][NowBit][Allzero][KmpNow][ModB][LeftModC];
    Gone[id][NowBit][Allzero][KmpNow][ModB][LeftModC]=1;
    ullt&ans=M[id][NowBit][Allzero][KmpNow][ModB][LeftModC];
    ModB=ModB*10%b;
    if(id){
        uint t=Lim%Pow10[NowBit+1]/Pow10[NowBit];
        if(t){
            ans=count(0,NowBit-1,Allzero,Nxt[KmpNow][0],ModB,LeftModC);
            for(uint i=1;i<t;i++){
                ModB=(ModB+1)%b,LeftModC=(LeftModC+c-Pow10[NowBit]%c)%c;
                ans+=count(0,NowBit-1,0,Nxt[KmpNow][i],ModB,LeftModC);
            }
            ModB=(ModB+1)%b,LeftModC=(LeftModC+c-Pow10[NowBit]%c)%c;
            ans+=count(id,NowBit-1,0,Nxt[KmpNow][t],ModB,LeftModC);
        }
        else ans=count(id,NowBit-1,Allzero,Nxt[KmpNow][0],ModB,LeftModC);
    }else{
        ans=count(0,NowBit-1,Allzero,Nxt[KmpNow][0],ModB,LeftModC);
        for(uint i=1;i<=9;i++){
            ModB=(ModB+1)%b,LeftModC=(LeftModC+c-Pow10[NowBit]%c)%c;
            ans+=count(0,NowBit-1,0,Nxt[KmpNow][i],ModB,LeftModC);
        }
    }
    return ans;
}
int main()
{
#ifdef MYEE
    freopen("QAQ.in","r",stdin);
    // freopen("QAQ.out","w",stdout);
#endif
    ullt l,r;scanf("%llu%llu%u%u%u",&l,&r,&a,&b,&c);
    while(a)A[tp++]=a%10,a/=10;
    std::reverse(A,A+tp);
    Nxt[0][A[0]]=1;
    for(uint i=1,j=0;i<tp;i++){
        for(uint o=0;o<10;o++)Nxt[i][o]=Nxt[j][o];
        Nxt[i][A[i]]=i+1,j=Nxt[j][A[i]];
    }
    ullt ans=0;
    Lim=r+1;for(uint i=1;i<c;i++)ans+=count(1,18,1,0,0,i);
    Lim=l;for(uint i=1;i<c;i++)ans-=count(2,18,1,0,0,i);
    printf("%llu\n",ans);
    return 0;
}

// 那就是希望。
// 即便需要取模,也是光明。

然后看 A。

套路地取相邻异或后,找了很久充要条件,最后调出来了。

代码:

// 膜拜国际特级大师周康阳大佬,今天在 THUPC 测试赛首页称您为大夏尊贵的大名,一股敬佩之油生然而,您在 THUPC 测试赛为国争光,扬我华威名,向您献上最为真挚的膜拜。

// 那就是希望。
// 即便需要取模,也是光明。

// 判掉长为 1 的序列。
// 对答案有贡献的信息只有相邻两项的异或值。(对吧)
// 异或完后再看与 i xor (i+1) 数列的匹配。
// i xor (i+1) = 2 lowbit(i+1) - 1
// 因此可以从不是该类型的数两侧断开。
// 断开后,我们把每个数用 log_2(v+1) 还原。
// 然后怎样的情况是合法的?
// 相邻两个 1 间距恒 2
// 相邻两个 2 间距恒 4
// 相邻两个 3 间距恒 8
// ...
// 等等。
// 同时,
// 每 2 个中恰有 1 个 1,
// 每 4 个中恰有 1 个 2,
// 每 8 个中恰有 1 个 3,
// ...
// 等等。
// 容易发现这个是合法的必要条件。
// 但是不充分。
// 譬如
// 1 7 1 3
// 这种。
// 考虑接下来出现的比当前小的元素应有的形态。
// 1 2 1 3 1 2 1 4 ...
// 直接扫描线算出每处右侧合理端点即可。
// 复杂度 O(n\log v)。

#include <algorithm>
#include <stdio.h>
#include <vector>
typedef long long llt;
typedef unsigned uint;typedef unsigned long long ullt;
typedef bool bol;typedef char chr;typedef void voi;
typedef double dbl;
template<typename T>bol _max(T&a,T b){return(a<b)?a=b,true:false;}
template<typename T>bol _min(T&a,T b){return(b<a)?a=b,true:false;}
template<typename T>T lowbit(T n){return n&-n;}
template<typename T>T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<typename T>T lcm(T a,T b){return(a!=0||b!=0)?a/gcd(a,b)*b:(T)0;}
template<typename T>T exgcd(T a,T b,T&x,T&y){if(b!=0){T ans=exgcd(b,a%b,y,x);y-=a/b*x;return ans;}else return y=0,x=1,a;}
template<typename T>T power(T base,T index,T mod)
{
    T ans=1%mod;
    while(index)
    {
        if(index&1)ans=ans*base%mod;
        base=base*base%mod,index>>=1;
    }
    return ans;
}
ullt A[100005];uint Last[65];
int main()
{
#ifdef MYEE
    freopen("QAQ.in","r",stdin);
    // freopen("QAQ.out","w",stdout);
#endif
    uint n;scanf("%u",&n);
    for(uint i=0;i<n;i++)scanf("%llu",A+i);
    for(uint i=1;i<n;i++)A[i-1]^=A[i];
    ullt ans=n--;
    // for(uint i=0;i<n;i++)printf("%llu%c",A[i]," \n"[i==n-1]);
    for(uint i=0;i<=61;i++)Last[i]=n;
    for(uint i=n-1,r=n,v;~i;i--)if((v=(lowbit(A[i]+1)==A[i]+1?__builtin_ctzll(A[i]+1):0))){
        if(Last[v]<i+(1llu<<v))_min(r,Last[v]);
        else if(Last[v]>i+(1llu<<v))_min(r,i+(1u<<v));
        Last[v]=i;
        for(uint j=1;i+(1u<<j)<=r;j++)
            if(Last[j]>=i+(1u<<j))
                r=i+(1u<<j)-1;
        for(uint j=1;j<v&&i+(1u<<(j-1))<r;j++)
            if(Last[j]!=i+(1u<<(j-1)))
                r=std::min(Last[j],i+(1u<<(j-1)));
        ans+=r-i;
    }else r=i;
    printf("%llu\n",ans);
    return 0;
}

// 那就是希望。
// 即便需要取模,也是光明。

调出来已是 0:06,决定摆了,睡觉去了,为明天正式赛提供更好的状态!

2023.3.5

THUPC 初赛!

mws 正开,upd 倒开,我中开。

说是 10:30 给密码条,然后一直到 11:00 都没给。/qd

img

img

/qd/qd/qd

开始后还服务器错误了。/qd

upd 开小作文题,结果不会然后来问我们。/qd

我开 喵了个喵 II,以为是模拟赛原题,交了然后 WA 了。/qd

upd 说是贪心,交了然后 WA 了。/qd

后来没过,去看 H 了。

口胡同余最短路,没过。/qd

upd 此时已经过了 4 题。/qd

然后推给 mws,他过了 H。/qd

我跟榜做 C,然后过了。/qd

然后因为 upd 已经过了 5 题,开始看 F。

而我去写 D 了。/qd

比赛差 1h 结束时发现他让我看一下 F 的一个代码怎么优化,我没细看,让他自己看。/qd

然后比赛快结束时我调出了 D 的树剖分块 + 根号重构,交上去被卡常了。/qd

看了 F,发现是常系数齐次线性递推,然而来不及了。/qd

最后封榜后一题没过,喜提 7 题,最终排名 80。/oh

顺带讲一下槽点。

关于 #pragma 问题的说明
首先我们对此深表歉意,我们没有在比赛前考虑到是否允许使用 #pragma。比赛开始后有队伍对此提问,我们讨论后决定全程禁用 #pragma,但时间已经不允许添加“在选手提交代码时进行检查”的功能,于是我们在赛后封禁了所有含有 #pragma(排除O2)的提交。我们仅通过比赛公告进行了通知,没有传达到全部选手,我们再次表示歉意。

我们最终的修复方法是:删除所有选手代码中的 #pragma 语句,重测这些代码。(已完成)
(P.S. 一道题目计入罚时的次数 = 第一次AC前所有非CE提交次数。因此如果您在一份包含 #pragma 的AC代码后又提交了若干份代码,之后的这些代码不会计入罚时)
此外,按群友建议,我们将在下次比赛开始前,把所有可能影响成绩的规则以文本形式通知到各位参赛选手。

然后有一个用户调查,我写了

C 被卡 `vector` 常数了。/kel (预处理因子部分,最后写了欧拉筛才卡过)

然后一开始没看到公告内不可 `#pragma`,被 ignore 了。/fn
能不能公告修改浏览器自动报弹窗啊。/kel

D 写了树剖分块 + 根号重构,花 2h 码了 10k 代码,被卡常了,没过。/kel
能不能像去年一样开 10s 啊,实在让暴力过几个就过了吧,别让分块被卡常了。/kel
毕竟现在这个时限暴力也能过啊。(学习 Ynoi2077 好榜样(不是

以及,能不能给出第一个 TLE 的点的运行时空情况啊。/kel

不过,不出意外,应该可以勉强苟进复赛!

2023.4

复赛邀请函发了,我们没收到。/kk

看看有没有二轮邀请吧。

毕竟很多队伍会去 pkucpc 和 icpc 湘潭。

2023.5.7

收到二轮邀请函了。

改了一下报名信息啥的,地址什么都填好了。

2023.5.12

收到正式邀请函了。

恭喜你们的队伍 学军中学五队 在 2023 年清华大学学生程序设计竞赛暨高校邀请赛(后简称 THUPC2023) 初赛中表现出色!我们诚挚地邀请你们来清华大学现场参加 THUPC2023 的决赛。

决赛的报道和试机时间为 5 月 27 日下午 2 点到 5 点,比赛时间为 5 月 28 日上午 10 点到下午 3 点,地点均在校内的计算机开放实验室。颁奖和讲题时间为 5 月 28 日下午 3:30 到 5:30,地点在校内的中央主楼后厅。更多比赛时间和地点的信息,请以公众号“酒井算协”的后续通知为准。

此外,我们需要收集大家的衣服尺码和入校预约信息,请大家在尽快填写问卷 https://wj.qq.com/s2/12330110/c51f/。

最后,期待能与大家在清华大学一同度过一个美好而愉快的周末!

清华大学学生算法协会

官方 QQ 交流群:553210963,870699338
官方公众号:酒井算协
官方 B 站账号:清华大学学生算法协会

2023.5.25

踏上前往北京的火车。

入住 bnds 宿舍。

bnds 住宿条件看上去很高档。/se

2023.5.26

上午是 bnds 讲课,下午是模拟赛题讨论。

晚上得到了一些关于 C 类的消息。

2023.5.27

上午正常训练。

下午试机。

拿到了 SF 徽章。StudyingFather:徽章滞销,帮帮我们。

面到了很多外校大佬,譬如 Lyckcat、Chinese_zjc、QwQcOrz、Qiuly、Alpha1022、MoQZ。还单向面了很多大佬,譬如 flowerletter、mrsrz。还看到了 E.Space 等人。

喜闻乐见的签名时间,最难绷的就是经典复刻两红一黑过河卒。

img

最后的签名墙长这样:

img

img

猫猬兽和 pog 分别都赶来了。

下去后领了物资,报队名时我们队伍名字显得特别诡异。

我们座位在中间机房。看了眼座位表,我们前一个队是镇海队,后一个队是 jiangly 单排,再往后一个是纪中队,再往后就是 dx pog cmll 队了。

四面很多人在游走,包括但不限于 E.Space 和 lxl。

试机赛四道题目依次分别是 A+B Problem、造计算机、数正方体和德州消消乐。

我写了 A+B Problem,upd 写了德州消消乐,mws 写了数正方体(写挂了),然后我们就润了。

发现隔壁镇海队有键盘垫赠送,我们没有,怎么回事呢。原来要初赛优异队伍才有啊。

没有加训 ACM。

去秒了个 ABC 的 Ex。

2023.5.28

进场了。换座位了,这次坐在东机房。终于不至于被旁边 jiangly 干趴下了!(然而 jiangly 根本没来,去打隔壁 pkucpc 了,怎么会是呢!)

对面队伍有漏保,左后方有 zak sjy L,左前方有 Mophie zmx Mer alpha Qiuly 月神,右边有出题人 E.Space 随机游走。四面埋伏!

怎么有高素质选手开赛前打板子的啊!

怎么有高素质选手开赛前拿到纸质题面的啊!

开赛的时候工作人员把宣布比赛开始鸽了。所以完全没反应过来。

怎么有 bot 队 4s 过作文题啊!print('kejie') 能写这么快吗!

登录时就听见对面漏保队在大喊柯洁。/kx

开场通览了一遍,A 很图论,B 很贪心,C 很毒瘤,D 很清奇,E 很&;?>#&*%<%$^(鉴定为小 E 题),F 很神秘,G 很%#[%#?)@<^&(鉴定为小 E 题),H 很一眼,I 很 poly,J 很难写,K 很博弈,L 很 lxl,M 很整活。

我看到 H 后一眼秒了,直接开写。

然后随机开题,upd 觉得 G 很简单,直接开冲,没整出来。

mws 写了 D,罚了一发过了。

我一眼秒了 A 的 \(O(2.83^k+k^22^k+mk)\) 做法,光荣过不了样例。

机时给 upd 写 G,我想了想把 A 细节搞清楚了,顺带看了看 B、K。

upd 没冲出 G,我开始调 A,光荣 TLE。然后加了各种卡常后就过了。

然后 upd 开始写 J,漏判 -1 WA 了好几发,最后才过。由于土豆服务器又炸了,比赛延时 5min。

我和 upd 口述了 B,大概讲了下外层的贪心,然后发现自己不会内层判定。upd 一眼秒了内层贪心,非常厉害!

然后巨大恶心数位 dp K 留给了 upd,我看 F,和 upd 确认了一下做法。

然后 upd K 调了一年,比赛结束前 20min 才发现 \(1\oplus2\oplus\dots\oplus n\oplus m\) 写挂,upd 直接懵掉了,于是我改了改那里就过了。

然后我开始 speed run 做 F,比赛结束前 5min 写完,一交 WA 了!

\(7\) 题遗憾离场!/fn/fn/fn

zak 队封榜后没过题,喜提 \(9\) 题(zak 是 L 题验题人,不能写 L,给 sjy 写被卡常了)。pog 队题数为标准 \(8\) 题。不过最后我们以微弱罚时优势殴打了 Mophie 队,怎么会是呢。

讲题时有大约一半题是 Itst 出的,E,G 是 E.Space 出的,F 是 JV 出的,L 是 lxl 出的,M 是保密老师出的。A,D 出题人不认识。

E,I 分别只过了一只队伍,G 无人生还。E.Space 的喵了个喵抱枕送不出去了。/kx

比赛打到最后看到对面漏保队开始打牌。蚌埠住了。

颁奖时 zak 队拿了三等奖,遗憾离场。hhz 队 rank 2,喜提 \(¥8192\) + 键盘。「被李子弥打爆了」。

pog 和 mws 提前回去了。第二天他们还要文化课。/kk

晚饭徐老师预定了,把很多清华学长叫过来了,包括但不限于 Siyuan zhouzhengdong Mr_Spade。

hehezhou 到场这事徐老师还不知道。/qd

被 Mr_Spade 认出来了。(Mr_Spade 去年暑假给我们机房线上讲过课)

posted @ 2023-05-26 13:08  myee  阅读(997)  评论(3编辑  收藏  举报