OI 笑传 #15

news/2025/10/2 17:48:16/文章来源:https://www.cnblogs.com/hm2nsite/p/19123794

0

T1 rz题。

1

题目背景
弗洛吉有一棵 \(n\) 个顶点的无根树,每个顶点 \(i\) 的初始权重为 \(i\)。他最多执行一次操作,一次操作是选择一条路径上的顶点序列 \(x_1,x_2,\cdots,x_k\),从集合 \(x_1,x_2,\cdots,x_k\) 中,选择偶数个顶点(顶点可以重复选择)\(u_1,u_2,\cdots,u_{2m}\)。对于所有的 \(i\in[1,m]\),依次交换顶点 \(u_{2i-1},u_{2i}\) 的权重。

问题描述
求通过一次操作后,能得到的不同的权重序列 \(a_1, a_2, \cdots, a_n\) 的数量(对 \(998244353\) 取模)。

数据范围

  • 测试用例数 \(T \leq 10^5\)
  • 每个测试用例的顶点数 \(n \leq 3000\)
  • 所有测试用例的 \(n\) 总和 \(\leq 1.5 \times 10^4\)

操作只有一次是很爽的。

因为不管选什么链,链上的点组成的序列中每个数两两不同,于是我们关心的只是选出的链的长度问题,长度相同的链,经过交换所得到的种类数是相同的。

下一步就是去重问题,考虑 DP,从长度 \(i-1\) 到长度 \(i\),怎么转移过来情况数。

首先,每次考虑一个链的时候都会考虑上不变的情况,但统计是全局的,只会统计一次,于是先把这个东西扔出去。

接下来,考虑把新的数 \(i\) 插空,也就是有 \(i\) 个空可以插,但是 \(i-1\) 不变的情况就只能插到 \(i-1\) 个空里去了,于是我们有:

\(f_i=f_{i-1}\times i + i-1\)

但是这样是有重复的,也就是改 \(f_i\) 中长度为 \(j\) 的一串的情况数会被算到 \(f_j\) 里面去。

算重了什么?算重的是那些不是改变整个序列的情况,具体来说,是移动了里面那些 \(i-1,i-2\cdots\) 那些子段的情况,我们会在 DFS 的时候把他们算上的,现在不需要他们了。

于是我们这么处理,令 \(g_i=f_i-2\times f_{i-1}+f_{i-2}\)

