\(ZJOI2022\)

众数

发现并不存在\(poly(log(n))\)的做法,那么尝试\(n\sqrt n\)

套路的按照出现次数分组,分为大于\(\sqrt n\)和小于\(\sqrt n\)

然后分别维护,小数对小数的贡献为什么要算两次,我们贡献是一段区间众数\(-\)这个数出现次数,是因为貌似一边连续从开始一段颜色需要考虑

//根号分治比较显然,分块维护不是很可行
//出现次数大于根号n,最多有根号n个,然后枚举哪些颜色变成这个颜色
//然后找一个合适的位置转移过去
//出现次数小于根号,枚举变化位置即可
//我们的贡献计算方式分为
//大于根号的向大于根号的贡献
//大于根号的向小于根号的贡献
//小于根号的向大于根号的贡献
//小于根号的向小于根号的贡献
//前三种都在第一次处理时解决
//考虑怎么贡献,我们可以枚举对别的的贡献
//那么我们每次暴力修改一段区间,更新内部的
//我们Max求的一直是,我们能最多多多少
#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;
int a[MAXN],b[MAXN],t[MAXN],bc[MAXN],sum[MAXN],Max[MAXN],Lim,tot,n;
vector<int>poz[MAXN];
map<int,int>mp;
void solve()
{
for(int i=1;i<=n;i++) sum[i]=0;
for(int i=1;i<=n;i++)
{
if(t[a[i]]<=Lim)
{ int p=lower_bound(poz[a[i]].begin(),poz[a[i]].end(),i)-poz[a[i]].begin();
//我们这一步只需要求区间众数就好了
//贡献就是区间众数-本数字出现次数
// cout<<"now: "<<a[i]<<" "<<i<<" "<<p<<"\n";
for(int j=p,l,r;j>=0;j--)
{
if(j==0) l=1;
else l=poz[a[i]][j-1]+1;
r=poz[a[i]][j];
// cout<<j<<" "<<poz[a[i]].size()<<" "<<l<<" "<<r<<"\n";
Max[a[i]]=max(Max[a[i]],sum[l]-(p-j));
while(l<=r&&sum[r]<p-j+1) sum[r--]=p-j+1;
}
}
}
}
void sol()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
mp.clear();tot=0;
memset(t,0,sizeof(t));
memset(bc,0,sizeof(bc));
memset(Max,0,sizeof(Max));
for(int i=1;i<=n;i++) poz[i].clear();
sort(b+1,b+1+n);
for(int i=1;i<=n;i++)
{
if(!mp[b[i]]) mp[b[i]]=++tot,bc[tot]=b[i];
// t[mp[b[i]]]++;
// poz[mp[b[i]]].push_back(i);
}
for(int i=1;i<=n;i++) a[i]=mp[a[i]],t[a[i]]++,poz[a[i]].push_back(i);
Lim=sqrt(n);
for(int i=1;i<=tot;i++)
{
if(t[i]>Lim)
{
sum[0]=0;
for(int j=1;j<=n;j++)
{
sum[j]=sum[j-1]+(int)(a[j]==i);
}
int l=0,s=0;
//我们其余的对当前贡献相当于一个最大子段和
for(int j=1;j<=tot;j++)
{
int N=t[j],l=0,r,s=0;
for(int k=0;k<N;k++)
{
r=poz[j][k];
s=max(0,s-(sum[r]-sum[l]))+1;
Max[i]=max(Max[i],s);
l=r;
}
l=s=0;
for(int k=0;k<N;k++)
{
r=poz[j][k];
s=max(s,0)+sum[r]-sum[l];
Max[j]=max(Max[j],s--);
l=r;
}
}
}
}
solve();
reverse(a+1,a+1+n);
for(int i=1;i<=tot;i++)
{
reverse(poz[i].begin(),poz[i].end());
for(int j=0;j<poz[i].size();j++) poz[i][j]=n-poz[i][j]+1;
}
solve();
int Ans=0;
for(int i=1;i<=tot;i++)
{
Max[i]+=t[i];
Ans=max(Ans,Max[i]);
}
cout<<Ans<<"\n";
for(int i=1;i<=tot;i++)
{
if(Max[i]==Ans) cout<<bc[i]<<"\n";
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--) sol();
}

