考试心得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即可判断。修改只需找到前面那段区间。
这是个青题。。。。


你记得我 最纯净的轮廓
握住小小风车 和放肆的梦
你小心 保管我 不思议的念头
秘密 从不会 对谁泄露

posted @ 2026-10-07 18:21  zhouyiran2011  阅读(6)  评论(0)    收藏  举报