CF2092F Andryusha and CCB

CF 官解感觉跳了很多步啊,自己写一篇造福后人。

首先肯定是不能直接求的,考虑转化贡献体。对划分的段数转化贡献依旧不好求,考虑对每个子串的美感度转化贡献,即先枚举每个子串的美感度。

然后发现这样枚举是非常优异的。首先,划分子串不能增加总的美感度,而划分 \(c\) 段至多减少 \(c-1\) 的美感度。于是随着美感度 \(k\) 在枚举中增加,可划分的子串数量在减少。假设总的美感度为 \(x\),对于 \(k\) 能划分的子串数量是 \(O(\frac{x}{k})\) 级别的。根据调和级数知识,我们枚举划分的段数时间复杂度是 \(O(n\log n)\) 的。

其次,这样一定不会算重,即对于每个前缀,每个划分的段数只会在一个 \(k\) 里被计算。假设对于某个前缀某个划分的段数 \(c\) 在两个不同的 \(k_1,k_2\) 中被计算,不妨设 \(k_1\lt k_2\)。则至少需要划分 \(c(k_2-k_1)+1\) 段才能减少足够的美感度以满足总美感度相同,因为 \(k_2-k_1\gt 0\),所以 \(c(k_2-k_1)+1\gt c\),矛盾,故不会算重。

然后我们考虑每一对 \((k,c)\) 的贡献。现在我们只关心 \(0\) 和 \(1\) 交界的地方,因为只有这里能产生美感度。因此,我们把序列改写成极长的 \(0\) 或 \(1\) 连续段,每个元素代表一个连续段。这样写的好处是相邻元素一定会贡献 \(1\) 点美感度。以下下标均指改写后的序列,从 \(1\) 开始。

直接求也是不好做的,于是我们考虑递推。如果 \(c=1\),显然只有 \(k+1\) 结尾的前缀满足要求。如果 \(c=2\),直接把后面 \(k+1\) 个元素作为下一段就行,是 \(2k+2\) 结尾的前缀。特别的,如果 \(k+1\) 号元素长度大于 \(1\),我们可以考虑然后后面的前缀延伸进 \(k+1\) 号元素,这样 \(2k+1\) 结尾的前缀也满足条件。

这启发我们考虑贡献的连续性。具体的,如果 \(c-1\) 的贡献区间是 \([l,r]\),考虑递推 \(c\) 的贡献区间。同上所述,\([l+k+1,r+k+1]\) 一定是可以的。想要延长这一区间,我们只需要考虑 \(l+k+1\) 这一边界,因为其他前缀减 \(1\) 后已经被包含。如果第 \(l\) 号元素长度大于 \(1\),可以让第 \(c\) 个子串延伸进第 \(l\) 号元素,所以 \(l+k\) 结尾的前缀可以取到。

最后,我们记录每一个极长连续段的左边界和右边界,差分做区间加即可。

注意 \(k=0\) 的时候需要特别计算。

#include <bits/stdc++.h>
using namespace std;
long long t,n,a[2000000],b[2000000],l[2000000],r[2000000],ans[2000000];
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);
long long m=0;
for(int i=1;i<=n;i++)
{
scanf("%1lld",&a[i]);
if(i==1||a[i]!=a[i-1])b[++m]=1,l[m]=r[m]=r[m-1]+1;
else b[m]++,r[m]++;
}
for(int i=0;i<=n+1;i++)ans[i]=0;
for(int i=1;i<m;i++)
{
long long pl=i+1,pr=i+1;
ans[l[pl]]++,ans[r[pr]+1]--;
for(int j=2;j<=m/i;j++)
{
if(b[pl]==1)pl=pl+i+1,pr=pr+i+1;
else pl=pl+i,pr=pr+i+1;
if(pr>m&&pl<=m)ans[l[pl]]++,ans[r[m]+1]--;
else if(pr<=m)ans[l[pl]]++,ans[r[pr]+1]--;
}
}
for(int i=1;i<=n;i++)ans[i]+=ans[i-1];
for(int i=1;i<=m;i++)
for(int j=l[i];j<=r[i];j++)
ans[j]+=(j-i+1);
for(int i=1;i<=n;i++)printf("%lld ",ans[i]);
printf("\n");
}
return 0;
}

CF2092F Andryusha and CCB 题解的更多相关文章

  1. [CF780C]Andryusha and Colored Balloons 题解

    前言 完了,完了,咕值要没了,赶紧写题解QAQ. 题意简述 给相邻的三个节点颜色不能相同的树染色所需的最小颜色数. 题解 这道题目很显然可以用深搜. 考虑题目的限制,如果当前搜索到的点为u, 显然u的 ...

  2. 【题解】C2Crni - Crni [COCI2010] [SP7884]

    [题解]C2Crni - Crni [COCI2010] [SP7884] 传送门:\(\text{C2Crni - Crni}\) \(\text{[COCI2010]}\) \(\text{[SP ...

  3. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  4. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  5. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  6. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  7. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  8. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  9. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  10. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. SpringBoot校验请求Json参数

    spring boot 校验请求json参数 在后端开发中,通过接口和参数传输来进行与前端交互,才可以让一个项目成型. 由于全后端隔离的方式,所以有时候需要不那么信任前端,也就是在验证当前操作是否有权 ...

  2. MCP开发应用,使用python部署sse模式

    一.概述 MCP服务端当前支持两种与客户端的数据通信方式:标准输入输出(stdio)  和 基于Http的服务器推送事件(http sse) 1.1 标准输入输出(stdio) 原理:  标准输入输出 ...

  3. centos 7.8下载地址

    随着7.9版本的正式版本的发布,7.8.2003版本逐渐被各大镜像站替换,取消. 7.8.2003版本的可以自行在华中科技大学的镜像站下载,这个地址也可能随时会失效,如果失效了同学们可以自行百度搜寻. ...

  4. 解决 podman 容器无法在宿主机和容器内部相互访问问题的记录

    解决 podman 容器无法在宿主机和容器内部相互访问问题的记录 近期在使用 podman 时,遇到了容器无法在宿主机和容器内部相互访问的问题.经过一番探索,参考了这篇文章,成功解决了该问题.在此,我 ...

  5. 解决ssh连接docker容器环境变量无效的问题

    问题缘由: 因在docker容器中的linux系统输入nvcc 等命令都是有效的,但通过ssh连接到docker容器内,就存在该命令未找到等问题,查询资料得知,这是因为通过ssh连接docker容器后 ...

  6. React-Native开发鸿蒙NEXT-本地与沙盒加载bundle

    React-Native开发鸿蒙NEXT-本地与沙盒加载bundle 来晚了来晚了,不是想偷懒,实在是一个图片问题没搞定导致效果出不来,今天刚靠工具查出了原因. RN的加载无非本地加载与沙盒加载两种方 ...

  7. QJson出现“\n“变成“\\n“

    在使用QJson的时候出现了字符串有\n的情况,在QJson转换为QByteArray的时候,\n变成了\n的情况,可以通过这样解决 int index = -1; do { index = qByt ...

  8. odoo14里面附件传输接口

    @http.route('/fmcg/download/pdf', type='http', auth="public", csrf=False, cors='*') def up ...

  9. 2023人形全能赛v831代码(包括YOLOv2识别和扫码以及颜色识别)

    v831 import time, math from maix import nn, camera, display, image import serial class YOLOv2: def _ ...

  10. CRD的简单介绍

    介绍 Custom Resource Define 简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式. CRD 资源可以动态注册到集群中,注册完毕后, ...