\(T2\)

计数题滚出OI

一道(对我)并不签到的(对大家而已的)签到题

首先我们可以枚举\(2^n\)的状态,表示第一个树的叶子集合,然后方案也比较好求

树的形态就是在保证每个点找一个前面的点然后把叶子不对的容斥出去,子集容斥就好了\(?\)

\(O(2^n n)\)的暴力直接枚举两树形态,转移时候直接把非叶子节点标记为\(1\)即可

然后发现合并的时候\(dp[n][x]=dp[n][x_{rev}]\)

就很\(nb\)了,意思就是,我们得到了两棵树状态确定之后,他们的情况数是相同的

我们就先确定一个树的状态

\(f(S)\)为恰好\(S\)不是叶子的方案数

\(g(S)\)为钦定除了\(S\)之外的点都是叶子(\(S\)之内可是可不是)的方案数

\(g(S)\)易得

\(g(S)=\Pi_{i=2}^n\sum_{j\in S}[j<i]\)

直接枚举前面的可以成为非叶子的去选

\(f(S)=\sum_{T\subset S,1\not\in T}(-1)^{|T|}g(S\backslash T)\)

我们要求\(\sum_S f^2(S)\)

需要拆开计算

\(\large\sum_S f^2(S)=\sum_S\sum_{T_1\in S}\sum_{T_2\in S}(-1)^{|T_1|+|T_2|}\large(\small \Pi_{i=2}^n\sum_{j\in S\backslash T_1}[j<i]\large)\large(\small \Pi_{i=2}^n\sum_{j\in S\backslash T_2}[j<i]\large)\)

化简一下

\(\sum_{S}\sum_{T_1\in S}\sum_{T_2\in S}(-1)^{|T_1|+|T_2|}\Pi_{i=2}^n (\sum_{j\in S\backslash T_1 [j<i]})(\sum_{j\in S\backslash T_1} [j<i])\)

到这就可以\(dp\)了

具体的话,我们仅需要枚举我们当前的\(i\)在哪些里面做贡献就好了,把后面两个\(\sum\)压入状态

#include<bits/stdc++.h>
#define int long long
#define MAXN 505
using namespace std;
int dp[2][MAXN][MAXN];
int n,mod;
signed main()
{
scanf("%lld%lld",&n,&mod);
dp[0][1][1]=1;
for(int i=1;i<n;i++)
{
int now=i%2;
int pre=now^1;
memset(dp[now],0,sizeof(dp[now]));
for(int j=1;j<=i;j++)
{
for(int k=1;k<=i;k++)
{
int val=dp[pre][j][k]*j%mod*k%mod;
dp[now][j][k]+=2*val;
dp[now][j+1][k+1]+=val;
dp[now][j+1][k]-=val;
dp[now][j][k+1]-=val;
}
}
int Ans=0;
for(int j=1;j<=i+1;j++)
{
for(int k=1;k<=i+1;k++)
{
(Ans+=dp[now][j][k])%=mod;
}
}
cout<<(Ans+mod)%mod<<"\n";
}
}

