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. Maven导包报错Could not resolve dependencies for projectXXX was cached in the local repository....

    问题 将项目和maven仓库一起拿到了内网环境,一直报错无法解析依赖was cached in the local repository, resolution will not be reattem ...

  2. 想构建一个Web学习数据库管理系统

    ​ 有过爬虫的学习基础,凭借兴趣学习到 视频爬取和反向解析那里(没学完). 以及最新出来的技术 分布式多线程.selenium.scrpy 等技术  3 3 防盗链 抓取梨视频(1)_哔哩哔哩_bil ...

  3. mybatis的mapper接口动态代理开发

    一.必须遵守的四项原则 1:接口 方法名==xx.xml中的id名 2:方法返回值类型与Mapper.xml文件中返回值类型一致 3:方法的入参类型与Mapper.xml文件中入参值类型一致 4:命名 ...

  4. Eclipse 安装Server-Apache Tomcat 选择(Tomcat 9.0选项)

    1.打开组件安装 Eclipse→Help→Install New Software 2.输入当前eclipse对应版本(例如:2022-06),选择提示的官方路径 3.选择最底下的Web, XML, ...

  5. Navicat Premium 16无限试用教程

    1.前往官网下载[Navicat Premium 16] http://www.navicat.com.cn/products 2.创建清理试用信息bat Navicat Premium 16Crac ...

  6. 同余最短路&转圈背包算法学习笔记(超详细)

    一.问题引入 当你想要解决一个完全背包计数问题,但是 \(M\) 的范围太大,那么你就可以使用同余最短路. 二.算法推导过程 首先对于一个完全背包计数问题,我们要知道如果 \(x\) 这个数能凑出来, ...

  7. JavaScript中的DOM和Timer(简单易用的基本操作)

    JavaScript中的DOM和Timer基本操作 DOM操作 传统的选择器 选择器id var elements = document.getElementById(id的名称); 例如: var ...

  8. 【工具】FreePic2PDF+PdgCntEditor|PDF批量添加书签(Windows)

    这俩软件都不大,比较便携. FreePic2PDF: 我下载的来源:https://www.52pojie.cn/thread-1317140-1-1.html(包含下载链接https://www.l ...

  9. 使用 C++ 20 协程降低异步网络编程复杂度

    传统异步回调 vs C++20协程 协程是一种函数对象,可以设置锚点做暂停,然后再该锚点恢复继续运行.它是如何应用在网络异步编程方面的,请对比下面的两种代码风格: 基于回调的异步网络编程 先来看一个异 ...

  10. 【语义分割专栏】:FCN实战篇(附上完整可运行的代码pytorch)

    目录 前言 FCN全流程代码 模型搭建(model) 数据处理(dataloader) 评价指标(metric) 训练流程(train) 模型测试(test) 效果图 结语 前言 FCN原理篇讲解:[ ...