首页 > 其他分享 >AGC046C 题解

AGC046C 题解

时间:2024-08-05 19:51:12浏览次数:6  
标签:le 题解 复杂度 AGC046C cases gets dp

blog。好菜啊,不会这题,来写个题解 /kel。


很难直接做,先找一点性质:操作只改变相对顺序,而总数不变。

这启示我们记录每个 \(0\) 前面的极长 \(1\) 连续段长度。记第 \(i(1\le i\le C)\) 个 \(0\) 对应长度为 \(a_i\),就存在下面的等价表述:

每次操作可以选定 \(i,j(1\le i<j\le C)\),将 \(a_i\) 加 \(1\),\(a_j\) 减 \(1\),且始终有 \(\forall a_i\ge0\)。

注意到,如果选定 \((p,i)(i,q)\),实际只是 \(a_p\) 少了 \(1\),\(a_q\) 多了 \(1\),可以用一步 \((p,q)\) 代替。于是此时存在操作次数更少的相同方案。

也就是说,每一位要么始终加,要么始终减

不难用 dp 刻画:\(dp_{i,p,q}\) 表示前 \(i\) 个数用了 \(p\) 次 \(+1\) 与 \(q\) 次 \(-1\)(\(p\ge q\)),方案数。不难有如下 \(O(n^2 k^2)\) 的转移:

\[\begin{cases}dp_{i,p,q}\gets dp_{i-1,p,q}\\dp_{i,p,q}\gets dp_{i-1,p-t,q} & (1\le t\le x)\\dp_{i,p,q}\gets dp_{i-1,p,q-t} & (1\le t\le \min(q,a_i))\end{cases} \]

\(k\) 很大。但是注意到每个 \(1\) 至多被移动一次。因为移动很多次的话,实际可以一步到位,于是必然存在操作次数更少的相同方案。

所以可以令 \(k\gets\min(k,|S|)\),复杂度就降为了 \(O(n^4)\)。不难前缀和优化至 \(O(n^3)\)。


小细节:可以在 \(S\) 末尾添加一个 0,来处理末尾 \(1\) 连续段。

code,时间复杂度 \(O(n^4)\),加上指令集后可以轻松通过。三次方做法懒得改了,反正其他题解有写。

标签:le,题解,复杂度,AGC046C,cases,gets,dp
From: https://www.cnblogs.com/liangbowen/p/18343931

相关文章

  • 洛谷-P9574 题解
    思路分析分析样例:==TTBTBTTBTBTTTBTTB->TTBTTBBTTBTTTBTTB->TTBTTBTBBTTTTBTTB->TTBTTBTBBTTTTTBBT----1-----2-----3---4--观察区块2,发现BTTB进行操作后与右边的TB再次构成BTTB,我们发现在这个区块内,可以从左向右不断操作,我们称这种特性为传递性,可......
  • AT_abl_e Replace Digits 题解
    题目传送门前置知识线段树解法需要维护区间信息,考虑使用线段树维护。预处理出\(\overline{xx\dotsx}\),其中\(x\in\{1,2,3,4,5,6,7,8,9\}\),便于区间赋值。然后就是普通的线段树板子了。代码#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#de......
  • AGC027C 题解
    注意到如果可以构造出所有由\(\texttt{A}\)和\(\texttt{B}\)组成的字符串,那么在图上游走的路径必须成环,并且的环上的每一个点都必须同时有一个\(\texttt{A}\)邻居和\(\texttt{B}\)邻居。于是可以考虑把点拆分为入点和出点,相邻两个点为\(\texttt{AA},\texttt{BB}\)的,从......
  • npm下载包时报错 Unexpected token ‘.‘问题解决
    项目场景:项目需要使用node18.12.0以上版本的,但是npm下载显示异常问题描述当通过nvm切换nodejs版本为16以上时,npminstall[package]报错:Unexpectedtoken'.'原因分析:提示:该问题不是npm的问题,也不是nodejs的问题,是nvm-windows的问题我是通过nvm-windows已经更新版本......
  • 《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲
        下面大纲为《数据结构习题解析与实验指导_李冬梅,张琪编著》总结出的大纲,可装13学习下:          ......
  • Codeforces Round 963 (Div. 2) D题解
    CodeforcesRound963D题目描述给定两个正整数n和k以及另一个由n个整数组成的数组a。在一次操作中,可以选择a中大小为k的任意一个子数组,然后将其从数组中删除,而不改变其他元素的顺序。更正式地说,假设(l,r)是对子数组a[l],a[l+1],...,a[r]的操作,使得r-l+1......
  • leetcode200. 岛屿数量C++题解,精美图例和流程图,一题带你弄懂图的dfs遍历算法
    leetcode200.岛屿数量给你一个由‘1’(陆地)和‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:grid=[[“1”,“1”,“1”,......
  • [POI2015] POD 题解
    前言题目链接:洛谷。题意简述长度为\(n\)的一串项链,每颗珠子是\(k\)种颜色之一。第\(i\)颗与第\(i-1,i+1\)颗珠子相邻,第\(n\)颗与第\(1\)颗也相邻。切两刀,把项链断成两条链。要求每种颜色的珠子只能出现在其中一条链中。求方案数量(保证至少存在一种),以及切成的两段......
  • CF1993C Light Switches 题解
    CF1993CLightSwitches题解题目大意有\(n\)盏灯,第\(i\)盏灯亮着的时间为\([a_i+bk,a_i+(b+1)k-1]\),其中\(k\)为给定常数,\(b\)为任意非负偶数。求一个最小的\(t\),使得在时间\(t\)所有灯都是亮着的。Solve令\(m=2k\),显然所有灯的开关状态以\(m\)为周期,所以我们......
  • P5086 的题解
    (一)将输入的四个数差分得到三个值,这三个值相同的两个坐标符合条件。用map存储记录这三个值的结构体,然后用vector存储下标。(二)AC代码。#include<bits/stdc++.h>#definedbdouble#definepbpush_back#definefifirst#definesesecond#definemkpmake_pair#defin......