ZJOI2022选做的更多相关文章

  1. [SDOI2016]部分题选做

    听说SDOI蛮简单的,但是SD蛮强的.. 之所以是选做,是因为自己某些知识水平还不到位,而且目前联赛在即,不好花时间去学sa啊之类的.. bzoj4513储能表&bzoj4514数字配对 已写 ...

  2. 20175221 《Java程序设计》迭代和JDB(课下作业,选做):

    20175221 <Java程序设计> 迭代和JDB(课下作业,选做): 任务详情 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功 ...

  3. MyOD(课下作业,选做)

    MyOD(课下作业,选做) 代码要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.b ...

  4. 迭代和JDB(课下作业,选做)

    迭代和JDB(课下作业,选做) 题目要求 1 使用C(n,m)=C(n-1,m-1)+C(n-1,m)公式进行递归编程实现求组合数C(m,n)的功能 2 m,n 要通过命令行传入 3 提交测试运行截图 ...

  5. 20175312 2018-2019-2 《Java程序设计》第6周课下选做——类定义

    20175312 2018-2019-2 <Java程序设计>第6周课下选做--类定义 设计思路 1.我觉得Book其实就是一个中转的作用,由测试类Bookself通过Book输入数据,然 ...

  6. 20175314薛勐 MyOD(课下作业,选做)

    MyOD(课下作业,选做) 要求 编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 思路 伪代码: 读取命令行输入的参数(文件名) 以16为每个字 ...

  7. 20155228 2017-11-19 实现mypwd(选做,加分)

    20155228 2017-11-19 实现mypwd(选做,加分) 题目和要求 学习pwd命令 研究pwd实现需要的系统调用(man -k; grep),写出伪代码 实现mypwd 测试mypwd ...

  8. 2017-2018-2 20165312 课下选做 MySort

    2017-2018-2 20165312 课下选做 MySort 题目描述 模拟实现Linux下Sort -t : -k 2的功能,参考 Sort的实现. import java.util.*; pu ...

  9. 「LOJ2000~2023」各省省选题选做

    「LOJ2000~2023」各省省选题选做 「SDOI2017」数字表格 莫比乌斯反演. 「SDOI2017」树点涂色 咕咕咕. 「SDOI2017」序列计数 多项式快速幂. 我们将超过 \(p\) ...

随机推荐

  1. 我使用Spring AOP实现了用户操作日志功能

    我使用Spring AOP实现了用户操作日志功能 今天答辩完了,复盘了一下系统,发现还是有一些东西值得拿出来和大家分享一下. 需求分析 系统需要对用户的操作进行记录,方便未来溯源 首先想到的就是在每个 ...

  2. QC快速充电

    QC快充 一.高通QC快充的介绍 二.识别充电类型的芯片介绍 三.QC充电曲线 四.如何在log中看QC充电类型 五.QC3识别错误 六.波形图 一.高通QC快充的介绍 高通QC快充技术,又称Quic ...

  3. Vulhub靶场搭建教程

    Vulhub靶机环境搭建 Vulhub地址: Vulhub下载地址 一.所需环境 1.Ubuntu16.04 2.最新版本Docker 二.安装之路 1.下载Ubuntu16.04下载地址(迅雷下载6 ...

  4. MySQL锁(乐观锁、悲观锁、多粒度锁)

    锁 并发事务可能出现的情况: 读-读事务并发:此时是没有问题的,读操作不会对记录又任何影响. 写-写事务并发:并发事务相继对相同的记录做出改动,因为写-写并发可能会产生脏写的情况,但是没有一个隔离级别 ...

  5. C#/VB 数据库连接字符串大全

    C#/VB 数据库连接字符串大全 https://www.connectionstrings.com/ SQL Server常用 Standard Security Server=myServerAd ...

  6. 搭建个人博客,Docsify+Github webhook+JGit解决方案

    一开始博客使用的 Halo,发现问题比较多啊,时不时的莫名其妙主题各种报错,有时候还要升级,麻烦的要死,于是就想弄简单点. 这两天抽空反复倒腾了一遍,不小心还把镜像给尼玛删了,发的文章都没了,痛定思痛 ...

  7. SpringBoot之:SpringBoot的HATEOAS基础

    目录 简介 链接Links URI templates Link relations Representation models 总结 简介 SpringBoot提供了HATEOAS的便捷使用方式,前 ...

  8. 我给航母做3D还原:这三处细节,太震撼了…

    前两天,我国第三艘航母正式下水,受到国际舆论高度关注.国产福建舰火出了圈,"航母"从军事专业领域,也火到了普通人的视野中. 图源网络 人们一边感叹我国实力强劲,一边对"航 ...

  9. 如何在vscode 背景配置一个动态小女孩

    D:\Microsoft VS Code\resources\app\out\vs\code\electron-browser\workbench <!-- Copyright (C) Micr ...

  10. element ui 自定义主题失败(primordials is not defined)

    卸载: 1.卸载cnpm npm uninstall cnpm -g 2.卸载vue-cli npm uninstall @vue/cli -g 3.卸载nodejs和删除文件 C:\Program ...