首页 > 其他分享 >洛谷 P8923 -『MdOI R5』Many Minimizations

洛谷 P8923 -『MdOI R5』Many Minimizations

时间:2023-07-18 19:34:24浏览次数:50  
标签:Minimizations R5 洛谷 coef int MAXN 答案 dp mod

怎么 ARC 还能撞题的?只能说 Kubic 牛逼。

首先显然没法保序回归。考虑用类似于凸壳优化 DP 的做法解决原问题(也就是 P4331):

  • 设 \(dp_{i,j}\) 表示考虑前 \(i\) 位,\(x_i=j\) 的最小代价,显然有 \(dp_{i,j}=\min_{k\le j}\{dp_{i-1,k}+|j-a_i|\}\)
  • \(dp\) 值显然是一个折线,用堆维护斜率改变的拐点,那么每次加入一个元素相当于:
    • 加入 \(a_i\),取出最大元素 \(x\),答案加上 \(x-a_i\),再加入 \(a_i\)。

考虑转化贡献体,将“答案加上 \(x-a_i\)”,改为”数有多少 \(x\le t<a_i\),每出现一个这样的 \(t\),答案加一“。考虑这个枚举 \(t\),将 \(\le t\) 的看作 \(0\),\(>t\) 的看作 \(1\),那么我们发现堆中的数只有 \(01\) 之分,而答案会加以当且仅当堆中存在 \(1\) 且加入的 \(a_i\) 为 \(0\)。

这样有一个暴力 DP 是 \(dp_{i,j}\) 表示考虑前 \(i\) 个元素,目前堆中有 \(j\) 个 \(1\) 有多少种方案数,这样可以做到 \(O(n^2m)\),但是还是不足以通过此题。

考虑优化,根据 DP 的过程可知,一个 \(t\) 对应的贡献之和其实是一个关于 \(t\) 的 \(n+1\) 次多项式,于是不难想到求出这个多项式的系数,然后插值求出答案。那么怎么求出这个多项式的系数呢?重新审视这个 DP 过程,发现类似于网格图路径计数:每次可以向右上走一格或者向右下走一格,如果到 \(y=0\) 以下就回到 \(y=0\),向右上走有 \(m-t\) 的系数,向右下走有 \(t\) 的系数。然后如果向下走并且当前不在 \(y=0\) 就会产生 \(1\) 的答案。

怎么处理这个问题呢?如果我们强制要求不能走到 \(y=0\) 以下,那么问题是经典的反射容斥。但是这里的问题是走到 \(y=0\) 以下不会对答案产生贡献,那么我们很自然地想到那总的向下走的次数减去走到 \(y=0\) 时向下走的次数。后者可以对答案差分贡献:容易证明,一条在 \(y=0\) 时候向下走的次数 \(\ge c\) 的路径,与一条从 \((0,c)\) 出发,每次向右上或右下走,到达 \(x=n\) 且经过了 \(y=0\) 的路径一一对应,而后者也是经典的反射容斥,于是统计下 \(coef_p\) 表示答案多项式里 \(t^p(m-t)^{n-p}\) 的系数即可。

时间复杂度 \(O(n^2)\)。

const int MAXN=5000;
int n,m,mod,c[MAXN+5][MAXN+5],coef[MAXN+5],v[MAXN+5];
int qpow(int x,int e){
	int ret=1;
	for(;e;e>>=1,x=1ll*x*x%mod)if(e&1)ret=1ll*ret*x%mod;
	return ret;
}
int calc(int x){return (c[n][n+x>>1]-c[n][n+x+2>>1]+mod)%mod;}
int main(){
	scanf("%d%d%d",&n,&m,&mod);
	for(int i=0;i<=n;i++){
		c[i][0]=1;
		for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
	}
	for(int s=0;s<=n;s++)if((n-s)%2==0){
		int v=1ll*calc(s)*((n-s)>>1)%mod;
		coef[(n-s)/2]=(coef[(n-s)/2]+v)%mod;
		coef[min(s+(n-s)/2+1,n+1)]=(coef[min(s+(n-s)/2+1,n+1)]-v+mod)%mod;
	}
	for(int s=1;s<=n+1;s++)coef[s]=(coef[s]+coef[s-1])%mod;
	int ss=0,res=0;
	for(int i=1;i<=n+2;i++){
		int cpw=qpow(m-i,n),stp=1ll*i*qpow(m-i,mod-2)%mod;
		for(int j=0;j<=n;j++)ss=(ss+1ll*coef[j]*cpw)%mod,cpw=1ll*cpw*stp%mod;
		v[i]=ss;
	}
	for(int i=1;i<=n+2;i++){
		int up=1,dw=1;
		for(int j=1;j<=n+2;j++)if(i!=j)
			up=1ll*up*(m-j+mod)%mod,dw=1ll*dw*(i-j+mod)%mod;
		res=(res+1ll*up*qpow(dw,mod-2)%mod*v[i])%mod;
	}printf("%d\n",res);
	return 0;
}

