考试心得8
2026/9/26 | 2026CSP-S模拟赛25
摆烂的一场。模拟赛时间分配严重不均。改题效率低下。
T1写了1.5h只有50分,且想不出来正解(正解比较难),而且T1还挂了,疑似是输出的问题,(printf和setprecision)的区别。
cout<<fixed<<setprecision(14)<<x<<endl;
T2因为没开longlong挂了,加之复杂度不正确,没有拿到n<=20的分。
T3没开longlong,数组开大挂了。
T4,因为前面耗费大量时间,导致简单单暴力没时间打了。
这场最主要是题面比较恶心,需要一定的理解能力。难度也挺逆天的。暴力打满分数就挺可观的。但是冲不出来正解TT。
2026/10/4 | 2026年NOICA联盟-NOIP模拟赛(七)
不想写总结。
T2。赛时虚空思考了非常久的排列。最后才想明白是怎么构造排列的。但是就是没有写成分治啊啊啊啊!!以及忘掉了双指针状物。
找某个特定位置考虑双指针
正解也是相当不难的暴力思路。就是会发现复杂度瓶颈在于需要找到多个可能的最小值。考虑每次只用找到一个,剩余的放到下次递归里。如果当前的b值>本区间最大值,就证明这是上一轮的遗留物,赋成上一轮的值即可。
2026/10/5 | 2026CSP-S模拟赛29
T1取模要取干净!!但凡大于等于模数的都要先取模再运算!!
T3进行了tarjan的学习,然后似乎是终于对点双和边双有印象了(两点之间有两条路径)。发现考场的其实已经发现不少性质了。。但是想得太乱加上不会归纳整理。然后连5pts都没有拿到。
事已至此放个点双的板子吧(附带求边数):
点击查看代码
void tarjan(int u,int rt,int fa)
{
dfn[u]=low[u]=++idx;
stk[++top]=u;
if(u==rt&&!head[u])
{
dcc[++tot]++;
return ;
}
for(int i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(!dfn[v])
{
st1[++top1]=i;
tarjan(v, rt, u);
low[u]=min(low[u], low[v]);
if(low[v]>=dfn[u])
{
tot++;
int y;
do{
y=stk[top--];
dcc[tot]++;
}while(y!=v);
dcc[tot]++;
do{
y=st1[top1--];
cnt[tot]++;
}while(y!=i);
}
}
else if(dfn[v]<dfn[u])
{
if(v!=fa) st1[++top1]=i;
low[u]=min(low[u], dfn[v]);
}
}
}
2026/10/7 | 2026年NOICA联盟-NOIP模拟赛(八)
写了好久的T1(当时没看到每秒只能加速一次调了特别久),而且没有发现k×(1+v)×v/2模v的余数不是0就是v/2,只需分v的奇偶讨论即可。其余的全都想到了,所以我赛时就一直在想怎么求出使(s-k×(1+v)×v/2)%v=0的最小的k,甚至还拿exgcd去求qwq。以及二分时计算可能爆long long,要开int128,导致我二分上界写小了。所以这个T1挂了一坨啊。这还是个绿。
其实考试时是有觉得自己想得太绕的。这个时候我们就应该停止死磕了。
T2很温和的送了60分。虽然我感觉这个部分分和正解没什么关系啊。因为T1写太久所以赛时也没有去想正解。就是首先发现答案是单调不递增的。对于上一个答案x,若是这一次询问答案不减,就说明在p排列中,存在一个位置i,使得 i及以后的>=x的数 比 i及以后的炸弹数 多。这样子就证明一定有大于等于x的数成为最终的答案。所以如果所有位置都不符合条件,就说明x--。当然x不一定只减一次。
用线段树维护每个i及以后的>=x的数-i及以后的炸弹数。然后比较全局最大值是否小于等于0即可判断。修改只需找到前面那段区间。
这是个青题。。。。
你记得我 最纯净的轮廓
握住小小风车 和放肆的梦
你小心 保管我 不思议的念头
秘密 从不会 对谁泄露

浙公网安备 33010602011771号