普及模拟1
1.2023年多校联训NOIP层测试12.2023年多校联训NOIP层测试23.2023年多校联训NOIP层测试3+「SFCOI-3」Sadness Fan Club Round 34.2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 25.【LGR-148-Div.3】洛谷基础赛 #1 & MGOI Round I6.2023年多校联训NOIP层测试57.2023年多校联训NOIP层测试68.【LGR-154-Div.4】洛谷入门赛 #159.2023年多校联训NOIP层测试7+【LGR-149-Div.3】洛谷基础赛 #2 & qw Round -1
10.普及模拟1
11.普及模拟2 +【LGR-155-Div.3】洛谷基础赛 #3 &「NnOI」Round 212.普及模拟313.【LGR-153-Div.2】梦熊联盟 8 月月赛 Ⅳ & Cfz Round 1 & 飞熊杯 #114.【LGR-156-Div.3】洛谷网校 8 月普及组月赛 I & MXOI Round 1 & 飞熊杯 #2(同步赛)15.2023暑假集训总结普及模拟1
Past
-
简化题意:已知一个长度为
的序列 ,给定一个 ,有如下操作(所有操作对 取模):- 当
时,求 。 - 当
时,求 。 - 当
时,求 。
- 当
-
部分分:
暴力枚举:-
线段树维护极差:
-
表维护极差: 表数组开太大了,全部 挂了 。
-
-
正解:
- 打表发现第
个数对答案产生的贡献为 ,最后的答案即为 。- 证明:包含第
个数的子序列的左端点一定在 内,右端点一定在 内。依据乘法原理,包含第 个数的子区间一共有 个,故第 个数对答案产生的贡献为 。
- 证明:包含第
- 打表发现第
- 考虑将式子拆开,有
。令 ,即 表示以 结尾的所有子序列的最大值之和, 表示以 结尾的所有子序列的最小值之和,最终答案即为 。在 中,找到一个 使得 ,且 最大(若不存在,则有 ),那么就得到了状态转移方程 ,将 用单调栈进行维护,对于 同理。
- 考虑将式子拆开,有
- 预处理出阶乘数组
和前缀和数组 ,使得对于每一个 均满足 ,接着将式子拆开, ,这样就省去了对浮点数和除法的计算(便于取模)。打表,得到每个元素对这段子序列的答案贡献次数如下:观察发现,长度为
的子序列对答案产生的贡献为长度为 的子序列对答案产生的贡献+ ,那么维护一个临时变量 存储当前对答案产生的贡献,然后乘上 即可。即 ,最终答案即为 ,边界为 。
- 预处理出阶乘数组
-
本题卡负数取模,记得有减法运算时先加模数再取模,加法、乘法运算时先取模再运算再取模。
-
本程序取模较多,吸氧(开
)才能过,时间复杂度为 。#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' const ll p=1336363663; ll a[3000001],f[3000001],g[3000001],mul1[3000001],mul2[3000001],sum[3000001]; stack<ll>maxx,minn; int main() { freopen("pst.in","r",stdin); freopen("pst.out","w",stdout); ll n,d,i,j,ans1=0,ans2=0,ans3=0,ls=0; scanf("%lld%lld",&n,&d); mul1[0]=mul2[n+1]=1; for(i=1,j=n;i<=n,j>=1;i++,j--) { scanf("%lld",&a[i]); sum[i]=(sum[i-1]%p+a[i]%p)%p; mul1[i]=((mul1[i-1]%p)*(i%p))%p; mul2[j]=((mul2[j+1]%p)*(j%p))%p; } if(d>=1) { for(i=1;i<=n;i++) { ans1=(ans1+(((((a[i]%p)*(i%p))%p)%p)*((n-i+1)%p)%p))%p; while(maxx.empty()==0&&a[maxx.top()]<=a[i]) { maxx.pop(); } while(minn.empty()==0&&a[minn.top()]>=a[i]) { minn.pop(); } if(maxx.empty()==0) { f[i]=(f[maxx.top()]%p+(a[i]%p)*((i-maxx.top())%p))%p; } else { f[i]=(f[0]%p+(a[i]%p)*(i%p)%p)%p; } if(minn.empty()==0) { g[i]=(g[minn.top()]%p+(a[i]%p)*((i-minn.top())%p))%p; } else { g[i]=(g[0]%p+(a[i]%p)*(i%p)%p)%p; } maxx.push(i); minn.push(i); ls=(ls+sum[n-i+1]%p-sum[i-1]%p+p)%p; ans3=(ans3+((ls*(mul1[i-1]%p))%p*(mul2[i+1]%p))%p)%p; } for(i=1;i<=n;i++) { ans2=(ans2+(f[i]-g[i]+p)%p)%p; } printf("%lld\n",ans1); if(d>=2) { printf("%lld\n",ans2); if(d>=3) { printf("%lld\n",ans3); } } } return 0; }
Present
-
简化题意:对一个序列,进行两端插入,两端读取,两端删除,反转的操作。
-
luogu B3656 【模板】双端队列 1 变形,用数组模拟或
维护数列,考虑开一个 类型的 记录是否进行颠倒。- 每次颠倒时,将
取反即可。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' deque<ll>q; int main() { freopen("prs.in","r",stdin); freopen("prs.out","w",stdout); ll n,id,pd,x,i; bool flag=false; scanf("%lld%lld",&n,&id); for(i=1;i<=n;i++) { scanf("%lld",&pd); if(pd==0) { scanf("%lld",&x); if(flag==false) { q.push_front(x); } else { q.push_back(x); } } if(pd==1) { if(q.empty()==0) { if(flag==false) { printf("%lld\n",q.front()); q.pop_front(); } else { printf("%lld\n",q.back()); q.pop_back(); } } else { printf("0\n"); } } if(pd==2) { scanf("%lld",&x); if(flag==false) { q.push_back(x); } else { q.push_front(x); } } if(pd==3) { if(q.empty()==0) { if(flag==false) { printf("%lld\n",q.back()); q.pop_back(); } else { printf("%lld\n",q.front()); q.pop_front(); } } else { printf("0\n"); } } if(pd==4) { flag=(!flag); } } return 0; }
- 每次颠倒时,将
-
貌似是首A。
Future
-
简化题意:给定一棵
个节点的树,问从根节点(编号为 的节点)到叶子结点的最大距离。 -
类似 luogu P1807 最长路 ,但本题是一棵树,跑树形
, , 拓扑优化 求最长路 等做法皆可。- 树形
的一种做法,令 表示 的父节点, 表示以 为终点时,所得到的收获值,则有状态转移方程 。
- 树形
-
坑:点权有负数,输出结果应初始化为
。- 最后
检查时才发现,差点挂了 。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' struct node { ll nxt,to; }e[400001]; ll w[400001],f[400001],head[400001],dout[400001],cnt=0;//注意与上文数组定义不同 void add(ll u,ll v) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; head[u]=cnt; } void dfs(ll x,ll fa) { f[x]=f[fa]+w[x]; for(ll i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=fa) { dfs(e[i].to,x); } } } int main() { freopen("ftr.in","r",stdin); freopen("ftr.out","w",stdout); ll n,i,u,ans=-0x7f7f7f7f; scanf("%lld",&n); for(i=1;i<=n;i++) { scanf("%lld",&w[i]); } for(i=1;i<=n;i++) { scanf("%lld",&u); add(u,i); dout[u]++;//统计出度,为了找到终点 } dfs(1,0); for(i=1;i<=n;i++) { if(dout[i]==0) { ans=max(ans,f[i]); } } printf("%lld\n",ans); return 0; }
- 最后
Beyond
- 简化题意:给定一个
大小的矩阵和常数 ,记 为从 到对角线(即直线 上)的路径上每个方格的异或和, 为从对角线走到 的路径上每个方格的异或和。求 的方案数。 - 强化版:CF1006F Xor-Paths | [ABC271F] XOR on Grid Path
- 部分分:
:输出0
。
- 正解:考虑爆搜(明显的暗示,其实是
),分别从 进行爆搜,当到达对角线时,将所得到的值分别用两个 进行存储,又因为在对角线可以进行传送至另一个对角线,然后利用加法原理和乘法原理求解。- 对于每个
在 中用 的 或其他方式寻找 出现的次数,即可进行求解。
#include<bits/stdc++.h> using namespace std; #define ll long long #define sort stable_sort #define endl '\n' ll c[21][21],f[21][21],dil[2][2]={{1,0},{0,1}},dir[2][2]={{-1,0},{0,-1}}; map<ll,ll>l,r; map<ll,ll>::iterator it,val; void dfs1(ll x,ll y,ll n,ll num) { if(y==n-x+1) { l[num]++; } else { ll i,nx,ny; for(ll i=0;i<=1;i++) { nx=x+dil[i][0]; ny=y+dil[i][1]; if(1<=nx&&nx<=n&&1<=ny&&ny<=n) { dfs1(nx,ny,n,num^c[nx][ny]); } } } } void dfs2(ll x,ll y,ll n,ll num) { if(y==n-x+1) { r[num]++; } else { ll i,nx,ny; for(ll i=0;i<=1;i++) { nx=x+dir[i][0]; ny=y+dir[i][1]; if(1<=nx&&nx<=n&&1<=ny&&ny<=n) { dfs2(nx,ny,n,num^c[nx][ny]); } } } } int main() { freopen("byd.in","r",stdin); freopen("byd.out","w",stdout); ll n,fate,i,j,ans=0,sum; scanf("%lld%lld",&n,&fate); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%lld",&c[i][j]); } } dfs1(1,1,n,0); dfs2(n,n,n,0); for(it=l.begin();it!=l.end();it++) { val=r.find(it->first+fate); if(val!=r.end()) { ans+=(it->second)*(val->second);//将两个数出现的次数相乘 } } printf("%lld\n",ans); return 0; }
- 对于每个
总结
-
十年
一场空,不开 见祖宗。 -
本次开题顺序:
,在这里没有掉进出题人的坑里。 -
没有再认真想想,如果想到爆搜的话可能分数再高点(?)。 -
注意文件输入输出(有人在这里爆零了)。
后记
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17635690.html,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具