首页 > 其他分享 >2024ICPC网络赛(2)-K.Match——匹配、奇妙的n4 DP

2024ICPC网络赛(2)-K.Match——匹配、奇妙的n4 DP

时间:2024-09-21 23:01:49浏览次数:10  
标签:lb 2024ICPC int times pb ans n4 DP MOD

题目:https://qoj.ac/contest/1799/problem/9380
题意:给两个长度为 \(n\) 的序列 \(a,b\),若 \(a_i\oplus b_j\geq k\) 则连一条左侧 \(i\) 到右侧 \(j\) 的边,这样得到一张二分图。对于每个 \(x=1,\dots,n\),询问大小为 \(x\) 的匹配的数量。
\(1\leq n\leq 200\).


首先要知道一般二分图匹配计数大概是做不了的,那么这里必然要思考 \(a_i\oplus b_j\geq k\) 的限制
对位运算考虑类似拆位的东西,比如 \(k=010110\),那么\(\geq k\) 的会形如 1xxxxx,011xxxx,01011x,对于 \(k\) 在二进制下的每个数位,先把 \(A,B\) 对应地按照这一位是 \(0/1\) 划分成 \(A_0,A_1,B_0,B_1\):

  • 如果 \(k\) 这一位是 \(0\),\((A_0,B_1),(A_1,B_0)\) 中间总是两两有边存在。\((A_0,B_0),(A_1,B_1)\) 的边的贡献则可以递归计算,假设其中答案分别是 \(f,g\) 两个序列,则(这里有点符号混用,\(A_0\) 表示这个集合大小): $$ans[i+j+x+y]=f_i\times g_j\times \binom{A_0-i}{x}\binom{B_1-j}{x}\binom{A_1-j}{y}\binom{B_0}{y}\times x!\times y!$$
  • 如果 \(k\) 这一位是 \(1\),则只考虑 \((A_0,B_1),(A_1,B_0)\) 的答案,假设分别是 \(f,g\) 两个序列,则 \(ans_i=\sum_{j} f_j\times g_{i-j}\)

这样暴力转移最坏是 \(A_0\times A_1\times B_0\times B_1\) 的复杂度,注意到 \(A_0+A_1,B_0+B_1\) 是定值,其取到最大值就是当 \(A_0=A_1,B_0=B_1\) 的时候,可以给出复杂度 $$T(n)=2T( \frac{n}{2} )+O(( \frac{n}{2})^4 )=\frac{n^4 }{16}+\frac{n^4 }{128}+\dots$$
但是可以跑的飞快…

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define endl '\n'
#define fastio ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long ll;
constexpr int N=205;
constexpr int MOD=998244353;
int n,C[N][N],fact[N];
ll a[N],b[N],k;
vector<int> id;
void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;}
vector<int> solve(int la,int ra,int lb,int rb,int j){
    if(la>ra||lb>rb)return id;
    if(j==-1){//边界情况,不受到任何限制,相当于随便选
        int sa=ra-la+1,sb=rb-lb+1,L=min(sa,sb);
        vector<int> ans(L+1);
        for(int i=0;i<=L;i++)ans[i]=(ll)C[sa][i]*C[sb][i]%MOD*fact[i]%MOD;
        return ans;
    }
    int pa=la-1,pb=lb-1;
    while(pa+1<=ra&&((a[pa+1]>>j)&1)==0)pa++;
    while(pb+1<=rb&&((b[pb+1]>>j)&1)==0)pb++;
    int L=min(ra-la+1,rb-lb+1);
    vector<int> ans(L+1);
    if(k>>j&1){
        auto f=solve(la,pa,pb+1,rb,j-1);
        auto g=solve(pa+1,ra,lb,pb,j-1);
        for(int i=0;i<f.size();i++)for(int j=0;j<g.size();j++){
            if(i+j>L)break;
            add(ans[i+j],(ll)f[i]*g[j]%MOD);
        }
    }else{
        auto f=solve(la,pa,lb,pb,j-1);
        auto g=solve(pa+1,ra,pb+1,rb,j-1);
        int A0=pa-la+1,A1=ra-pa,B0=pb-lb+1,B1=rb-pb;
        f.resize(min(A0,B0)+1);g.resize(min(A1,B1)+1);
        for(int i=0;i<(int)f.size();i++)for(int j=0;j<(int)g.size();j++)
            for(int x=0;x<=min(A0-i,B1-j);x++)for(int y=0;y<=min(A1-j,B0-i);y++){
                if(i+j+x+y>L)break;
                add(ans[i+j+x+y],(ll)f[i]*g[j]%MOD*C[A0-i][x]%MOD*C[B1-j][x]%MOD*fact[x]%MOD*C[A1-j][y]%MOD*C[B0-i][y]%MOD*fact[y]%MOD);
            }
    }
    
    return ans;
}
int main(){
    fastio;
    fact[0]=1;
    for(int i=1;i<N;i++)fact[i]=(ll)fact[i-1]*i%MOD;
    for(int i=0;i<N;i++)C[i][0]=1;
    for(int i=0;i<N;i++)for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
    cin>>n>>k;
    id={1};
    rep(i,1,n)cin>>a[i];
    rep(i,1,n)cin>>b[i];
    sort(a+1,a+n+1);
    sort(b+1,b+n+1);
    auto ans=solve(1,n,1,n,60);
    for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
    return 0;
}

