题目

给出两个等长的序列\(a,b\),

重排序列\(b\),使得\(a+b\)众数出现的次数最多


分析

设\(f[i]\)表示众数为\(i\)的贡献,那么

\(f[i]=\sum_{j<i}min(A[j],B[i-j])\)

其中大写的\(a,b\)表示次数,但是这个东西很难做,

考虑把它变成正常的卷积的形式,那么就转换成判定,

判定\(f[i]\)是否能够达到阈值,那么显然就变成了只有\(0,1\)的卷积,

但是这样会超时,考虑阈值仅限于不超过一个常数就可以了


代码

#include <cstdio>
#include <cctype>
#include <queue>
#define rr register
using namespace std;
const int mod=998244353,N=100011,inv3=332748118; priority_queue<pair<int,int> >q;
int a[N],b[N],A[N],B[N],ff[N<<2],n,TOT[2],lim,gg[N<<2],ans[N<<2],Ans,Gmi[31],Imi[31];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline signed mo1(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline signed mo2(int x,int y){return x<y?x-y+mod:x-y;}
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
namespace Theoretic{
int rev[N<<2],LAST,tt[N<<2];
inline void Pro(int n){
if (LAST==n) return; LAST=n;
for (rr int i=0;i<n;++i)
rev[i]=(rev[i>>1]>>1)|((i&1)?n>>1:0);
}
inline void NTT(int *f,int n,int op){
Pro(n);
for (rr int i=0;i<n;++i)
if (i<rev[i]) swap(f[i],f[rev[i]]);
rr int p=2,len=1;
for (rr int o=1;p<=n;++o){
rr int W=(op==1)?Gmi[o]:Imi[o];
for (rr int i=0;i<n;i+=p){
rr int t=1;
for (rr int j=i;j<i+len;++j){
rr int z=1ll*f[len+j]*t%mod;
f[len+j]=mo2(f[j],z),f[j]=mo1(f[j],z);
t=1ll*t*W%mod;
}
}
p<<=1,len<<=1;
}
}
inline void Cb(int *f,int *g,int n){
for (rr int i=0;i<n;++i) f[i]=1ll*f[i]*g[i]%mod;
}
inline void times(int *f,int *g,int len,int lim){
rr int n=1,invn; for (;n<lim;n<<=1);
for (rr int i=0;i<len;++i) tt[i]=g[i];
for (rr int i=len;i<n;++i) tt[i]=0;
NTT(f,n,1),NTT(tt,n,1),Cb(f,tt,n),NTT(f,n,-1);
for (rr int i=lim;i<n;++i) f[i]=0;
for (rr int i=0;i<n;++i) tt[i]=0;
invn=ksm(n,mod-2);
for (rr int i=0;i<lim;++i)
f[i]=1ll*f[i]*invn%mod;
}
}
inline void GmiImi(){
for (rr int i=0;i<31;++i) Gmi[i]=ksm(3,(mod-1)/(1<<i));
for (rr int i=0;i<31;++i) Imi[i]=ksm(inv3,(mod-1)/(1<<i));
}
inline void Prep(int lim){
for (rr int i=1;i<=n;++i) ff[i]=a[i]>=lim;
for (rr int i=1;i<=n;++i) gg[i]=b[i]>=lim;
Theoretic::times(ff,gg,n,n*2);
for (rr int i=1;i<=n;++i) ans[i]+=ff[i];
}
signed main(){
n=iut(),GmiImi();
for (rr int i=1;i<=n;++i) ++a[iut()];
for (rr int i=1;i<=n;++i) ++b[iut()];
for (rr int i=1;i<N;++i) if (a[i]) q.push(make_pair(a[i],0));
for (rr int i=1;i<N;++i) if (b[i]) q.push(make_pair(b[i],1));
while (!q.empty()){
rr int t=q.top().second; q.pop();
if ((++TOT[t])*TOT[t^1]>1e8) break;
}
if (!q.empty()) lim=q.top().first+1;
for (rr int i=1;i<=lim;++i) Prep(i);
for (rr int i=1;i<=n;++i) if (a[i]>lim) A[++A[0]]=i;
for (rr int i=1;i<=n;++i) if (b[i]>lim) B[++B[0]]=i;
for (rr int i=1;i<=A[0];++i)
for (rr int j=1;j<=B[0];++j)
ans[A[i]+B[j]]+=min(a[A[i]],b[B[j]])-lim;
for (rr int i=1;i<=2*n;++i)
if (Ans<ans[i]) Ans=ans[i];
return !printf("%d",Ans);
}

#NTT,DP#U138580 简单的打击的更多相关文章

  1. ZOJ 4257 MostPowerful(状压DP,简单)

    题目大意:不超过10种气体,两两之间相互碰撞可以产生一定的能量,如a碰b,那么b气体就消失,自身不能碰自身,问最后所能得到的最大能量. 原代码链接:http://blog.csdn.net/accry ...

  2. 数位dp 的简单入门

    时间紧张,就不讲那么详细了. 之前一直被深搜代码误解,以为数位dp 其实就是记忆化深搜...(虽说爆搜确实很舒服而且还好想) 但是后来发现数位dp 的标准格式其实是 预处理 + dp ...... 数 ...

  3. 斜率优化dp 的简单入门

    不想写什么详细的讲解了...而且也觉得自己很难写过某大佬(大米饼),于是建议把他的 blog 先看一遍,然后自己加了几道题目以及解析...顺便建议看看算法竞赛(蓝皮书)的 0x5A 斜率优化(P294 ...

  4. PKU 1458 Common Subsequence(最长公共子序列,dp,简单)

    题目 同:ZJU 1733,HDU 1159 #include <stdio.h> #include <string.h> #include <algorithm> ...

  5. DP的简单应用

    Problem A:简单的图形覆盖 Time Limit:1000MS  Memory Limit:65536KTotal Submit:201 Accepted:104 Description 有一 ...

  6. dp优化简单总结

    1.二分优化 (使用二分查找优化查找效率) 典型例题:LIS dp[i]保存长度为 i 的上升子序列中最小的结尾,可以用二分查找优化到nlogn 2.数学优化 (通过数学结论减少状态数) 例题1:hd ...

  7. HDU 1024 Max Sum Plus Plus(DP的简单优化)

    Problem Description Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To b ...

  8. dp的简单递推笔记1

    (1)转自rockZ的博文 UVa 10328 - Coin Toss (递推) 题意:给你一个硬币,抛掷n次,问出现连续至少k个正面向上的情况有多少种. 原题中问出现连续至少k个H的情况,很难下手. ...

  9. 2017-5-14 湘潭市赛 Similar Subsequence 分析+四维dp+一些简单优化

    Similar Subsequence Accepted : Submit : Time Limit : MS Memory Limit : KB Similar Subsequence For gi ...

  10. 树形DP(简单题)(Y HDU4705)

    题意:给出一个n个节点的树形图,统计{A,B,C}的数量,其中ABC分别是树上三个不同的节点,并且这三个节点不能被一条路径覆盖 分析:对于下图 进行dfs深搜统计,num[u]统计回溯到当前节点u,并 ...

随机推荐

  1. APISIX介绍

    APISIX是什么 Apache APISIX是Apache软件基金会下的云原生API网关,它兼具动态.实时.高性能等特点,提供了负载均衡.动态上游.灰度发布(金丝雀发布).服务熔断.身份认证.可观测 ...

  2. crontab采坑总结

    目录 crontab环境变量 脚本缺少执行权限 crontab是Linux平台实现定时任务的服务工具,通常情况下该服务会预装在发行版中,直接使用即可. 关于crontab的详细用法参考:https:/ ...

  3. django学习第九天---raw查询原生sql和python脚本中调用django环境和ORM锁和事务

    ORM执行原生sql语句 在模型查询api不够用的情况下,我们还可以使用原始的sql语句进行查询 方式1 raw() raw()方法,返回模型的实例django.db.models.query.Raw ...

  4. java+mysql实现的公益管理系统

    一功能 1.管理员的登录 2.公益项目的增删改查 3.负责人的增删改查 4.捐款人的增删改查 5.志愿者增删改查 二界面展示 1.欢迎界面 2.登录界面 3.系统首页 4.项目管理 5.负责人管理 6 ...

  5. 【LeetCode剑指offer#06】实现pow函数、计算x的平方根

    实现pow函数 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn ). 示例 1: 输入:x = 2.00000, n = 10 输出:1024.00000 示例 2: 输入:x ...

  6. 【Azure 应用服务】FTP 部署 Vue 生成的静态文件至 Linux App Service 后,访问App Service URL依旧显示Azure默认页面问题

    问题描述 将 JS项目打包为静态文件后,通过 FTP 上传到 App Service For Linux 的 /home/site/wwwroot文件夹中.但打开App Service URL 后依旧 ...

  7. 关于KMP模式匹配的一些思考

    算法简介 模式匹配 给定主串text和模式串pattern,在主串中查找,如果找到了模式串,返回模式串在主串中的起始位置,从1开始计数. 暴力求解求解模式匹配 算法的核心思想是:蛮力法.即使用两个指针 ...

  8. RocketMQ(11) 消息重试机制和死信队列

    七.消息发送重试机制 1 说明 Producer对发送失败的消息进行重新发送的机制,称为消息发送重试机制,也称为消息重投机制. 对于消息重投,需要注意以下几点: 生产者在发送消息时,若采用同步或异步发 ...

  9. 3. JVM运行时数据区

    1. 运行时数据区概述 前面的章节中已经将类的加载过程大致过程说清楚了,此时类已经加载到内存中,,后面就是运行时数据区的各个组件的工作了 由上图可以看出来, jvm将class字节码加载完成后,后面运 ...

  10. 14 CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!)C. Tenzing and Balls(dp+前缀最大值优化)

    思路: dp还是挺明显的,思路可以参考最长上升子序列 有点dp的感觉 \(f[i]\)表示考虑前\(i\)个数,的最大值 当前数有两种删或不删 不删:\(f[i]=f[i-1]\); 删:\(f[i] ...