标签:Minimizations,R5,洛谷,coef,int,MAXN,答案,dp,mod
From: https://www.cnblogs.com/tzcwk/p/luogu-P8923.html

相关文章

  • 使用PCR532(PN532)读取二代身份证uid
    背景笔者住的地方大门是智能门禁锁,需要刷身份证或指纹进出,但指纹识别不灵敏经常验证失败,使用身份证可以打开,但是身份证携带不便,更糟糕的是丢失了比较麻烦,笔者通过互联网检索资料了解到二代证是一种ic卡,是遵循ISO14443TypeB协议的卡片,这种ic卡与手机nfc的频率相同,都是13.56mhz,可......
  • 该更新你的认知了!升级DDR5内存不亏
    DDR5内存在最近一段时间价格持续走低,很多用户都比较纠结选择DDR5和DDR4的问题,尤其是游戏玩家,所以今天我们就来看一下主流频率下DDR5内存与DDR4内存的游戏性能差距。这次我们我们用DDR57200、DDR56000、DDR44200、DDR43600这4个热门内存频率来对比一下。DDR4开启Gear1模式,两......
  • 洛谷-P9455 题解
    写在前面:本题蒟蒻给出两种做法,一种乱搞贪心(只是目前能过,若能被Hack请和我说),一种正解二分。正文1最坏时间复杂度:\(\mathcal{O}(n+\logV)(V=10^9)\)这个做法是很简单的,在此不多讲。只需要二分超频电压mid即可,若当前mid可行,则令右边界缩小至mid,否则令左边界扩大至mid。......
  • 洛谷 Luogu P1038 [NOIP2003 提高组] 神经网络
    这题看着很吓人实则很简单。求输出层,正着求很麻烦,因为知不道谁连向这个点,所以可以反向建边,反着求。拓扑+dfs,时间复杂度\(\text{O(n+m)}\)#include<iostream>#include<cstdio>#include<queue>#defineN105#defineM(N*N/2+114)structE{intv,w;......
  • ps磨皮插件DR5白金版,支持PS2023
    ps磨皮插件DeliciousRetouch简称DR,dr5白金版对于摄影后期的人员来说非常实用,它可以帮你轻松实现一键美白美妆。有了这款插件你完全不需要太多的技巧,直接运用软件内置的预设即可完成照片的美容修饰操作。ps磨皮插件DR5白金版下载DeliciousRetouch5插件功能特色皮肤平滑工......
  • 洛谷P1219 [USACO1.5] 八皇后 Checker Challenge
    写在前面我又回来了!偷了几天懒,还认识我吗?甭管认识不认识,还是要自我介绍一番:本人是初学c++的初中生,还是个蒟蒻,最要命的是没有脑子。今天,还请允许我浪费您一点时间,叨叨上几句。本题目来自于洛谷,网址https://www.luogu.com.cn/problem/P1219,建议在洛谷上看一下。本题解非盈利,无恶......
  • 洛谷 P4931 [MtOI2018] 情侣?给我烧了!(加强版)
    洛谷传送门设\(f_i\)为\(i\)对情侣完全错位的方案数,那么答案为:\[\binom{n}{k}\frac{n!}{(n-k)!}2^kf_{n-k}\]分别代表选择\(k\)对情侣,选择它们的位置,情侣可以换位。\(f_i\)有递推公式:\[f_i=4i(i-1)(f_{i-1}+2(i-1)f_{i-2})\]考虑选出两个人,另外......
  • How to ak 【LGR-145-Div.4】洛谷入门赛 #14?
    A数字判断#include<bits/stdc++.h>#include<ext/pb_ds/assoc_container.hpp>#include<ext/pb_ds/tree_policy.hpp>#include<ext/pb_ds/hash_policy.hpp>#definereregister#definelll__int128#definegcgetchar#defineptputchar#definei......
  • 洛谷 P6667 [清华集训2016] 如何优雅地求和
    洛谷传送门点值不好搞。考虑把它搞成系数一类的东西。由二项式反演,\(f(x)=\sum\limits_{i=0}^x\binom{x}{i}b_i\Leftrightarrowb_i=\sum\limits_{j=0}^i\binom{i}{j}(-1)^{i-j}f(j)\)。然后我们要求:\[\sum\limits_{k=0}^n\sum\limits_{i=0}^ms_i\bino......
  • 洛谷 P3372 【模板】线段树 1
    题目传送门题目描述如题,已知一个数列,你需要进行下面两种操作:1.将某一个数加上x2.求出某区间每一个数的和输入格式第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。第二行包含N个用空格分隔的整数,其中第i个数字表示数列第i项的初始值。接下来M行每行包含3......