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. Solon AI MCP Server 入门:Helloworld (支持 java8 到 java24。国产解决方案)

    目前网上能看到的 MCP Server 基本上都是基于 Python 或者 nodejs ,虽然也有 Java 版本的 MCP SDK,但是鲜有基于 Java 开发的. 作为Java 开发中的国产顶级 ...

  2. 常用的 JVM 配置参数有哪些?

    常用的 JVM 配置参数 JVM 配置参数可以用来控制 Java 程序的内存分配.垃圾回收.性能优化等.以下是一些常用的 JVM 配置参数: 1. 堆内存相关参数 -Xms:设置 JVM 初始堆内存大 ...

  3. IEC101、IEC103、IEC104、Modbus报文解析工具

    一.概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用.为适应网络传输,2000年IEC TC57又出版了IEC 60870-5- ...

  4. edge浏览器新版,开心的扔掉chrome!还是微软更良心!windows系统全球用也没说啥!让你android能!

    直接上图吧,这下google慌了吧!微软给力呀!关键是版本直接最新的chromium!比起qq浏览器70,360浏览器78新的多了: 微软开发,质量信得过,就个人隐私之类的我更相信微软,比起googl ...

  5. Nacos源码—9.Nacos升级gRPC分析四

    大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 1 ...

  6. Data Preparation in Pandas

    Data Preparation in Pandas Data cleaning import pandas as pd import numpy as np string_data=pd.Serie ...

  7. 【晴神宝典刷题路】codeup+pat 题解索引(更新ing

    记录一下每天的成果,看多久能刷完伐 c2 c/c++快速入门 <算法笔记>2.3小节--C/C++快速入门->选择结构 习题4-10-1 奖金计算 <算法笔记>2.4小节 ...

  8. windows环境下的常用命令

    1.appwiz.cpl 程序和功能 2.certmgr.msc 证书管理实用程序 3.control 控制面板 4.firewall.cpl 防火墙 5.fsmgmt.msc 共享文件夹管理器 6. ...

  9. Java进阶知识点:接口幂等性

    幂等概念    在计算机中,表示对同一个过程应用相同的参数多次和应用一次产生的效果是一样,这样的过程即被称为满足幂等性.    也可以进行如下表述:一个HTTP请求方法,如果被请求多次和被请求一次效果 ...

  10. Vue3 开发需要安装的工具

    Node 和Npm 扩展 node运行时和node包管理器 1.node.js.npm 处理TypeScript 2.tsc.tsc-node 创建vue3工程 3.create-preset 处理J ...