考试心得3

2024/9/15

link:https://www.gxyzoj.com/d/hzoj/contest/66b0925b7509073c6b14ab11/problems

考试时感觉眼睛想流眼泪,感冒还没好( 做梦一样考完了

还挺后悔的,暴力分很多,T3打了1.5小时0蛋,发现自己就不应该写二分啊

T1,暴力40分走人,不会状压dp,考完后看着wsq的代码一点一点理解了,但预处理挺奇妙的。我何时才能自己推出状压式子啊,阿布,是何时才能想出状态设定啊,没底气。。。

T2,暴力40分走人。貌似是细节题,不想改。但最后改完辣!

T3,前两道题加起来一个半小时就打完了,此题暴力却搞了甚久,始终认为它是二分,导致写得全错了。本来想挽救一下,但实在没想到真的就是无脑枚举啊!考后改了改(指改了1小时)就拿到79分的好成绩,加上map的优化(指无脑记录重复数据)即可获得99pts!!虽然这一分让我调了2个小时,但真的,双哈希也能卡过啊!!!这个题告诉我们:宁可打无脑暴力,也不能空手而归,还有,自己曾经总结的哈希区间求值是从1开始的!!!一定要看仔细!!!

T4没时间了,10分就丢了。又又又......又垫底了。T-T

2024/9/16

link:https://www.gxyzoj.com/d/hzoj/contest/66e776d4f8a2945801bcd317/problems

祝wsq生日快乐,可惜她没来

但波波买了奶茶,还是挺好的(不甜

今天挂38pts,垫底again,就是说四五十分就差了20个人左右,分差头一次真么紧。

省流:打暴力的两天。

T1,数据大水题。原题好像是dp和线段树,应该挺难的,但由于是波波的随机化数据,很简单的能被HACK的代码也能A,但自己因为手造的数据卡了两个小时,100->82,,,

T2,考场暴力数组开大TLE,20->0,正解是dfs+线段树查询,还挺简单的,自己始终卡在一个地方:(id+1)>>1不能写成(id|1)>>1,原先线段树这么写是因为乘过2后必然是偶数,加1就相当于或1,但这里的+1就不能这么写,卡了俩小时,,,,

2024/9/22

link:https://www.gxyzoj.com/d/hzoj/contest/66b0c7117509073c6b151321/problems

表示自己大部分时间都去搞T2样例了,导致T1的50分没整出来。本来T1写的16pts的 O(n3),挺无语的,不知道为啥自己枚举完区间还要遍历一遍,考场代码改两行就50,啊。更无语的是,我加了个错误的优化,导致我原来的16pts都没有了,啊啊啊

T1是线段树,其实考场上想的错误的优化是能延伸到正解的。预处理 1n 的mex值后,从一个区间转移到下一个区间时,如果下一个区间的mex值大于前一个区间,那么这个区间的mex值就要变小,所以要区间修改、查询、求和,用线段树,但考场上我想错了。

T2,考场上不知道推了多久才推出来样例,发现是贪心后狂写。喜提64pts,考后,把中间找到合法区间起始点的循环改成一层,开个 long long 就过了。然后又试了试,把考场交的第一版代码开个 long long 也过了,就是说你一定要相信波波的数据qwq

感觉T3还是挺抽象的,但看完Dyc的题解后好像好懂了一些,结合着luogu题解勉强看懂,挺巧妙的

2024/9/28

link:https://www.gxyzoj.com/d/hzoj/contest/66f746c1f8a2945801c53a36

改完T2精神状态极差,我考场上为什么还自信的认为我A了?

T1,考场上第一次推出dp式子!但我用在线编译发现,它好像会RE,然后就把数组开到1000,就只剩40了。考后把自己定义的dp数组拆成两个就不会RE了(本质上应该是滚动数组优化),然后就A了。

T2,大型分讨现场。考场上自信满满地打了一个半小时,一行一行地对大样例,一点一点改,加各种特判,本来觉得应该没问题了,结果0。发现大样例最后一个多数出了一个数,改后就是40了。自己再改了改,到55就上不去了。然后看dyc的代码,发现自己应该把特判的内容写到填数的过程里,写了写,到70,70 70 70 一直都是70,死活上不去了,最后 wme 学姐(太感谢她了,否则我可能到晚上都调不出来了)给我说了说,我懂了,分类讨论时 当前位如果是0 且不能删去,开头的指针应往后移一位,但加上这个还是65,显示 User output longer than standard answer. 最后发现没有判断没有删除的情况,加上终于A了,真服了(很抱歉自己写得像个流水账

2024/10/2

link:https://www.gxyzoj.com/d/hzoj/contest/66e55d2ef8a2945801ba51a6

自闭了。牙疼。想去打J。不是很想写总结。

2024/10/3

link:https://www.gxyzoj.com/d/hzoj/contest/66fd3b02f8a2945801ca8d1e

还是来写了。

T1,不会用fc,一个一个调大样例,感觉眼睛要废掉了,z[i]=0依然没有写出来,才发现n的长度为1000。

T2,60%的数据很可做,写了个记搜后一直调不出来,调了1小时,果然似了。下考后把传送门的入口和出口换了一下,就60了,发现自己用的是填表法却写成了刷表法,zz极了。

T3,Solution:

容易发现这是一个与斜率有关的题目,这种题目通常通过维护凸包,或者李超树维护
跨过pi的区间容易转化为:以pi为右端点的最优+以pi+1为左端点的最优
两个问题同理,以右端点为例
sai=j=1iajsbi=j=1ibj
最优即max1lr{(sarsal1)k(sbrsbl1)}
sarksbrmin0l<r{ksblsal},离线之后李超树维护直线即可
时间复杂度为O(nlogn),常数略大,空间复杂度为O(n)

看不懂,去学李超树。

2024/10/4

link:https://www.gxyzoj.com/d/hzoj/contest/66ae19497509073c6b126cb8

有没有人能讲讲考试数组应该开多大啊?开小RE,开大还RE

对不起,又鸽了一天。

2024/10/6

link:https://www.gxyzoj.com/d/hzoj/contest/66ffed01f3395ed072efb1db

国庆假期没写多少总结。自愧++

现在打模拟赛很少去想正解了,每个题开题5分钟就去打暴力,非常节省时间,且性价比很高,有时候甚至打着打着暴力就想出了正解(当然这个题肯定是很水的),也很方便写对拍。

挂分:T2数组开小了,写的是 O(n2) 的啊。

T1非常煎蛋。考虑容斥,把问题转化为 i[1,1e5]i=gcd 的方案数。还可以转化为 i[1,1e5]i|gcd ,(这并不是什么高大上的容斥,只需要减去 (2i)|gcd,(3i)|gcd......(ji)|gcd 即可)f[i][j] 表示第 i 行,j 的倍数有多少个,总共的方案数即为 (f[i][j]+1)1 再处理一个数组倒序记录答案即可。

T2,一看数据就是状压,状态枚举,暴力加边,判断是否连通即可获得40pts,但我数组开小了,复杂度是 O(n2) ,但我只开了10倍,20分啊啊啊。正解思路很巧妙,代码更巧妙,一个强连通分量的 出边 的 并集 所指向的 点集 肯定是不连通的,标记为不合法,最后全部状态枚举计算即可。代码放一下:

点击查看代码
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int x;
cin>>x;
if(x) e[1<<i-1]|=1<<j-1;//出边
}
}
e[0]=(1<<n)-1;
for(int i=1;i<(1<<n);i++)
{
e[i]=e[i^lowbit(i)]&e[lowbit(i)];//并集
}
for(int i=1;i<(1<<n);i++)
{
if(flag[i])
{
for(int j=e[i];j;j=(j-1)&e[i])//枚举子集(一个很常用的方法)
{
flag[i|j]=false;
}
}
}
ans=0;
for(int i=0;i<(1<<n);i++)
{
ans+=flag[i];
}
cout<<ans<<endl;

T3,糖。

T4跟以前树剖里的染色几乎一模一样,维护方式都是相同的,树剖区间求和也可以参考一下。改题时这道题直接三发入魂,不到10分钟就AC了,rp神秘定律

P.S.月考寄中寄(想当年 dzb 大佬发了这句话后直接年一了,%%%),考的还没有初试J好(满分100),诚心祈祷。

疯狂颓颓颓,看游记,背图论板。

2024/10/20

又是爆炸的几天,分数永远比考场上估的低,根据我长达三个月的观察后,发现自己挂分主要集中在以下几点:

  1. 眼瞎。不用解释了,比如看错输出顺序,看错题目条件等等,解决方案:每个题读三遍,包括但不限于题面上的所有字。

  2. 数组开大/开小。比如开了个85^4的数组。解决方案:

  3. 漏判/少判边界条件。常出现在dfs或bfs中。解决方案:对自己重拳出击,认认真真检查代码,尤其是判断当前坐标加上/减去某些值的时候是否越界。

  4. 考虑不全面。其实跟上面的差不多。不全面因素主要有:计算方案数时一定要注意是否合法。

  5. 数组/变量打反。解决方案:一定要在头脑清醒的时候打代码!!!

回归正题。今天又挂了。

T1,考场上写的57pts的做法,但是炸成35,原因就是边界条件没判全。发现自己的逻辑思维和其他人很不一样,大家都是枚举这个可以反转的范围,只有我枚举的是每次向左减几或向右加几,也导致我看正解困难了许多,所以我卡常卡过了。题解思路还是很好懂的,定义一个 nxt 数组(链表),记录着每次+2时下一个到哪里,不断往后移,因为有可能重复,所以这相当于一个剪枝。

T2, 只写了3分,还因为没判0挂了。不知道考场上自己为啥不打dfs的14分,好像直接忽略了,真服了

2024/10/21

又应验了上面写的眼瞎,T2没判-1。。。

T1是我考场上开的最后一道题随便打了打暴力,发现自己的搜索连 2 3 都跑不出来,直接 abandon 了。正解吧,代码是简单的,思路是奇妙的,主打这就是一个分类讨论。给的部分分还挺能启发的

T2是我开的第一道题。花了0.5h奋力打50pts的暴力(实际上是40pts),检查了好几遍代码,觉得肯定没问题了吧,啊,然后就0了。然后板有问题。

2024/10/22

最抽象的一集。

T1签到题,本来要打部分分的,后来推了推发现直接排序输出就完了(瞬间找回了自信),开了个vector存储、删除,觉得写起来挺简单的。大样例对了一些就扔了不管了。觉得肯定能A吧。然后考完看排行榜,哇塞,T1怎么爆炸了啊啊啊,咋能TLE呢。然后一问发现vetor删除操作复杂度是 O(n) 的,那我用vector图啥啊。原地裂开。

T2发现只会搜,那就搜吧,写了写,过了第一个样例,第二个样例死活过不去,然后就卡着了,特殊性质随便蒙了个上去,结果显然0分。正解是本质不同子序列计数问题,bitset开个1e5*2e4的dp数组,dp[i][j]表示长度为i,末尾为j的个数。前缀和优化即可。至于%2,因为不是质数,直接判断组合数奇偶性,位运算转移。然后自己是真的啥也想不出来啊。

转移是简单的 优化是 easy

T3是我考场上最失败的一道题,我花了1.5h想暴力、打暴力,看到ABCD这么多性质肯定有会写的,6e3那就想想 O(n^2) 的暴力呗。仔细读题(第一遍读错了)发现好像没那么好写,算了先写再说,结果发现第二个样例过不去,仔细分析了一下,发现好像只会 O(n^3) 的5分暴力。又裂开了啊。然后就只剩5分了,写了100多行,啊。然后波波发的std700行代码。鉴定为不可做题。

T4因为只剩半小时多一些了,赶紧写搜,结果没调完。正解也挺抽象,想弃了。

达成成就:4天模拟赛挂176pts(奠定了s挂100的感情基调)

2024/11/24

link:https://www.gxyzoj.com/d/hzoj/contest/6741cff636620b92bbb48958

整整一个月没有打模拟赛了。

考完csp感觉整个人都不一样了,被流放到2机房了。好啊!这真的太适合我了。

T1一眼搜。但因为脑抽给dfs多加了一层循环+continue错(纯纯纸张)挂掉70pts。

T2也很一眼。但因为我dp思维定式硬要两层循环跑完dp,实际上只需简单的优化即可减掉一层,不对,其实应该是dp定义的不好。dp[i]应该是包括i这一位的前后最大值,然后两边计算取min即可。就是说自己脑子始终转不过去那道弯。*

T3其实是一眼。考场上只要我自己再去看一眼那个dfs就行了啊。还有儿子的map,考场上都想到了。可能是因为去一层次考了一个暑假导致现在无法辨别是不是煎蛋题。多考考应该就适应了。

T4并不一眼。但其实很好理解的。相当于把这一串数每隔k个分一段,然后分成两边处理。vector开个f和g数组。f[i][j]表示第i位到分界点,容量为j的最大值,g[i][j]表示分界点到i,容量为j的最大值。然后显然就有一个柿子是max(f[i][j], g[i+K-1][W-j])(枚举j为容量)表示这个区间的最大值。注意细节。

2024/12/15

link:https://www.gxyzoj.com/d/hzoj/contest/67556a5cb96062fe8cd66e7d

可以说是这么久来挂分最少的一场了。(wsq大佬太强了%%%)

由于T1一开始放的原所以临时换题导致我先从T2开的。然后T1一看是期望直接弃了(这是我整场考试最失误的一点),最后一个小时才看的T1结果50pts就打挂了。你别说,前30分拿到了T1后面就真的不难了。

首先这个题就是要想到一遍dfs如何处理出以一个点为根的情况及答案,很容易发现其实每一个点最终的总共情况数 就是以这个点为根的叶子结点数size,然而每一个 在以1为根的树中 不是叶子节点的节点 的 size 值其实就是 size[1],叶子节点的即为 size[1]-1,所以我们的目标就变为求每一个点的所有情况和,因为一遍dfs就可以求出根节点1的相关答案,所以就是一个简单的换根了。这个换根dp需要注意的一点就是要将叶节点和非叶节点分开讨论,因为毕竟以他们为根的叶节点数不同么。

浅浅的放一下转移吧:
void dfs1(int u,int fa)
{
for(int i=head[u];i;i=edge[i].next)
{
int v=edge[i].to;
if(v==fa) continue;
if(f[v])
{
dp[v]=dp[u]+(size[rt]-2)*a[v]-a[u];
}
else
{
dp[v]=dp[u]+(size[rt]-size[v])*a[v]-size[v]*a[u];
}
dfs1(v, u);
}
}

T2吧,看出了trie树上建反串并找出了dp转移的两种状态。但是我的dp只能使最后的序列单调上升,按理来说这个样子也是可以的:
,所以自己就没有考虑到这种情况,挂的比较惨烈。
大致就是dp维护当前点到叶节点的最长距离,然后答案就是最长距离+次长距离+儿子数-2取max即可。

T3,我他妈看了3个天才看懂,因为每次就是不理解题解里说的一段话,最后终于懂了,豁然开朗了,但没时间改了,浪费了好多时间啊啊啊

T4 呵呵呵,我花了几个晚上,写了6个dfs(其实也可以并到一起写的)然后不停地hack+调过了,因为这个题其实就是一个分类讨论,只有三种情况:
然后根据这些图推推答案,dfs处理即可。

2024/12/29

状压dp专题我就刷了4道(还有两道不是状压),可以说是没啥长进,然后硬着头皮打得模拟赛。

T1当时写了个dijkstra跑最长路,其实dp啥的我都写好了,转移方程也没啥问题,但dp状态设计时我少了一维:当前节点。挺搞笑的,但也深刻体现出我dp经验还是太少了,考场上发现这个转移会有重复的急死了,下考后瞬间醒了。还有一点是转移的时候应该注意当前合不合法(是不是从0开始的),也没啥难度啊,但就是有些细节没想到啊。

T2也不难啊,很像以前的状压板题,但自己根本没有往正解想,直接写了暴力,dp[i][j][k]表示当前第i行,状态为j,第i-1行状态为k,转移时显然再枚举下i-2行的状态,加上代价取min即可,个数跟着一块转移就好了。注意判断是否合法这样写:(j|k|l|(k<<1)|(k>>1))&tot==tot(j k l分别是i i-1 i-2行的状态,tot为 (1<<m)-1)。

T3已经快不记得什么了,三维的状压,dp[x][y][t][s]表示在t时刻,当前在 (x,y) 这一坐标,搬走的西瓜状态为 s 的最少移动次数。mp数组辅助转移,mp[x][y][s]表示在t时刻,当前在 (x,y) 这一坐标的西瓜状态。

点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=105;
int h, w, T, sx, sy, n, m, mp[10][10][maxn], dp[6][6][maxn][(1<<10)+5], idx;
int dx[5]={0, 0, 0, 1, -1}, dy[5]={0, 1, -1, 0, 0}, ans=-1;
struct node{
pair<int,int> id;
int tim, s, val;
bool operator<(const node &x) const
{
return x.val<val;
}
};
signed main()
{
cin>>h>>w>>T>>sx>>sy;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int t1, t2, opt;
cin>>t1>>t2;
cin>>opt;
int tmp;
if(opt==0) tmp=-1;
else tmp=1<<idx, idx++;
for(int j=t1;j<t2;j++)
{
int x, y;
cin>>x>>y;
mp[x][y][j]|=tmp;
}
}
if(!~mp[sx][sy][1])
{
cout<<-1;
return 0;
}
memset(dp, -1, sizeof(dp));
dp[sx][sy][1][mp[sx][sy][1]]=0;
priority_queue<node> q;
q.push(node{make_pair(sx, sy), 1, mp[sx][sy][1], 0});
while(q.size())
{
int x=q.top().id.first, y=q.top().id.second, tim=q.top().tim, s=q.top().s;
q.pop();
if(tim==T)
{
if(s==(1<<m)-1)
{
ans=dp[x][y][tim][s];
break;
}
continue;
}
for(int i=0;i<5;i++)
{
int tx=x+dx[i], ty=y+dy[i];
int ss=s|mp[tx][ty][tim+1];
if(tx==0||tx>h||ty==0||ty>w||!~mp[tx][ty][tim+1]||~dp[tx][ty][tim+1][ss]) continue;
dp[tx][ty][tim+1][ss]=dp[x][y][tim][s]+(abs(dx[i])|abs(dy[i]));
q.push(node{make_pair(tx, ty), tim+1, ss, dp[tx][ty][tim+1][ss]});
}
}
cout<<ans;
return 0;
}

2024/2/11

今天幸运了一波,不知道为啥大家T1都挂了好多,然后没有垫底,感觉T1想想线段树方面的优化就可以做出来了(前提是各种细节没有打挂),T2看样子也只会30pts的暴力分,T3不会代码实现,T4爆搜加点优化应该是能拿到24pts/36pts的。

T1显然O(n^2)做法非常简单,就是变种LIS,b[i]=1的分也很好拿,加个贪心+二分即可,妥妥的LIS板子啊。官方题解写的就很不一样,设 dp[i][j] 表示前 i 个数选了长度为 j 的最后一个数的最小值,当 a[i]>b[j1]dp[i1][j1] 时,dp[i][j]=min(dp[i1][j],a[i]).滚动数组可以滚掉一维。

T2数论题,但这个题技巧性不是很多,就是推推狮子,找找规律,计算的时候分类讨论清楚就行了。但让我再做一遍我可能还是不会

T4爆搜题。


“我已经在改变了。请相信我。”

posted @   zhouyiran2011  阅读(92)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示