2026萌新联赛第二场河南农业大学补题总结你的心有一道墙 但我发现一扇窗偶尔透出一丝暖暖的微光就算你有一道墙 我的爱会攀上窗台盛放打开窗你会看到悲伤融化这时候林俊杰就有疑问了本场预测难度划分为easyDHIeasy-midABMmidCEFGmid-hardKLhardJ这场比赛就有意思了榜单没有跟着难度走我打的时候也是这样。在赛时我的做题顺序大概是I H M B D L 很可惜啊L题确实是棋差一招啊。不过出题人把它放在mid-hard我是实在不太理解啊这题完全是可以补的呀。当然这个A题出题人把它放在easy-mid也有它的道理。但是在赛时谁看到像语文课文一样的题会想到是一个简单的模拟题呢况且还很有可能读不懂题目(我就是哈语文不好理解不了题意)。当然了奉劝大家在有时间的情况下还是得多卡看看其他的题万一你漏掉了一个能做的只是当时不想做那就太可惜了。题目链接接下来废话不多说开始讲题首先是签到题I题这题就是说让我们取一个右指针然后遍历的时候看右指针会不会移动移动条件就是ia[i]-1ans(右指针)AC代码int n; cinn; vectorint a(n1); for(int i1;in;i) cina[i]; int r1; for(int i1;ir;i) { int shuia[i]-1; if(shun) rn; else rmax(r,shu); } coutrendl;HH题这个题是比上一题还简单的签到题我们对于数组每一个数向上取整累加在一起输出就行了。int n,x,y; cinnxy; vectorint a(n); for(int i0;in;i) cina[i]; int ans0; if(x0||y0){ NO return; } int shumin(x,y); for(int i0;in;i){ ans((a[i]shu-1)/shu); } YES; coutansendl;M题这个M题说实话说的那个多我在赛时是压根不知道它在讲什么但是我们通过看这个题目给的实例就基本上能看个半懂然后根据下面的样例来分析就知道它讲的是啥了。就是一个数组压缩111就压缩成[1 3]也就是3个1那么它让我们输出第k个就很简单了我们把这个数组还原再输出第k个就行了int n; cinn; vectorint v(n1),l(n1); for(int i1;in;i) cinv[i]l[i]; int T; cinT; vectorint ans; while(T--) { int num; cinnum; int shu0; for(int i1;in;i) { if(shul[i]num){ ans.push_back(v[i]); break; }else{ shul[i]; } } } for(int i0;ians.size();i) coutans[i]endl;B题B题的思路就是让这个数求和嘛我们看这个数据很大所以暴力肯定是超时的所以我们就得想一个方法给它优化一下我们不难想到一个数除以一个数等于1的会有很多数(因为向下取整嘛)然后我们就可以利用这个性质来把这个过程给它截出来比如说一个数除以7 8 9都等于1那么我们就把这个7找出来把这个9找出来然后9-71就是这段长度的长31就表示了这段长的和它就可以大大降低我们的时间复杂度这个思路在赛时想了挺久的导致这个代码写成了屎山代码然后在赛后才知道这个思想是分块思想这题还是一个模板题优化的代码十分之简短相比之下我的屎山代码真的是丑爆了赛时ac代码// Problem: 不同的商 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/B // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-27 13:24:51 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; int ksm(int a, int b, int p) { int res 1; while (b) { if (b 1) res res * a % p; a a * a % p; b 1; } return res; } void solve() { int x,y; cinxy; if(x1){ cout1endl; return; } if(y1){ coutxendl; return; } int ansx; if(yx){ yx; int cnt2; while(1){ int shu1x/cnt; if(cnty){ ansshu1; break; } int cntr(x/shu1)1; if(cntry) cntry1; int num(cntr-cnt)*shu1; ansnum; cntcntr; if(cnty) break; // coutcnt shu1 cntr numendl; } coutansendl; }else{ int cnt2; while(1) { int shu1x/cnt; if(cnty) { ansshu1; break; } int cntr(x/shu1)1; if(cntry) cntry1; int num(cntr-cnt)*shu1; ansnum; cntcntr; // coutansendl; if(cnty) break; } coutansendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }优化代码int x,y;cinxy; int an0; if(yx) yx; for(int l1;ly;l){ int rx/(x/l); an(x/l)*(r-l1); lr; } coutanendl;D题这个题本来看到三维切割这肯定得用到很多算法什么前缀和什么差分什么动态啊让我很头疼所以这个题目我在看了一眼只后果断放弃但是回过头看了一下发现它的数据特别小我们暴力打一遍直接救过了。暴力思路就是三维数组三层循环没这里就不过多解释了。AC代码呈上int w,x,h; cinwxh; int q; cinq; int answ*x*h; int a[30][30][30]{0}; while(q--) { int x1,y1,z1,x2,y2,z2; cinx1y1z1x2y2z2; for(int ix1;ix2;i) { for(int jy1;jy2;j) { for(int kz1;kz2;k) { if(a[i][j][k]0){ ans--; a[i][j][k]1; } } } } } coutansendl;A题这个题我在赛时也是直接放弃了文字也是直接劝退主包啊但是这题我们如果理解了题目就很好做数据给的也很少了我们可以直接暴力模拟就可以过。题目大意我们在(0,0)然后我们不会攻击但是我们有一个范围在这个范围是我们的领域我们的棋子会暴击就是x从0-4y从-2-2在这里面我们的棋子会造成基础攻击乘以系数4的伤害在外面的棋子只会造成基础攻击乘以2的伤害。然后输入几组坐标表示外面初始棋子的位置。然后再输入几组坐标这几组坐标有限定条件就是如果在我们的领域内的话我们可以观察它的上下左右有没有棋子要是没有的话我们可以在它的其上下左右都放上一个棋子但是如果我们这一轮放置的棋子在领域外面就没有这个性质。然后外面再输入m个坐标这m个坐标是m个敌人它的位置在哪个棋子的领域内棋子就会爆炸造成伤害(棋子的领域题目i也说了是一个菱形其实在后面我们可以推出来是abs(x差)abs(y差)2就是在它的领域)。然后我们输出这个伤害。好吧其实我解释的也有点过于长了不过没办法这题出的长那它的规则也就有些多只要理解了就很好写了你如果理解了题目大意其实就很好写用一个结构体数组来表示棋子的位置和状态还有暴击的系数然后用set来看哪个位置会不会已经有棋子了然后暴力模拟就出来了。AC代码// Problem: 天下劫 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/A // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-28 13:02:28 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; const int dx[]{1,-1,0,0}; const int dy[]{0,0,1,-1}; struct node{ int x,y,value; bool ok; }; bool check(int x,int y) { return (x0x4y-2y2); } void solve() { int n; cinn; vectornode v; setpii st; st.insert({0,0}); for(int i0;in;i) { int x,y; cinxy; v.push_back({x,y,4,true}); st.insert({x,y}); } int m; cinm; for(int i0;im;i) { int x,y; cinxy; if(check(x,y)){ if(st.find({x,y})st.end()){ v.push_back({x,y,4,true}); st.insert({x,y}); } for(int d0;d4;d) { int nxxdx[d]; int nyydy[d]; if(nx0ny0) continue; if(st.find({nx,ny})st.end()){ int shucheck(nx,ny)?4:2; v.push_back({nx,ny,shu,true}); st.insert({nx,ny}); } } }else{ if(st.find({x,y})st.end()){ v.push_back({x,y,2,true}); st.insert({x,y}); } } } int q; cinq; for(int i0;iq;i) { int xx,yy; cinxxyy; int ans0; vectorintused; for(int j0;jv.size();j) { if(!v[j].ok) continue; if (abs(v[j].x-xx)abs(v[j].y-yy)2){ ansv[j].value*669; used.push_back(j); } } for(auto t:used){ v[t].okfalse; } coutansendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }G题这个题是一个二维前缀和加差分的板子题目吧。就是如果我们熟练于二维差分加前缀和的话这题其实还挺好写的。首先我们定义一个a数组来标记每一个格子被猫覆盖的数量如果被一个覆盖就等于1然后定义一个数组b来表示格子上面有没有猫哈气。初始的ans2000*2000,然后我们找到一个格子的a数组是1那就表示是一个猫覆盖我们就可以把它对应的b数组定义为1然后ans–,然后如果这个格子1那么我们就把对应的b数组定义为0因为不管依次去掉哪个猫这一块都不会从有猫变成无猫然后ans–。我们用差分是为了节省时间复杂度而用前缀和是为了方便取区间比如区间(2,2)到区间(3,3)那么我们想取这个区间只需要v [ 3 ] [ 3 ] − v [ 1 ] [ 2 ] − v [ 2 ] [ 2 ] v [ 1 ] [ 1 ] v[3][3]-v[1][2]-v[2][2]v[1][1]v[3][3]−v[1][2]−v[2][2]v[1][1]所以我们需要用到前缀和的性质。而差分的话我们在输入n个矩形数据的时候想要把所有的二维坐标对应位置都加上1那不现实因为还需要两层循环来实现那么必定会超时所以我们用到了差分。然后用前缀和来实现这个这个格子是1还是0还是大于1再根据这个来判断统计被一个猫占领的区域。AC代码// Problem: Ha~ // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/G // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-28 09:12:58 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n // #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; int a[2010][2010]{0}; int b[2010][2010]{0}; void solve() { int n; cinn; int u[2010]; vectorint d(n5); vectorint l(n5); vectorint r(n5); int ans2000*2000; for(int i1;in;i) { cinu[i]d[i]l[i]r[i]; a[u[i]][l[i]]; a[u[i]][r[i]1]--; a[d[i]1][l[i]]--; a[d[i]1][r[i]1]; } for(int i1;i2000;i) { for(int j1;j2000;j) { a[i][j]a[i][j]a[i-1][j]a[i][j-1]-a[i-1][j-1]; if(a[i][j]1){ ans--; b[i][j]1; }else if(a[i][j]1){ ans--; b[i][j]0; } } } for(int i1;i2000;i) { for(int j1;j2000;j) { b[i][j]b[i][j]b[i-1][j]b[i][j-1]-b[i-1][j-1]; } } for(int i1;in;i) { int numb[d[i]][r[i]]-b[d[i]][l[i]-1]-b[u[i]-1][r[i]]b[u[i]-1][l[i]-1]; coutansnumendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }L题这个题感觉没有哪个难题解说这题是一个字典树板题但是我们不用他们说的也能写啊。这里我来一个听独特的方法仅仅用到哈希表首先呢我们知道哈希表可以存储我们想要存的串但是它的一半串呢我们不知道怎么办但是呢我们可以把它所有的字串全部都存进去然后呢找的时候也能直接找到然后当op3的时候呢我们再依次把它的字串删了但是这里我们得删除把它的字串个数删除完所以这里得改变一下这个字串通过这个s加了几次我们就删除几次。然后进行模拟就行了// Problem: 至理名言 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/L // Memory Limit: 1024 MB // Time Limit: 4000 ms // author世间 // Date2026-07-27 14:56:52 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; void solve() { int n; cinn; unordered_mapstring,intmp; while(n--) { int op; cinop; if(op1) { string s; cins; string s1; for(auto x:s){ s1x; mp[s1]; } coutmp[s]endl; } if(op2) { string s; cins; if(mp.count(s)) YES else NO } if(op3){ string s; cins; string s1; int shump[s];//这里我们只删除通过s串加的字串的个数 for(auto x:s){ s1x; mp[s1]-shu; if(mp[s1]0) mp.erase(s1); } } } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }总结 有优势有劣势B题通过数学思维把它做出来了还比较可以但是其实这题总过题人数不少了基本上一般人都过了。其次就是差分前缀和一维现在都不太会用这次直接出一个二维的直接给我干爆炸了算法方面还得多练啊其次就是这个L题这个思想当时有点朝这边想了都开了两个map来弄了就差怎么把它的字串删除了这点学长的思维确实厉害。这次排名比上次进步了但是还不是太靠前下次继续努力
2026萌新联赛第二场--(河南农业大学)
2026萌新联赛第二场河南农业大学补题总结你的心有一道墙 但我发现一扇窗偶尔透出一丝暖暖的微光就算你有一道墙 我的爱会攀上窗台盛放打开窗你会看到悲伤融化这时候林俊杰就有疑问了本场预测难度划分为easyDHIeasy-midABMmidCEFGmid-hardKLhardJ这场比赛就有意思了榜单没有跟着难度走我打的时候也是这样。在赛时我的做题顺序大概是I H M B D L 很可惜啊L题确实是棋差一招啊。不过出题人把它放在mid-hard我是实在不太理解啊这题完全是可以补的呀。当然这个A题出题人把它放在easy-mid也有它的道理。但是在赛时谁看到像语文课文一样的题会想到是一个简单的模拟题呢况且还很有可能读不懂题目(我就是哈语文不好理解不了题意)。当然了奉劝大家在有时间的情况下还是得多卡看看其他的题万一你漏掉了一个能做的只是当时不想做那就太可惜了。题目链接接下来废话不多说开始讲题首先是签到题I题这题就是说让我们取一个右指针然后遍历的时候看右指针会不会移动移动条件就是ia[i]-1ans(右指针)AC代码int n; cinn; vectorint a(n1); for(int i1;in;i) cina[i]; int r1; for(int i1;ir;i) { int shuia[i]-1; if(shun) rn; else rmax(r,shu); } coutrendl;HH题这个题是比上一题还简单的签到题我们对于数组每一个数向上取整累加在一起输出就行了。int n,x,y; cinnxy; vectorint a(n); for(int i0;in;i) cina[i]; int ans0; if(x0||y0){ NO return; } int shumin(x,y); for(int i0;in;i){ ans((a[i]shu-1)/shu); } YES; coutansendl;M题这个M题说实话说的那个多我在赛时是压根不知道它在讲什么但是我们通过看这个题目给的实例就基本上能看个半懂然后根据下面的样例来分析就知道它讲的是啥了。就是一个数组压缩111就压缩成[1 3]也就是3个1那么它让我们输出第k个就很简单了我们把这个数组还原再输出第k个就行了int n; cinn; vectorint v(n1),l(n1); for(int i1;in;i) cinv[i]l[i]; int T; cinT; vectorint ans; while(T--) { int num; cinnum; int shu0; for(int i1;in;i) { if(shul[i]num){ ans.push_back(v[i]); break; }else{ shul[i]; } } } for(int i0;ians.size();i) coutans[i]endl;B题B题的思路就是让这个数求和嘛我们看这个数据很大所以暴力肯定是超时的所以我们就得想一个方法给它优化一下我们不难想到一个数除以一个数等于1的会有很多数(因为向下取整嘛)然后我们就可以利用这个性质来把这个过程给它截出来比如说一个数除以7 8 9都等于1那么我们就把这个7找出来把这个9找出来然后9-71就是这段长度的长31就表示了这段长的和它就可以大大降低我们的时间复杂度这个思路在赛时想了挺久的导致这个代码写成了屎山代码然后在赛后才知道这个思想是分块思想这题还是一个模板题优化的代码十分之简短相比之下我的屎山代码真的是丑爆了赛时ac代码// Problem: 不同的商 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/B // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-27 13:24:51 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; int ksm(int a, int b, int p) { int res 1; while (b) { if (b 1) res res * a % p; a a * a % p; b 1; } return res; } void solve() { int x,y; cinxy; if(x1){ cout1endl; return; } if(y1){ coutxendl; return; } int ansx; if(yx){ yx; int cnt2; while(1){ int shu1x/cnt; if(cnty){ ansshu1; break; } int cntr(x/shu1)1; if(cntry) cntry1; int num(cntr-cnt)*shu1; ansnum; cntcntr; if(cnty) break; // coutcnt shu1 cntr numendl; } coutansendl; }else{ int cnt2; while(1) { int shu1x/cnt; if(cnty) { ansshu1; break; } int cntr(x/shu1)1; if(cntry) cntry1; int num(cntr-cnt)*shu1; ansnum; cntcntr; // coutansendl; if(cnty) break; } coutansendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }优化代码int x,y;cinxy; int an0; if(yx) yx; for(int l1;ly;l){ int rx/(x/l); an(x/l)*(r-l1); lr; } coutanendl;D题这个题本来看到三维切割这肯定得用到很多算法什么前缀和什么差分什么动态啊让我很头疼所以这个题目我在看了一眼只后果断放弃但是回过头看了一下发现它的数据特别小我们暴力打一遍直接救过了。暴力思路就是三维数组三层循环没这里就不过多解释了。AC代码呈上int w,x,h; cinwxh; int q; cinq; int answ*x*h; int a[30][30][30]{0}; while(q--) { int x1,y1,z1,x2,y2,z2; cinx1y1z1x2y2z2; for(int ix1;ix2;i) { for(int jy1;jy2;j) { for(int kz1;kz2;k) { if(a[i][j][k]0){ ans--; a[i][j][k]1; } } } } } coutansendl;A题这个题我在赛时也是直接放弃了文字也是直接劝退主包啊但是这题我们如果理解了题目就很好做数据给的也很少了我们可以直接暴力模拟就可以过。题目大意我们在(0,0)然后我们不会攻击但是我们有一个范围在这个范围是我们的领域我们的棋子会暴击就是x从0-4y从-2-2在这里面我们的棋子会造成基础攻击乘以系数4的伤害在外面的棋子只会造成基础攻击乘以2的伤害。然后输入几组坐标表示外面初始棋子的位置。然后再输入几组坐标这几组坐标有限定条件就是如果在我们的领域内的话我们可以观察它的上下左右有没有棋子要是没有的话我们可以在它的其上下左右都放上一个棋子但是如果我们这一轮放置的棋子在领域外面就没有这个性质。然后外面再输入m个坐标这m个坐标是m个敌人它的位置在哪个棋子的领域内棋子就会爆炸造成伤害(棋子的领域题目i也说了是一个菱形其实在后面我们可以推出来是abs(x差)abs(y差)2就是在它的领域)。然后我们输出这个伤害。好吧其实我解释的也有点过于长了不过没办法这题出的长那它的规则也就有些多只要理解了就很好写了你如果理解了题目大意其实就很好写用一个结构体数组来表示棋子的位置和状态还有暴击的系数然后用set来看哪个位置会不会已经有棋子了然后暴力模拟就出来了。AC代码// Problem: 天下劫 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/A // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-28 13:02:28 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; const int dx[]{1,-1,0,0}; const int dy[]{0,0,1,-1}; struct node{ int x,y,value; bool ok; }; bool check(int x,int y) { return (x0x4y-2y2); } void solve() { int n; cinn; vectornode v; setpii st; st.insert({0,0}); for(int i0;in;i) { int x,y; cinxy; v.push_back({x,y,4,true}); st.insert({x,y}); } int m; cinm; for(int i0;im;i) { int x,y; cinxy; if(check(x,y)){ if(st.find({x,y})st.end()){ v.push_back({x,y,4,true}); st.insert({x,y}); } for(int d0;d4;d) { int nxxdx[d]; int nyydy[d]; if(nx0ny0) continue; if(st.find({nx,ny})st.end()){ int shucheck(nx,ny)?4:2; v.push_back({nx,ny,shu,true}); st.insert({nx,ny}); } } }else{ if(st.find({x,y})st.end()){ v.push_back({x,y,2,true}); st.insert({x,y}); } } } int q; cinq; for(int i0;iq;i) { int xx,yy; cinxxyy; int ans0; vectorintused; for(int j0;jv.size();j) { if(!v[j].ok) continue; if (abs(v[j].x-xx)abs(v[j].y-yy)2){ ansv[j].value*669; used.push_back(j); } } for(auto t:used){ v[t].okfalse; } coutansendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }G题这个题是一个二维前缀和加差分的板子题目吧。就是如果我们熟练于二维差分加前缀和的话这题其实还挺好写的。首先我们定义一个a数组来标记每一个格子被猫覆盖的数量如果被一个覆盖就等于1然后定义一个数组b来表示格子上面有没有猫哈气。初始的ans2000*2000,然后我们找到一个格子的a数组是1那就表示是一个猫覆盖我们就可以把它对应的b数组定义为1然后ans–,然后如果这个格子1那么我们就把对应的b数组定义为0因为不管依次去掉哪个猫这一块都不会从有猫变成无猫然后ans–。我们用差分是为了节省时间复杂度而用前缀和是为了方便取区间比如区间(2,2)到区间(3,3)那么我们想取这个区间只需要v [ 3 ] [ 3 ] − v [ 1 ] [ 2 ] − v [ 2 ] [ 2 ] v [ 1 ] [ 1 ] v[3][3]-v[1][2]-v[2][2]v[1][1]v[3][3]−v[1][2]−v[2][2]v[1][1]所以我们需要用到前缀和的性质。而差分的话我们在输入n个矩形数据的时候想要把所有的二维坐标对应位置都加上1那不现实因为还需要两层循环来实现那么必定会超时所以我们用到了差分。然后用前缀和来实现这个这个格子是1还是0还是大于1再根据这个来判断统计被一个猫占领的区域。AC代码// Problem: Ha~ // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/G // Memory Limit: 1024 MB // Time Limit: 2000 ms // author世间 // Date2026-07-28 09:12:58 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n // #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; int a[2010][2010]{0}; int b[2010][2010]{0}; void solve() { int n; cinn; int u[2010]; vectorint d(n5); vectorint l(n5); vectorint r(n5); int ans2000*2000; for(int i1;in;i) { cinu[i]d[i]l[i]r[i]; a[u[i]][l[i]]; a[u[i]][r[i]1]--; a[d[i]1][l[i]]--; a[d[i]1][r[i]1]; } for(int i1;i2000;i) { for(int j1;j2000;j) { a[i][j]a[i][j]a[i-1][j]a[i][j-1]-a[i-1][j-1]; if(a[i][j]1){ ans--; b[i][j]1; }else if(a[i][j]1){ ans--; b[i][j]0; } } } for(int i1;i2000;i) { for(int j1;j2000;j) { b[i][j]b[i][j]b[i-1][j]b[i][j-1]-b[i-1][j-1]; } } for(int i1;in;i) { int numb[d[i]][r[i]]-b[d[i]][l[i]-1]-b[u[i]-1][r[i]]b[u[i]-1][l[i]-1]; coutansnumendl; } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }L题这个题感觉没有哪个难题解说这题是一个字典树板题但是我们不用他们说的也能写啊。这里我来一个听独特的方法仅仅用到哈希表首先呢我们知道哈希表可以存储我们想要存的串但是它的一半串呢我们不知道怎么办但是呢我们可以把它所有的字串全部都存进去然后呢找的时候也能直接找到然后当op3的时候呢我们再依次把它的字串删了但是这里我们得删除把它的字串个数删除完所以这里得改变一下这个字串通过这个s加了几次我们就删除几次。然后进行模拟就行了// Problem: 至理名言 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/138554/L // Memory Limit: 1024 MB // Time Limit: 4000 ms // author世间 // Date2026-07-27 14:56:52 #includebits/stdc.h using namespace std; #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define endl \n #define int long long #define pii pairint,int #define fi first #define se second #define YES coutYESendl; #define NO coutNOendl; void solve() { int n; cinn; unordered_mapstring,intmp; while(n--) { int op; cinop; if(op1) { string s; cins; string s1; for(auto x:s){ s1x; mp[s1]; } coutmp[s]endl; } if(op2) { string s; cins; if(mp.count(s)) YES else NO } if(op3){ string s; cins; string s1; int shump[s];//这里我们只删除通过s串加的字串的个数 for(auto x:s){ s1x; mp[s1]-shu; if(mp[s1]0) mp.erase(s1); } } } // coutfixedsetprecision(x) } signed main() { IOS; int _1; // cin_; while(_--) solve(); return 0; }总结 有优势有劣势B题通过数学思维把它做出来了还比较可以但是其实这题总过题人数不少了基本上一般人都过了。其次就是差分前缀和一维现在都不太会用这次直接出一个二维的直接给我干爆炸了算法方面还得多练啊其次就是这个L题这个思想当时有点朝这边想了都开了两个map来弄了就差怎么把它的字串删除了这点学长的思维确实厉害。这次排名比上次进步了但是还不是太靠前下次继续努力