首页 > 其他分享 >AGC041D-Problem Scores 题解

AGC041D-Problem Scores 题解

时间:2023-11-14 13:23:14浏览次数:40  
标签:int 题解 sum AGC041D 每次 差值 操作 Problem DP

题目链接

luogu
atcoder

分析

令 \(k=\left \lfloor \frac{n}{2} \right \rfloor\)
对于第三个条件,只需要满足 \(\sum_{i=1}^{k+1}a[i]<\sum_{i=n-k+1}^{n}a[i]\) 即可
有一个 \(trick\): 构造一个单调不降或不增的序列 可以转化为每次做一次前缀加操作
例如本题要求构造一个单调不降的序列,且满足每个值都在 \([1,n]\) 中
可以转化为:先将每个数初始化为 \(n\) 每次找一个前缀 \(-1\) 进行不超过 \(n-1\) 次
我们发现每次操作对于 \(\sum_{i=1}^{k+1}a[i]-\sum_{i=n-k+1}^{n}a[i]\) 的贡献是不变的,可以 \(O(n)\) 预处理
最初差值为 \(n\) ,每次操作的贡献一定小于 \(0\) ,要保证最终差值不低于 \(1\) 则最多进行 \(n-1\) 次操作
也就是说,只要保证差值 \(>0\) 即可满足题中所有条件
之后就不难 \(DP\) 了
记 \(f[i][j]\) 为选择前 \(i\) 个操作,差值为 \(j\) 的方案数
则 \(f[n]=1\)
\(f[i][j]=f[i-1][j-k*w[i]]\)
利用完全背包的思想即可做到 \(O(n^2)\)

本来想的是 \(1\)~\(k\) , \(n\)~\(n-k+1\) 分别 \(DP\) 然后将两次 \(DP\) 的结果合到一起,但要记的状态太多,就寄了

代码

#include<bits/stdc++.h>
using namespace std;

const int N=6005;

int w[N],f[N];

int main(){
	int n,m;
	scanf("%d %d", &n, &m);
	int k=n/2;
	
	for(int i=1;i<=n;i++){//计算每次操作的贡献 
		w[i]=w[i-1];
		if(i<=k+1) w[i]--;
		if(i>=n-k+1) w[i]++;
	}
	
	f[n]=1;
	for(int i=1;i<=n;i++)
		for(int j=n+w[i];j>=0;j--)//由于 w[i]<0 所以 j 倒序枚举 
			f[j]=(f[j]+f[j-w[i]])%m;
	int ans=0;
	for(int i=1;i<=n;i++) ans=(ans+f[i])%m;
	printf("%d\n", ans);
	return 0;
}

标签:int,题解,sum,AGC041D,每次,差值,操作,Problem,DP
From: https://www.cnblogs.com/Idtwtei/p/17831386.html

相关文章

  • [题解] CF1748E Yet Another Array Counting Problem
    YetAnotherArrayCountingProblem给你一个长度为\(n\)的序列和一个数\(m\),求有多少个长度为\(n\)的序列\(b\)满足:\(\foralli\in[1,n],b_i\in[1,m]\)。对于每个区间\([l,r]\),\(b\)中最大值最靠左的位置和\(a\)相同。\(n,m\le2\times10^5,n\ti......
  • [题解] P4435 [COCI2017-2018#2] ​​Garaža
    P4435[COCI2017-2018#2]Garaža给你一个长度为\(n\)的序列\(a\),单点改,查询区间\(\gcd\)不为1的子区间个数。\(n,Q\le10^5,a_i\le10^9\)。先看单次全局查询怎么做。考虑一个分治,每次我们要计算跨过分治中心\(mid\)的答案。因为这个是单调的,所以可以双指针做......
  • 【题解】P4768 [NOI2018] 归程 / Kruskal 重构树
    补补以前懒得总结的零碎东西。kruskal重构树使用条件:求无向图中两点之间所有路径的最大边权的最小值构造:依kruskal得到最小生成树从小到大考虑生成树中的边\((u,v)\)对于\((u,v)\),新建一个结点,作为重构树中\(u,v\)的父结点该结点的点权为\((u,v)\)的......
  • SPOJ1805 HISTOGRA - Largest Rectangle in a Histogram 题解
    LinkSPOJ1805HISTOGRA-LargestRectangleinaHistogramQuestion在一条水平线上有\(n\)个高为\(a_i\)的矩形,求包含于这些矩形的最大子矩形面积。Solution我们定义\(L_i\)表示有\(a_i\)这个高度的一根悬线,往左最多能平移到什么位置初始化显然,\(a_i=i\)考虑转移......
  • 题解 AT_codefestival_2016_final_f【Road of the King】
    注意到当前移动到的位置并不重要,重要的是经过的点数和\(1\)所在强连通分量大小,因此把它们放进状态里:设\(f_{i,j,k}\)表示进行\(i\)次移动,经过了\(j\)个不同的点,此时\(1\)所在的强连通分量大小为\(k\)的方案数。考察下一次移动到的点的情况:没有访问过:共有\(n-j\)......
  • UVA11282 题解
    题意简述Kelly寄出去\(n\)封邀请函,但她希望只有小于等于\(m\)个人收到他们自己的邀请函(即有至少\(n-m\)个人收到了别人的邀请函)。思路形成容易发现,这道题是一个典型的错排题,我们只需要分别求出\(n-m\)个元素到\(n\)个元素的错排即可。接下来为错排的推导,我们令\(f......
  • [题解] P4755 Beautiful Pair
    P4755BeautifulPair给你一个长度为\(n\)的序列\(a\),求有多少个区间\([l,r]\)满足\(a_l\cdota_r\le\max_{i=l}^ra_i\)。\(n\le10^5,a_i\le10^9\)。首先按最大值位置分治。记当前分治区间为\([l,r]\),分治中心为\(mid\)。那么我们现在要做的就是统计跨......
  • 【题解 P4062 & P8313】 Yazid 的新生舞会&Izbori
    [COCI2021-2022#4]Izbori题目描述Malnar先生正在竞选县长,这个县一共有\(n\)栋房屋,每栋房屋里都住着一位居民。Malnar先生知道,选举的赢家不一定是最好的候选人,而是在选举前举办的宴会最好的候选人。因此,在选举前几天,他将邀请第\(l\)至\(r(l\ler)\)栋房屋内居住的居民,为......
  • 【题解】CF1891E - Brukhovich and Exams
    【题解】CF1891E-BrukhovichandExamshttps://www.luogu.com.cn/problem/CF1891E我们考虑把区间分段:若两个相邻的数不互素,中间分开;若两个相邻的数中有且仅有一个\(1\),中间分开。那么我们得到了两种区间:全\(1\)区间与无\(1\)区间。若两个相邻数在同一区间内,那么就在区间......
  • [题解] CFgym101623F Factor-Free Tree
    Factor-FreeTree当一棵二叉树中的每个节点的权值都与它所有祖先的权值互质时,我们称它为factor-freetree。给你一棵按照中序遍历的顺序的权值序列\(a\),求这个序列是否对应这一棵factor-freetree。如果是就输出每个节点的父亲。\(n\le10^5,a_i\le10^7\)。考虑怎么......