NOIP 2024

news/2025/10/11 23:11:51/文章来源:https://www.cnblogs.com/AcceptReality/p/19136116

时隔一年重新做。

T1 因为之前做过的缘故 大概 15min 贪心秒了。都不能换就跳过,相同也跳过。否则诶个检查 \(s_1,s_2\) 可不可以换成功,成功了就跳过不要再多换一次了。

换的过程考虑从 \(i\) 后面开始一直走,直到遇见不能换的字符终止。期间如果有与原位置字符不一样的我们就可以交换它和原字符。因为可以互相交换所以内部顺序必定可以调整到和原来一样。所以直接换没问题。

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define For(i,l,r) for(int i=l;i<=r;i++)
int n,ans,j,j2,f;
string s1,s2,t1,t2;
void work(string &t,string &s,int i,int &j){for(j=max(j,i+1);t[j]=='1';j++){if(s[i]==s[j])continue;f=1;swap(s[i],s[j]);ans++;break;}
} 
void solve(){cin>>n>>s1>>s2>>t1>>t2;ans=j=j2=0;For(i,0,n-1){if(s1[i]==s2[i]){ans++;continue;}if(t1[i]==t2[i]=='0')continue;f=0;if(t1[i]=='1')work(t1,s1,i,j);if(f)continue;if(t2[i]=='1')work(t2,s2,i,j2);}cout<<ans<<"\n";
} 
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int T;cin>>T;while(T--)solve();return 0;
}

T2 一眼数学题,用时 30min 左右。正难则反考虑总方案数减去特意构造的不合法方案。由题意知每个位置的限制只和它前面的数字有关,而前面的数字一直往前继续相关,最终得到这个数字只和其前面第一个指定的 \(x_c=d\) 这里有关系,再往前的并没有影响。对于第一个 \(x_c=d\) 的前缀无限制,\(a_i,b_i\) 两变元随便选所以有 \(v^2\) 种选法,对于每个 \(1\rightarrow c_1-1\) 的位置都乘上这个贡献即可。

其它中间段的总方案数同样这么算,\(total={v^2}^{r-l}=v^{2(r-l)}\)。现在考虑如何构造不合法情况。

不合法,即前面指定的 \(x\) 推出与后面指定 \(x\) 的值不同的一个情况。怎么推呢,很明显只有 \(x_i=a_i \rightarrow x_{i+1}=b_i\) 且有 \(a_{i+1}=x_{i+1} \rightarrow x_{i+2}=b_{i+1}\),然后继续,\(a_{i+2}=x_{i+2} \rightarrow x_{i+3}=b_{i+2}\)……最后一环套一环唯一确定了下一个指定位置的值,此时如果这个值和预期不同就不合法了。

不合法方案数如何计算?中间这些位置的 \(a_i\) 都是被上一个限制了的,所以它们已经确定只能 \(\times 1\)。但是 \(b\) 可以自己指定,所以有 \(v\) 的贡献,不过最后一个 \(b\) 的指定要避开当前值,所以是乘的 \(v-1\)

点击查看代码
#include<bits/stdc++.h> 
using namespace std; 
#define ll long long 
#define For(i,l,r) for(int i=l;i<=r;i++) 
ll n,v;
int m;
const int N=1e5+10;
const ll p=1e9+7;
struct node{ll c,d;
}a[N];
bool cmp(node x,node y){return x.c<y.c;
}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;
}
void solve(){ bool f=0;cin>>n>>m>>v;For(i,1,m)cin>>a[i].c>>a[i].d;sort(a+1,a+m+1,cmp);ll ans=qpow(v,2*(a[1].c-1))%p;For(i,1,m-1){ll l=a[i].c,r=a[i+1].c;if(l==r&&a[i].d!=a[i+1].d){f=1;break;}if(l==r)continue;ans=(ans*(qpow(v,2*(r-l))-(v-1)*qpow(v,r-l-1)%p+p)%p)%p;}ans=(ans*qpow(v,2*(n-a[m].c)))%p;if(f)cout<<"0\n";else cout<<ans<<"\n";
} 
int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int T; cin>>T; while(T--)solve(); return 0; 
} 