其实之前想过各种去重的式子,基本上就是这么个格式,这个东西是快破防了随便改改出来的(

理解一下,就是 \(f_{i-1}\) 包含了所有移动了里面那些 \(i-1,i-2\cdots\) 那些子段的情况,于是把两头减去,中间多减了一段 \(i-2,i-3\cdots\) 里面的情况,加回来就是 \(+f_{i-2}\)

于是算出这个东西之后 DFS 即可。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=4000;
const int mod=998244353;
vector<int> e[N];
bitset<N> vis;
int ans=1;
int n;
ll pa[N];
ll psum[N];
ll ca[N];
map<pair<int,int>,bool> mph;
void dfs(int s1,int u,int len){vis[u]=1;
//  pair<int,int> p;
//  p.first=min(s1,u);p.second=max(s1,u);if(s1<u){ans=(ans+ca[len])%mod;}for(int v:e[u]){if(!vis[v])vis[v]=1,dfs(s1,v,len+1);}return ;
}
void init(){ans=1;mph.clear();for(int i=0;i<=n;i++)e[i].clear();return ;
}
void solve(){cin>>n;for(int i=1;i<n;i++){int a,b;cin>>a>>b;e[a].push_back(b);e[b].push_back(a);}for(int i=1;i<=n;i++){vis.reset();dfs(i,i,1);// cout<<i<<'\n';}cout<<ans<<'\n';return ;
}
int main(){freopen("shuffling.in","r",stdin);freopen("shuffling.out","w",stdout);pa[1]=0;int len=1;for(int i=2;i<=3500;i++){pa[i]=(pa[i-1]*(len+1)%mod+len)%mod;len++;ca[i]=(pa[i]+pa[i-2]-2*pa[i-1]+mod)%mod;}int t;cin>>t;while(t--){init();solve();}return 0;
}

2 NOI2005 聪聪与可可

比较易懂的概率 DP,我咋又放了去调 T4 了。

因为猫总是能比鼠走的步数多一步,于是猫总是可以捉到鼠,如果捉不到,也会在一次行动后将与鼠的最短距离至少缩小 \(1\)

概率 DP 经典套路就是从结果往前面推,于是 \(f_{i,j}\) 表示猫在 \(i\) 鼠在 \(j\) 时候的时间期望。

考虑枚举 \(i\) 的所有二阶邻接点和鼠的邻接点 \(u,v\) 进行转移,\(f_{u,v}\) 可以转移到 \(f_{i,j}\) 的条件是 \(u,v\) 间的最短路径长小于 \(i,j\) 之间的。

到达 \(u,v\) 这个状态的条件也是可以算出的,于是这题就做完了。

还没有代码。

3

题目背景
将一排商店划分为三个连续部分,求使"普通"颜色数量最大的划分方案。

问题描述
给定 \(n\) 个商店的颜色数组,选择两个分割点 \(b_1\)\(b_2\)(满足 \(1 < b_1 < b_2 \leq n\))将数组分为三部分:\([1, b_1-1]\)\([b_1, b_2-1]\)\([b_2, n]\)。一个颜色 \(x\) 是"普通的"当且仅当它在三个部分中都至少出现一次。求最大的普通颜色数量。

数据范围

  • 测试数据组数 \(T \leq 10\)
  • 数组长度 \(n \leq 150,000\)
  • 颜色 \(a_i \leq 10^6\)

比较经典的线段树。

考虑我们先确定左边的那个分割点,然后快速找到右边的所有位置中,放下分割点收益最大的。

这就要求我们根据分割点统计右边所有位置的贡献。

单独统计出所有颜色种类的开始位置和结束位置,从前往后枚举左分割点。如果一种颜色在左分割点左侧出现过,那么我们把右分割点放在之后第一次出现该颜色的位置到结束位置前一个位置才能使这个颜色被计入答案中。

于是将这一段区间右分割点的贡献加 \(1\)

随着左端点的移动,有一部分区间的贡献是要更新的,也就是改成在此之后第一次出现改颜色的位置,这个区间减 \(1\) 也是很好维护的。

于是我们在每一次右移左分割点时候区间查最大值就可以了。

code

Show me the code
#define psb push_back
#define mkp make_pair
#define ls p<<1
#define rs (p<<1)+1
#define rep(i,a,b) for( int i=(a); i<=(b); ++i)
#define per(i,a,b) for( int i=(a); i>=(b); --i)
#define rd read()
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){ll x=0,f=1;char c=getchar();while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return x*f;
}
const int N=1e5+5;
const int M=2e6+6;
int b1[N*10],e1[N*10];
int arr[N];
int reg[M];
bitset<M> inp;
struct seg{int l,r;int cnt;int ma;bool cl;
}t[N];
void b(int p,int l,int r){t[p].l=l;t[p].r=r;t[p].ma=t[p].cnt=0;if(l==r){return ;}int mid=l+r>>1;b(ls,l,mid);b(rs,mid+1,r);return ;
}
void pushdown(int p){if(t[p].cl){t[ls].cnt=t[ls].ma=0;t[ls].cl=1;t[rs].cnt=t[rs].ma=0;t[rs].cl=1;t[p].cl=0;}return ;
}
void asi(int p,int l,int r,int k){if(t[p].l==l&&t[p].r==r){t[p].ma=k;if(t[p].ma!=0)t[p].cnt=1;else t[p].cnt=0;return ;}pushdown(p);int mid=t[p].l+t[p].r>>1;if(l<=mid)asi(ls,l,r,k);if(mid<r) asi(rs,l,r,k);t[p].ma=max(t[ls].ma,t[rs].ma);t[p].cnt=t[ls].cnt+t[rs].cnt;return ;
}
seg gmx(){return t[1];}
vector<int> vs;
void init(){memset(b1,0,sizeof b1);memset(e1,0,sizeof e1);memset(arr,0,sizeof arr);memset(reg,0,sizeof reg);inp.reset();vs.clear();return ;
}
void solve(){int n;cin>>n;for(int i=1;i<=n;i++){arr[i]=rd;vs.push_back(arr[i]);}sort(vs.begin(),vs.end());int bpm=unique(vs.begin(),vs.end())-vs.begin();for(int i=0;i<bpm;i++){reg[vs[i]]=i+1;}for(int i=1;i<=n;i++){if(b1[reg[arr[i]]]==0)b1[reg[arr[i]]]=i;}for(int i=n;i>=1;i--){if(e1[reg[arr[i]]]==0)e1[reg[arr[i]]]=i;}b(1,1,bpm+1);int ans=0;int lft=0,rgt=0;for(int i=1;i<=n;i++){if(i==b1[reg[arr[i]]]&&i!=e1[reg[arr[i]]]){inp[reg[arr[i]]]=1;t[1].cl=1;t[1].ma=t[1].cnt=0;}else if(i==e1[reg[arr[i]]]&&i!=b1[reg[arr[i]]]){inp[reg[arr[i]]]=0;asi(1,reg[arr[i]],reg[arr[i]],0);}else if(inp[reg[arr[i]]]==1)asi(1,reg[arr[i]],reg[arr[i]],b1[reg[arr[i]]]);int b11=gmx().ma+1;int b22=i+1;int res=gmx().cnt;if(res>ans){lft=b11;rgt=b22;ans=res;}}cout<<ans<<'\n';cout<<lft<<' '<<rgt<<'\n';
}
int main(){freopen("yuuka.in","r",stdin);freopen("yuuka.out","w",stdout);int T;cin>>T;while(T--){init();solve();}return 0;
}

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

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

相关文章

物流网站前端模板下载外贸 网站 建设 制作 成都

净初级生产力(NPP)是指植物在单位时间单位面积上由光合作用产生的有机物质总量中扣除自养呼吸后的剩余部分&#xff0c;是生产者能用于生长、发育和繁殖的能量值&#xff0c;反映了植物固定和转化光合产物的效率&#xff0c;也是生态系统中其他生物成员生存和繁衍的物质基础。其…

广州建设厅官方网站小程序怎么开发自己的微信小程序

xxxx 不在 sudoers 文件中。此事将被报告。 在Ubuntu中&#xff0c;可以通过将用户添加到sudo组来为其提供sudo&#xff08;超级用户&#xff09;权限。 要添加sudo权限&#xff0c;按照以下步骤操作&#xff1a; 打开终端&#xff08;CtrlAltT&#xff09;。 输入以下命令并…

互联网制作网站网络系统搭建

语义化是指根据内容的结构化&#xff08;内容语义化&#xff09;&#xff0c;选择合适的标签&#xff08;代码语义化&#xff09;。通俗来讲就是用正确的标签做正确的事情。 语义化的优点如下&#xff1a; 对机器友好&#xff0c;带有语义的文字表现力丰富&#xff0c;更适合…

怎么做公司的中英文网站网站建设 顺德

1、进程 1.1什么是进程&#xff1a;进行中的程序&#xff08;正在运行中的程序&#xff09;-process过程 程序的一次执行过程 - 进程 hello.c -- 程序源代码 a.out -- 可执行程序 1.2程序和进程的关系&#xff1a; 程序<------>进程 1.3进程怎么来的&#xff1a; 程…

网站开发需求分析报告wordpress图片排列显示

抖音服务器升级中&#xff0c;暂不支持本地区开播抖音怎么在法国直播&#xff1f;除了餐饮&#xff0c;腾讯自主研发的各种跨界开发节目也无人问津。至于年初腾讯app项目和资源&#xff0c;还没有整体发布&#xff0c;不过&#xff0c;神似的行业信息也有公布。这其中对爆红的博…

【题目合集】一元二次方程 | 换元思想

【题目合集】一元二次方程 | 换元思想 1.(2025中山市校级开学) 如果关于 \(x\) 的一元二次方程 \(ax^2 + bx + c = 0\) 有两个实数根,且其中一个根为另外一个根的 \(2\) 倍,则称这样的方程为“倍根方程”,请判断以…

GeekDoc 中文系列教程 2025.10

财富十倍比两倍更容易(双语) CEO 修炼手册 生活黑客 原则 中文版 RichAF 中文版 油管公式Quant金融机器学习的进展 自动交易员指南 算法交易系统构建指南 大数据、机器学习与量化投资 算法交易入门 Quantinsti 博客…

南昌做网站kaiu网站设计 字体

1、抓包过滤器语法和实例 抓包过滤器类型Type&#xff08;host、net、port&#xff09;、方向Dir&#xff08;src、dst&#xff09;、协议Proto&#xff08;ether、ip、tcp、udp、http、icmp、ftp等&#xff09;、逻辑运算符&#xff08;&& 与、|| 或、&#xff01;非&…

黑色背景的网站开发工具医院建筑工程网

首先javascript是一种具有面向对象能力的&#xff0c;解释型程序设计语言。 js对大小写敏感&#xff0c;一定要采取一致的字符大小写形式&#xff0c;在js中的结束分号&#xff08;&#xff1b;&#xff09;是可选的&#xff0c;为了避免JS语句错误&#xff0c;我们还是要注意添…

贪心算法 | 每周8题(一) - 指南

贪心算法 | 每周8题(一) - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

佛山网站建设有限公司开发一款app需要哪些技术

除了我们常见的家庭、社区、园区等智能监控&#xff0c;出租房作为很多人的暂住所也极易发生盗窃等事件&#xff0c;为保障大众租户的财产安全&#xff0c;旭帆科技特地针对出租屋制定了智能监控系统方案。 1、安装智能安防摄像头 高清晰度、夜视功能良好的智能摄像头&#xf…

企业网站建设一般要素包括哪些中国四大saas公司

1.涉及领域和课程&#xff1a; 信号与系统现代自动化原理与应用频谱转换及振动分析材料学基础与应力分析数学建模、仿真与求解工程数学传感器机器学习与模式识别随机信号处理反馈系统文献学DSP应用机器视觉凸优化&#xff0c;数学物理方法 2.教材推荐 豆瓣书单&#xff0c;更…

如何设计出优秀、健壮且易于维护的API——关于HTTP状态码与业务逻辑状态码的处理 - 浪矢

目录反例正确的处理方法第1步:在业务逻辑层定义并抛出“业务异常”第2步:在最外层创建“全局异常处理器”最佳实践 反例 刚开始学习后端开发时做了一个文件管理系统,其中有一个文件删除的API。 文件和目录删除操作 …

Hexo搭建/部署个人博客教程 - 实践

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

科技公司网站php源码游戏建模培训

持续创作文章&#xff0c;只是为了更好的思考 这里不多介绍了&#xff0c;我放一张图大家就明白是什么接口了。这里只介绍整体加密逻辑&#xff0c;有些细的地方大家自行调整。 本次逆向的网址是 aHR0cHM6Ly90cGFzcy5qaWxpbi5jaGluYXRheC5nb3YuY246ODQ0My8jL2xvZ2luP3JlZGly…

微信网站开发人力资源做网站的好处

今天继续和大家一起来学习初中数学&#xff0c;初一的相关知识&#xff0c;在前面已经介绍了正数和负数&#xff0c;对于有理数也有了清楚的认识&#xff0c;今天我们来学习相反数&#xff0c;相反数的概念和表示是中考命题的热点之一&#xff0c;经常结合其他知识点一起考察&a…

做题记录(Part 1. 基础算法)

P1404 平均数 既然要让子串平均数最大,那就二分平均数,判断能否达到即可。复杂度 \(O(n\log V)\)。 关联题目:[2025国庆集训Day2C] course点击查看代码 signed main(){ read(n), read(m); for(register int i = 1; …

河南艾特网站建设2二级域名免费

定义 树是节点的优先集合度&#xff1a;孩子的数量&#xff0c;度为0 就是终端节点&#xff0c;不为零就是根节点有序树&#xff1a;有顺序&#xff0c;不可以替换无序树&#xff1a;无顺序&#xff0c;可以替换深度 和 树的深度相反&#xff0c;第一层深度为1 树的深度为 3 二…

实用指南:零基础学AI大模型之Prompt提示词工程

实用指南:零基础学AI大模型之Prompt提示词工程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…