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 题解的更多相关文章
- [CF780C]Andryusha and Colored Balloons 题解
前言 完了,完了,咕值要没了,赶紧写题解QAQ. 题意简述 给相邻的三个节点颜色不能相同的树染色所需的最小颜色数. 题解 这道题目很显然可以用深搜. 考虑题目的限制,如果当前搜索到的点为u, 显然u的 ...
- 【题解】C2Crni - Crni [COCI2010] [SP7884]
[题解]C2Crni - Crni [COCI2010] [SP7884] 传送门:\(\text{C2Crni - Crni}\) \(\text{[COCI2010]}\) \(\text{[SP ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
随机推荐
- 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 ...
- 想构建一个Web学习数据库管理系统
有过爬虫的学习基础,凭借兴趣学习到 视频爬取和反向解析那里(没学完). 以及最新出来的技术 分布式多线程.selenium.scrpy 等技术 3 3 防盗链 抓取梨视频(1)_哔哩哔哩_bil ...
- mybatis的mapper接口动态代理开发
一.必须遵守的四项原则 1:接口 方法名==xx.xml中的id名 2:方法返回值类型与Mapper.xml文件中返回值类型一致 3:方法的入参类型与Mapper.xml文件中入参值类型一致 4:命名 ...
- Eclipse 安装Server-Apache Tomcat 选择(Tomcat 9.0选项)
1.打开组件安装 Eclipse→Help→Install New Software 2.输入当前eclipse对应版本(例如:2022-06),选择提示的官方路径 3.选择最底下的Web, XML, ...
- Navicat Premium 16无限试用教程
1.前往官网下载[Navicat Premium 16] http://www.navicat.com.cn/products 2.创建清理试用信息bat Navicat Premium 16Crac ...
- 同余最短路&转圈背包算法学习笔记(超详细)
一.问题引入 当你想要解决一个完全背包计数问题,但是 \(M\) 的范围太大,那么你就可以使用同余最短路. 二.算法推导过程 首先对于一个完全背包计数问题,我们要知道如果 \(x\) 这个数能凑出来, ...
- JavaScript中的DOM和Timer(简单易用的基本操作)
JavaScript中的DOM和Timer基本操作 DOM操作 传统的选择器 选择器id var elements = document.getElementById(id的名称); 例如: var ...
- 【工具】FreePic2PDF+PdgCntEditor|PDF批量添加书签(Windows)
这俩软件都不大,比较便携. FreePic2PDF: 我下载的来源:https://www.52pojie.cn/thread-1317140-1-1.html(包含下载链接https://www.l ...
- 使用 C++ 20 协程降低异步网络编程复杂度
传统异步回调 vs C++20协程 协程是一种函数对象,可以设置锚点做暂停,然后再该锚点恢复继续运行.它是如何应用在网络异步编程方面的,请对比下面的两种代码风格: 基于回调的异步网络编程 先来看一个异 ...
- 【语义分割专栏】:FCN实战篇(附上完整可运行的代码pytorch)
目录 前言 FCN全流程代码 模型搭建(model) 数据处理(dataloader) 评价指标(metric) 训练流程(train) 模型测试(test) 效果图 结语 前言 FCN原理篇讲解:[ ...