首页 > 其他分享 >Disjoint-Set-Union Sum (诈骗题)(区间DP, 位置顺序!!!!)

Disjoint-Set-Union Sum (诈骗题)(区间DP, 位置顺序!!!!)

时间:2023-04-05 17:55:08浏览次数:42  
标签:arr Set Union Sum 合并 long int ans mod

题目大意:

 

  • 给出一个序列P , n 个点
  • 每次可以选择2个 相邻区间进行合并, 会产生一个贡献值,当然合并n-1就合并完了, 问在所有的情况下, 贡献和是多少

 

 思路:

  • 易错点:
  • 这个所有情况, 你枚举的合并的那个先后顺序是有关系的!!!
  • 因此直接去区间dp只能把各个合并的情况给弄出来,但是他的先后顺序是给定的!!!!
  • 将合并2个区间的操作 转化成-> 点亮 i 和 i+1之间的边, 这样就转化为了组合数问题, 
  • 考虑 l-r区间的值 会被贡献几次,  从整体上看, 选的点,他一定是比左右端点连着的2个边先选, 就利用组合数去做就彳于了
#include <bits/stdc++.h>
using namespace std;
#define ri int 
#define M 2000005

int n,m;
long long arr[M];
long long dp[M];
const int mod=998244353;
long long inv[M];
long long ksn(long long  a,int b)
{
    long long ans=1;
    while(b)
    {
        if(b&1) ans=ans*a%mod;
        b>>=1;a=a*a%mod;        
    }
    return ans;
}
long long C(int a,int b)
{
    if(a<b) return 0;
    if(b==0) return 1;
    if(a==b) return 1;
    
    return dp[a]*inv[a-b]%mod*inv[b]%mod;
}
int main(){
    
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    cin>>n;
    for(ri i=1;i<=n;i++)
    {
        cin>>arr[i];
        arr[i]+=arr[i-1];
        arr[i]%=mod;
    }
    dp[0]=1;
    for(ri i=1;i<=n;i++)
    {
        dp[i]=dp[i-1]*i%mod;
        inv[i]=ksn(dp[i],mod-2);
    }
    long long ans=0;
    for(ri k=2;k<=n;k++)
    {
        for(ri i=1;(i+k-1)<=n;i++)
        {
            int j=i+k-1;
            int tmp=0;
            if(i>1) tmp++;
            if(j<n) tmp++;
            for(ri g=(j-i);g<=n-1-tmp;g++)
            {
            
                ans+=(arr[j]-arr[i-1]+mod)%mod*C(g-1,j-i-1)%mod*dp[j-i]%mod*dp[n-1-j+i-tmp]%mod*dp[tmp]%mod*C(n-1-tmp-g+1+tmp-1,tmp)%mod;
                ans%=mod;
            }
        
        
        }
    }
    
    cout<<ans;
    
    
    
    
} 
View Code

 

标签:arr,Set,Union,Sum,合并,long,int,ans,mod
From: https://www.cnblogs.com/Lamboofhome/p/17290101.html

相关文章

  • python list tuple dict set
    pythonlist列表tuple元组dict字典set集合Python语言简洁明了,可以用较少的代码实现同样的功能。这其中Python的四个内置数据类型功不可没,他们即是list,tuple,dict,set。这里对他们进行一个简明的总结。https://www.cnblogs.com/soaringeveryday/p/5044007.htmltuple是一个不......
  • 简单的CMakePresets.json解析 -- configurePresets
    ----CMake官方文档-----CMakeLists.txt是通用的c++项目管理文件,在不同的设备中,环境变量,编译器等都可能不同,将这些设置都交给CMakeLists.txt,并不是一个好办法。为了降低CMakeLists.txt的臃肿程度,简化其判断,可以针对不同设备,配置不同的CMakePresets.json.使得项目可以在......
  • memset的用法详解
    memset的用法详解memset简介memset是一个初始化函数,作用是将某一块内存中的全部设置为指定的值。void*memset(void*s,intc,size_tn);s指向要填充的内存块。c是要被设置的值。n是要被设置该值的字符数。返回类型是一个指向存储区s的指针。需要说明的几个地方一、......
  • Python ORM Pony 常用表连接聚合操作(sum()、count()、min()、max()、avg()等)
    Pony是一个高级的对象关系映射器ORM框架。Pony它能够使用Python生成器表达式和lambdas向数据库编写查询。Pony分析表达式的抽象语法树,并将其转换为SQL查询。支持SQLite,MySQL,PostgreSQL和Oracle等数据库,本文主要介绍PythonORMPony中常用聚合操作(sum()、count()、min()、max(......
  • Solution Set - APIO2014
    目录A.回文串B.序列分割C.连珠线A回文串给定字符串\(S\)。对\(S\)的所有回文子串,求其长度与出现次数之积的最大值。\(|S|\le300000\)。点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull......
  • 数据结构之Set | 让我们一块来学习数据结构
    数组(列表)、栈、队列和链表这些顺序数据结构对你来说应该不陌生了。现在我们要学习集合,这是一种不允许值重复的顺序数据结构。我们将要学到如何创建集合这种数据结构,如何添加和移除值,如何搜索值是否存在。你也会学到如何进行并集、交集、差集等数学运算。本章内容包括:从头创建一个S......
  • js中e.clientX e.pageX e.offsetX e.screenX之间的区别
     event.clientX、event.clientY鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性event.pageX、event.pageY类似于event.clientX、event.clientY,但它们使用的是文档坐标而非窗口坐标。这2个属性不是标准属性,但......
  • mysql中find_in_set()函数的使用
    首先举个例子来说: 有个文章表里面有个type字段,它存储的是文章类型,有1头条、2推荐、3热点、4图文等等。现在有篇文章他既是头条,又是热点,还是图文,type中以1,3,4的格式存储。那我们如何用sql查找所有type中有4的图文类型的文章呢?? 这就要我们的find_in_set出马的时候到了。......
  • Chisel3 使用 DPI-C,发现在 Chisel 环境下 printf 没问题,但是 set_pc 死活传不到 cpp
    大概率是因为你使用了SignExt之类的封装这类封装只会把”值“传给DPI-C,而不会把线连给DPIC,即,传过去的是调用set_pc时的值,而不是引用这样会造成CPP获取不了相应线路的指针 如下图     这些也是错的......
  • Unity升级后打包AssetBundle变慢
    1)Unity升级后打包AssetBundle变慢​2)打包使有些资源合成了一个资源data.unity3d,有些分开的原因3)Unreal在移动设备中无法使用Stat命令获取到GPUThread的耗时4)Unity中如何看到相机视野范围内的剔除结果这是第330篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社......