标签:lb,2024ICPC,int,times,pb,ans,n4,DP,MOD
From: https://www.cnblogs.com/yoshinow2001/p/18424667

相关文章

  • LangChain4j支持的API类型
    本文描述了底层的大语言模型(LLM)API。高级的LLMAPI参见AI服务。1LLMAPI的类型1.1LanguageModel非常简单—,接受一个String作为输入,并返回一个String作为输出。该API现正逐渐被聊天API(第二种API类型)取代。1.2ChatLanguageModel这种API接受一或多个ChatMessage作为输入,并返......
  • 数字产品护照 (DPP) 解决方案:利用 Blazor 和区块链实现产品全生命周期追踪
    数字产品护照(DPP)解决方案:利用Blazor和区块链实现产品全生命周期追踪随着全球对可持续发展和产品透明度的关注日益增加,企业需要一种可靠的方法来跟踪和管理产品生命周期中的关键数据。我们的数字产品护照(DigitalProductPassport,DPP)系统正是为此而生,提供了一种安全透明的方......
  • 基于UDP的网络编程
    基于UDP的网络编程@[toc]使用基于UDP的网络编程方法,完成远程计算等差数列的前n项和功能(1)客户端将一等差数列的首项a1,公差d和项数n发送给服务器;(2)服务器端接收到数据后对接收到的数据进行解析,将前n项和的计算结果发送给客户端;(3)客户端收到后输出到控制台。UDPSenderpackageMoocPart......
  • WordPress 迁移插件终极指南
    迁移WordPress网站就像收拾房子搬到新房子一样。确保所有内容(内容、主题、插件、媒体文件甚至数据库)完美移动且没有任何损坏的挑战似乎令人畏惧。但就像搬家公司让搬家变得更容易一样,WordPress迁移插件简化了将网站从一台主机移动到另一台主机的复杂过程。无论您是切换主机、从......
  • JAVA网络编程【基于TCP和UDP协议】超详细!!!
    ip地址:唯一标识主机的地址端口号:用于标识计算机上某个特定的网络程序InetAddress类方法说明InetAddressInetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)InetAddressInetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址......
  • 解决QFC810.exe运行时错误:soundplayer.dll文件丢失,恢复音频播放的实用指南
    当遇到QFC810.exe运行时错误,提示soundplayer.dll文件丢失时,这通常意味着你的系统或应用程序目录中缺少了必要的动态链接库文件(DLL),导致音频播放功能无法正常工作。以下是一份恢复音频播放的实用指南:一、确认问题首先,确认错误消息确实是由于soundplayer.dll文件丢失引起的。这......
  • 三维手势 handpose 3D RGB 手势3D建模 三维建模-手势舞 >> DataBall
    请关注即将发布 handposexplus项目三维手势handpose3DRGB单目相机手势识别手语歌曲Friends手势检测手势3D建模三维建模咨询合作DataBall项目,欢迎加以下微信。助力快速掌握数据集的信息和使用方式。......
  • ScheduledThreadPoolExecutor
    总结继承自ThreadPoolExecutor并实现了ScheduledExecutorService接口。提供了基于线程池的定时任务调度功能,允许你安排任务在未来某个时间点执行一次,或者周期性地重复执行。特性定时任务:可以安排任务在指定延迟后执行。周期性任务:可以安排任务按照固定的时......
  • ThreadPoolExecutor 与 ForkJoinPool比较
    都是Java并发包java.util.concurrent中用于执行任务的线程池,但它们的设计目的和适用场景有所不同。下面是两者之间的主要区别:设计目标ThreadPoolExecutor:主要用于处理大量异步任务。适用于各种类型的任务,特别是那些独立运行且不需要相互协作的任务。提供了高度的......
  • WordPress中最佳播客插件:入门级指南
    近年来,播客在全球范围内迅速普及,成为人们获取信息和娱乐的重要途径。对于想在WordPress网站上添加播客功能的用户来说,选择合适的插件非常重要。本文将为大家介绍几款适合用户入门级WordPress播客插件,让你轻松实现播客功能。1.PodcastPlayer简介PodcastPlayer是一款简单易用的插......