首页 > 其他分享 >[ARC160C] Power Up

[ARC160C] Power Up

时间:2023-11-15 23:13:32浏览次数:36  
标签:le Power int ARC160C sum Up times maxn dp

题目描述:

给出一个大小为 \(N\) 的可重集 \(A=\lbrace\ A_1,A_2,\dots,A_N\ \rbrace\)。

你可以执行若干次如下操作(也可以不执行)。

  • 将两个 \(x\) 合并成一个 \(x+1\)。

输出最终可能的集合个数对 \(998244353\) 取模的结果。

数据范围:

\(1\le N\le 2\times 10^5\)

\(1\le Q\le 2\times 10^5\)

思路:

实话实说,我觉得这个题其实没有那么好做。

首先一开始我就犯了一个审题错误:我误以为是必须两个相邻的才能合并


然后我们回归正题。思考这个题目中的这个问题该怎么处理。

我们发现,似乎当前这轮的个数只与上一轮的有关系,所以我们考虑令 \(dp_{i,j}\) 表示当前枚举到了 \(i\) 这个数,并且有 \(j\) 个 \(i\) 存在的序列的个数

然后转移也是简单的 \(dp_{i,j+a_i}=\sum\limits_{k=2\times j}^{lst}dp_{i-1,k}\) 其中 \(lst\) 表示上一轮最多有多少的 \(i-1\)

然后我们对这个式子进行一个变形,使其变得好看一点 \(dp_{i,j'}=\sum\limits_{k=2\times (j-a_i)}^{lst}dp_{i-1,k}\)

这样我们就可以使用后缀和优化这个式子了。

最后需要注意的是,因为最后的 \(mx\) 最终最多拥有 \(\log_2 n\) 的个数,所以需要增加 \(\log_2 n\) 次循环。


然后我们分析一下复杂度:

首先空间复杂度可以通过滚动数组优化到 \(O(N)\)

时间复杂度比较奇怪,他应该是类似于 \(n\times \left( 1+\frac{1}{2}+\frac{1}{4}+\frac{1}{8}+\cdots \right)\le 2\times n\)

所以时间复杂度 \(O(2n)\) 左右。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=2e6+5;
const int mod=998244353;
const int inf=0x3f3f3f3f;
int n;
int a[maxn];
int bul[maxn],sum[maxn],dp[maxn];
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i],bul[a[i]]++;
    int mn=n,mx=0;
    for(int i=1;i<=n;i++)mn=min(mn,a[i]),mx=max(mx,a[i]);
    int lst=bul[mn];
    for(int i=lst;i>=0;i--)sum[i]=1;
    for(int i=mn+1;i<=mx+20;i++){
        lst=bul[i]+lst/2;
        for(int j=0;j<bul[i];j++)dp[j]=0;
        for(int j=bul[i];j<=lst;j++)dp[j]=sum[(j-bul[i])*2];
        sum[lst]=dp[lst];
        for(int j=lst-1;j>=0;j--)sum[j]=(sum[j+1]+dp[j])%mod;
    }
    cout<<sum[0]<<endl;
    return 0;
}

标签:le,Power,int,ARC160C,sum,Up,times,maxn,dp
From: https://www.cnblogs.com/Candycar/p/17835093.html

相关文章

  • Crypto_BUUCTF_WriteUp | 还原大师
    题目我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB????08?????51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD......
  • vue中el-upload结合vuedraggable实现图片的上传、排序、删除以及预览等功能_element u
    <template><div><ulclass="el-upload-listel-upload-list--picture-card"style="display:flex;"><div><!--start:拖拽开始end:拖拽结束imageLists:需要展示图片的数组-->......
  • 无涯教程-Dart - Updating The Index函数
    Dart允许修改列表中元素的值,换句话说,可以重写列表项的值,以下示例说明了相同的内容-voidmain(){Listl=[1,2,3];l[0]=123;print(l);}上面的示例使用索引0更新List项的值。代码的输出将为-[123,2,3]参考链接https://www.learnfk.com/dart-programming/......
  • luoguP3287 [SCOI2014] 方伯伯的玉米田
    题目描述方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美。这排玉米一共有NN株,它们的高度参差不齐。方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感的玉米拔除掉,使得剩下的玉米的高度构成一个单调不下降序列。方伯伯可以选择一个区间,把这......
  • bupt ai院第一次周赛题解
    题目一简单模拟题点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineebkemplace_back#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefvector<string>VS;typedef......
  • 软件测试|MySQL中的GROUP BY分组查询,你会了吗?
    MySQL中的GROUPBY分组查询:详解与示例在MySQL数据库中,GROUPBY语句用于将数据按照指定的列进行分组,并对每个分组执行聚合函数操作。这就是的我们可以在查询中汇总数据并生成有意义的结果。本文将深入介绍MySQL中的GROUPBY语句,并提供示例来说明其用法。基本语法在MySQL中,GRO......
  • Jupyter notebook中如何切换多个kernel安装所需包
    Jupyternotebook中如何切换多个kernel安装所需包前言:Jupyternotebook可以建立多个环境,防止环境“打架”。以我的电脑为例,有四个环境,此外都使用了conda。运行kernel的路径:1.在Jupyternotebook中运行:importsysprint(sys.executable)会打印出当前系统kernel的运行路......
  • 箭头函数表达式的语法比函数表达式更简洁,并且没有自己的 this、arguments、super 或 n
    请问以下JS代码最终输出的结果和num值分别是多少?vartest=(function(){varnum=0return()=>{returnnum++}}())for(vari=0;i<20;i++){test()}console.log(test());A20、20B20、21C21、21D21、20正确答案:Btest函数的作用就是......
  • jmeter-set up先登录获取token,再测试
    1.顶部加通用的信息头管理,cookie管理器 2.添加setup线程组,用户数为13.添加登录请求4.添加断言,添加debug调试 5.提取json,  6.添加debug,运行后查看是否获取到token 7.设置token为全局变量 8.再添加线程组,线程组可正常设置并发数需要用到token的地方再添加......
  • ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule
    1、错误场景和现象Linux开启或重启防火墙后,使用默认驱动程序创建网络“docker-compose_default”报错如下:Creatingnetwork"docker-compose_default"withthedefaultdriverERROR:FailedtoSetupIPtables:UnabletoenableSKIPDNATrule:(iptablesfailed:iptab......