T3 突然困难,主播一直在想……首先是可以拿到 \(k=1\) 那档最简单的,不到 5min 就可以拿下高贵的 28 分。这告诉我们 NOIP 部分分一定要全部去想一遍。用时 10min。

点击查看代码
#include<bits/stdc++.h> 
using namespace std; 
#define ll long long 
#define For(i,l,r) for(int i=l;i<=r;i++) 
int n,k;
const int N=1e5+10;
const ll p=1e9+7;
ll fac[N],inv[N];
vector<int>G[N];
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;
}
void init(){fac[0]=inv[0]=1;For(i,1,n)fac[i]=fac[i-1]*i%p;inv[n]=qpow(fac[n],p-2)%p;for(int i=n-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%p;
}
#define pb push_back
int d[N];
int e[N];
void solve(){cin>>n>>k;For(i,1,n){G[i].clear(),d[i]=0;}init();For(i,1,n-1){int u,v;cin>>u>>v;G[u].pb(v);G[v].pb(u);d[u]++;d[v]++;}For(i,1,k)cin>>e[i];ll ans=1;For(i,1,n){//k=1ans=(ans*fac[d[i]-1])%p;}cout<<ans<<"\n";
}
int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int c,T; cin>>c>>T; while(T--)solve(); return 0; 
} 

此时正在模拟赛的我暂时跳过了这题去看了 T4,下面是补题:

T4

太典了,这场 NOIP 结束后我听这个结论听了 800 回了,不可避免的被透露解法了/kel。

区间 \(LCA\) 可以变成两两相邻点 \(LCA\) 的最小高度。剩下部分我就引用下别人打好的东西,实在太经典了,调了大概 2h 多过了。

区间 \(\text{LCA}\) 的深度为:

\[\min_{l\le i<r}{\text{dep}_{\text{LCA}(i,i+1)}} \]

找出以 \(\text{LCA}(i,i+1)\) 为最近公共祖先的最大区间 \([x_i,y_i,v_i]\)\(v_i\)\(\text{dep}_{\text{LCA}(i,i+1)}\)

查询是求与 \([l,r]\) 交集至少为 \(k\),且最大的 \(v_i\)。可列出可行条件的不等式组。

1.满足:

\[y_i\ge r \]

\[x_i\le r-k+1 \]

2.或者满足:

\[l+k-1\le y_i\le r \]

\[y_i-x_i+1\ge k \]

第一个对 \(r\) 扫描线,第二个对 \(k\) 扫描线,时间复杂度 \(O(n\log n)\)

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define For(i,l,r) for(int i=l;i<=r;i++)
const int N=5e5+10;
int n,m;
vector<int>G[N];
int fa[N],sz[N];
int dep[N];
int wc[N],tp[N];
void dfs(int u,int f){fa[u]=f;dep[u]=dep[f]+1;sz[u]=1;for(int v:G[u]){if(v==f)continue;dfs(v,u);sz[u]+=sz[v];if(sz[v]>sz[wc[u]])wc[u]=v;}
}
void dfs2(int u,int t){tp[u]=t;if(wc[u])dfs2(wc[u],t);for(int v:G[u]){if(v==fa[u]||v==wc[u])continue;dfs2(v,v);}
}
int lca(int a,int q){while(tp[a]!=tp[q]){if(dep[tp[a]]>=dep[tp[q]])a=fa[tp[a]];else q=fa[tp[q]];}if(dep[a]<dep[q])return a;else return q;
}
struct node{int l,r,v,id;}a[N];
struct Node{int l,r,k,id;}q[N];
int ans[N];
#define lc u<<1
#define rc u<<1|1
struct Seg{int mx[N<<2];void upd(int u,int L,int R,int p,int v){mx[u]=max(mx[u],v);if(L==R)return;int mid=(L+R)>>1;if(mid>=p)upd(lc,L,mid,p,v);else upd(rc,mid+1,R,p,v);}int qry(int u,int L,int R,int l,int r){if(l<=L&&R<=r)return mx[u];int mid=(L+R)>>1;if(mid>=r)return qry(lc,L,mid,l,r);//都在左边if(mid<l)return qry(rc,mid+1,R,l,r);//都在右边return max(qry(lc,L,mid,l,r),qry(rc,mid+1,R,l,r));}
}t[2];
#define pb push_back
bool cmp(node x,node y){return x.r-x.l>y.r-y.l;}
bool cmp2(Node x,Node y){return x.k>y.k;}
bool cmp3(node x,node y){return x.r>y.r;}
bool cmp4(Node x,Node y){return x.r>y.r;}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n;For(i,1,n-1){int u,v;cin>>u>>v;G[u].pb(v);G[v].pb(u);}dfs(1,0);dfs2(1,1);For(i,1,n-1){a[i].id=i;a[i].v=dep[lca(i,i+1)];}For(i,1,n)t[0].upd(1,1,n,i,dep[i]);//单调栈求控制区间设置边界a[0].v=a[n].v=-1;stack<int>s;s.push(0);For(i,1,n-1){while(a[s.top()].v>=a[i].v)s.pop();a[i].l=s.top()+1;//左边第一个val<vs.push(i);}while(!s.empty())s.pop();s.push(n);for(int i=n-1;i>=1;i--){while(a[s.top()].v>=a[i].v)s.pop();a[i].r=s.top()-1;//右边第一个val<vs.push(i);}cin>>m;For(i,1,m){cin>>q[i].l>>q[i].r>>q[i].k;q[i].id=i;q[i].r--;//边的编号q[i].k--;//转换为边数差}//1.对k扫描线sort(a+1,a+n,cmp);//区间长度降序排序,保证处理查询时所有满足长度>=k的边已加入线段树sort(q+1,q+m+1,cmp2);//k降序排序int u=1;//边的遍历指针For(i,1,m){if(q[i].k==0){//所有区间ans[q[i].id]=t[0].qry(1,1,n,q[i].l,q[i].r+1);//边r对应节点r+1continue;}//将所有长度>=当前查询k的边加入t[1]while(u<n&&a[u].r-a[u].l+1>=q[i].k){//边的val存入t[1],位置为边的控制区间右端点rt[1].upd(1,1,n,a[u].r,a[u].v);u++;}//查询边区间[q[i].l+k-1,q[i].r]的max valans[q[i].id]=t[1].qry(1,1,n,q[i].l+q[i].k-1,q[i].r);}//2.对r扫描线sort(a+1,a+n,cmp3);//r降序排序sort(q+1,q+m+1,cmp4);//r降序排序memset(t[1].mx,0,sizeof(t[1].mx));u=1;For(i,1,m){//所有r>当前查询r的边加入t[1]while(u<n&&a[u].r>q[i].r){t[1].upd(1,1,n,a[u].l,a[u].v);u++;}//查询边区间[1,q[i].r-q[i].k+1]的max val,与原答案取maxans[q[i].id]=max(ans[q[i].id],t[1].qry(1,1,n,1,q[i].r-q[i].k+1));}For(i,1,m)cout<<ans[i]<<'\n';return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025/10/11

A 用时:3h 预期:100pts 实际:100pts 考虑枚举 \(x\) 找到绝对众数为 \(x\) 的区间去扩展,注意到如果 \([l,r]\) 的绝对众数为 \(x\),则里面一定有一段形如 \(x,x\) 或 \(x,y,x\),然后随便做,一开始的实现是一大…

好玩热门的switch游戏推荐【PC+安卓】塞尔达传说:王国之泪|v1.4.2整合版|官方中文| 附switch模拟器

好玩热门的switch游戏推荐【PC+安卓】塞尔达传说:王国之泪|v1.4.2整合版|官方中文| 附switch模拟器【PC+安卓】塞尔达传说:王国之泪|v1.4.2整合版|官方中文|解压可玩 附switch模拟器 【新switch模拟器已经正式支持新版…

十年运维工程师总结

四个字总结我的十年运维生涯,高开低走。 第一家公司,规模不小的游戏公司(现很好)。 第二家公司,规模很小的游戏公司(现已死)。 第三家公司,规模很小的游戏公司(现已死)。 第四家公司,规模很小的直播公司(现…

运动控制教学——5分钟学会Dijkstra与A*搜索算法!(附仿真视频及代码) - 教程

运动控制教学——5分钟学会Dijkstra与A*搜索算法!(附仿真视频及代码) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-f…

ffplay数据结构解析

ffmpeg版本5-1-6 数据结构 FrameQueue typedef struct FrameQueue {Frame queue[FRAME_QUEUE_SIZE];//存储解码后帧数据(视频YUV/RGB、音频PCM、字幕)的预分配内存池int rindex;//指向当前待读取(播放)的帧位置,相…

CNN 发展历程

CNN 发展历程 • LeNet (1998):局部感受野 + 池化,第一次真正提出 CNN • AlexNet (2012):ReLU + Dropout + 数据增强 + GPU,加速深度网络训练 • VGG (2014):33 小卷积堆叠,结构简洁、可扩展 • Inception (201…

FileX和ThreadX精简版

FILEX精简版合并函数级源文件到整个类级源文件原版Filex和Threadx是每个函数一个文件,(我能想到的好处是方便做单元测试,也可能功能安全认证方便点?)这样在windows环境下编译速度会提高一些(编译一个c/cpp文件都…

C 基础教程

C 基础教程C 语言速查与详解目录最小程序与基本语法 基本类型与字面量 变量、常量与作用域 控制流 函数 指针与地址 数组与字符串 结构体、联合与枚举 内存管理 字符与 I/O 宏与预处理器 指针高级用法 错误处理 存储类…

ue4素材场景 - MKT

ue4素材场景https://www.aigei.com/s?q=Brushify+-+Urban+Buildings+Pack环境】工业区环境(Industrial Area Environment)环境】城市建筑包(Brushify - Urban Buildings Pack) 【虚幻模型】- 科幻建筑包 Brush

实用指南:《新能源汽车故障诊断与排除》数字课程资源包开发说明

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

阅读《构建之法》的思考与问题

问题一:软件工程的"复杂性"本质在AI时代是否被真正改变? 关联章节:第1章"软件的特殊性"中关于复杂性的讨论 上下文:复杂性是软件的本质特性之一,不会因工具进步而消失。 支持事例:Linux内核…

实验报告5(链栈基本操作,数制转换,匹配算法,伴舞问题)

一、实验目的: 1.学会进行链栈的基本操作。 2.进行数制的转换,将十进制整数转换为十六进制数。 3.实现的匹配算法。 4.实现舞伴问题。 二、实验仪器或设备: 操作系统:Windows11 编程环境:Dev-cpp 5.11 三、算法总…

阅读和提问作业1:《构建之法》提问

对学校现存教育方式的反馈对学校现存教育方式的反馈:很多老师的教育不讲为什么,就灌输一些死记硬背的知识,学过就忘,也不理解为什么,难以真正应用实践。在学校中碰到的师生关系:一些老师就是为了完成教学任务,学…

Selenium+python自动化1-环境搭建 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

初四夜间/休息日安排

夜间: 最晚 \(20:30\) 前写完作业 写完作业的时间$ - 21:00$ 做初中数学大题两道(或选择四道,填空三道)、物理题四道,化学题五道 \(21:00-22:00\) 物理竞赛(有时可选做高等数学) \(22:00-22:30\) 背诵文科(语文…

2025年9月22日优雅草蜻蜓I通讯水银版4.1.9版本正式发布-完成所有服务升级版本重构升级-修复大量漏洞-优化启动步骤-卓伊凡|bigniu|麻子|贝贝| - 指南

2025年9月22日优雅草蜻蜓I通讯水银版4.1.9版本正式发布-完成所有服务升级版本重构升级-修复大量漏洞-优化启动步骤-卓伊凡|bigniu|麻子|贝贝| - 指南2025-10-11 22:31 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { wh…

企业推行OKR中层领导关注的10个关键问题及解决方案

OKR(Objectives and Key Results,目标与关键成果)作为一种高效的目标管理方法,已被Google、Intel、字节跳动等众多企业成功应用。然而,在推行OKR的过程中,许多企业,尤其是中层管理者,常常面临诸多挑战。本文将…

count down 84 days - 详解

count down 84 days - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

AWS自然语言处理技术实战指南

本书详细介绍了如何利用AWS AI服务实现自然语言处理商业解决方案,涵盖客户服务优化、媒体内容变现、文档元数据提取等实际应用场景,并提供从架构设计到生产部署的完整技术指导。新实践指南展示如何实施自然语言处理商…

Num3:Prompt工程 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …