\(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. JavaMetaweblogClient,Metaweblog的java实现-从此上传博客实现全平台

    目录 1. 什么是Metaweblog? 2. Metaweblog的应用 3. 如何使用Metaweblog 4. 本项目介绍 4.1 metaweblog与java之间的关系映射 4.2 使用Ja ...

  2. 记 iTextSharp 提取中文的问题

    原文 问题 下面的代码中 currentText 能提取到大部分汉字 但是字体为 Non-Embedded Font: AdobeSongStd-Light(Horizontal) 的汉字提取不到 P ...

  3. 声学感知刻度(mel scale、Bark scale、ERB)与声学特征提取(MFCC、BFCC、GFCC)

    梅尔刻度 梅尔刻度(Mel scale)是一种由听众判断不同频率 音高(pitch)彼此相等的感知刻度,表示人耳对等距音高(pitch)变化的感知.mel 刻度和正常频率(Hz)之间的参考点是将1 k ...

  4. Prometheus 四种metric类型

    Prometheus的4种metrics(指标)类型: Counter Gauge Histogram Summary 四种指标类型的数据对象都是数字,如果要监控文本类的信息只能通过指标名称或者 la ...

  5. MathType7安装使用及please restart word to load mathtype addin properly的问题

    MathType7安装使用及please restart word to load mathtype addin properly的问题.最近在自己的电脑上安装Mathtype7,把遇到的问题和解决办 ...

  6. GDKOI 2021 Day1 TG 。。。

    看着一群群比 LHF , HQX 还强的大佬涌进了机房,本蒟蒻表示慌得一批 T1 讲题人说最简单的签到题本蒟蒻表示... \(Update\) 用 ds , dt 两个变量记录点 i 连向 s 或 t ...

  7. 五分钟搞懂POM设计模式

    转载请注明出处️ 作者:IT小学生蔡坨坨 原文链接:五分钟搞懂POM设计模式 大家好,我是IT小学生蔡坨坨. 今天,我们来聊聊Web UI自动化测试中的POM设计模式. 为什么要用POM设计模式 前期 ...

  8. USB机械键盘改蓝牙键盘

    手里有两把机械键盘,一个是IKBC 87键,一个是IKBC POKER II 60键,由于买的比较早,两把键盘均为USB的,使用起来桌面线比较多,碍事,于是开始研究如何改成蓝牙键盘. 首先说一下USB ...

  9. 【Java面试】介绍下Spring IoC的工作流程

    Hi,我是Mic 一个工作了4年的粉丝,在面试的时候遇到一个这样的问题. "介绍一下Spring IOC的工作流程" 他说回答得不是很好,希望我能帮他梳理一下. 关于这个问题,我们 ...

  10. 方法重载、方法重写、四种权限修饰、JavaBean、代码块

    方法重载(overload) 一个类中可以含有多个重名的方法. 两同一不同 ①同一个类 ②同一个方法名 ③不同参数列表:参数个数不同,参数类型不同 方法重写(override) ①子类重写的方法的修饰 ...