CF1398F

CF1398F

Solution

我又来贡献暴力做法了。。。听说两只log不可能过1e6?

有一个显然的想法是:

我们先预处理一个aia_iai表示第iii个位置的最长后缀长度,满足该后缀中不同时存在0和1。

假设我们要求x=ix=ix=i的答案,那么一个位置jjj可以作为一轮的结束点当且仅当aj≥ia_j\geq iaji,而一个结束位置序列p1<p2<...<pkp_1<p_2<...<p_kp1<p2<...<pk合法当且仅当每一个pjp_jpj都是合法结束点并且相邻两个元素的差至少为iii(保证不重合)。

因此我们会贪心地从第一个满足aj≥ia_j\geq iajijjj开始,每次找一个最小的j′j'j,满足j′≥j+ij'\geq j+ijj+iaj′≥ia_{j'}\geq iaji,然后从jjj跳到j′j'j,最终的答案就是跳的步数。

这显然可以直接对aia_iai建区间线段树,维护区间内的maxmaxmax,线段树上二分求出j′j'j

这个方法的时间复杂度为O(∑ansilog⁡n)O(\sum ans_i\;\log n)O(ansilogn),而ansi≤⌊ni⌋ans_i\leq \lfloor\frac{n}{i}\rflooransiin,因此总时间复杂度O(nln⁡nlog⁡n)O(n\ln n\log n)O(nlnnlogn),注意常数即可。

(PS:别用偷懒用set维护,常数起飞,实测接近线段树的三倍)。

Code

char st[MAXN];
int mx[MAXN << 2], a[MAXN];
void build(int x, int l, int r) {if (l == r) { mx[x] = a[l]; return; }int mid = (l + r) >> 1;build(x << 1, l, mid);build(x << 1 | 1, mid + 1, r);mx[x] = max(mx[x << 1], mx[x << 1 | 1]);
}
int query(int x, int l, int r, int L, int y) {if (mx[x] < y) return -1;if (l == r) return l;int mid = (l + r) >> 1;if (L > mid) return query(x << 1 | 1, mid + 1, r, L, y);else {int t = query(x << 1, l, mid, L, y);if (t != -1) return t;return query(x << 1 | 1, mid + 1, r, mid + 1, y);}
}
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifint n, cnt0 = 0, cnt1 = 0;read(n), reads(st);for (int i = 1, l = 1; i <= n ; ++ i) {auto add = [&](char x, int y) {if (x == '0') cnt0 += y; if (x == '1') cnt1 += y;};add(st[i], 1);while (cnt0 && cnt1) add(st[l ++], -1);a[i] = i - l + 1;}build(1, 1, n);for (int i = 1; i <= n ; ++ i) {int cnt = 0, r = 1;for (; r <= n ;) {r = query(1, 1, n, r, i);if (r == -1) break;r += i;++ cnt;}print(cnt), putc(' ');}return 0;
}

Update 4.5 23:30

上面的代码跑了1890ms1890ms1890ms,我们觉得它不够优秀,于是冷静分析一下它慢在哪里,发现全1的数据就可以把它卡满,这是为什么呢?这是因为我们在长长的没有0的段里面做了很多次query,这其实是不必要的,我们同样可以预处理以每个位置开始的最长段。这样就可以O(1)O(1)O(1)计算整个段的贡献。

我们提交后发现它只跑了249ms249ms249ms

理性分析一下它的时间复杂度,相当于整个序列被01分割为若干段,跳到一个段就可以O(1)O(1)O(1)计算答案并且O(log⁡n)O(\log n)O(logn)跳到下一个段,这样每一段会有O(len)O(len)O(len)次贡献(因为每一个长度大于iii的段才可能产生贡献),每次贡献为O(log⁡n)O(\log n)O(logn),因此总时间复杂度为O(nlog⁡n)O(n\log n)O(nlogn)

Updated code

//线段树部分同上
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in", "r", stdin);
#endifint n, cnt0 = 0, cnt1 = 0;read(n), reads(st);for (int i = 1, l = 1; i <= n ; ++ i) {auto add = [&](char x, int y) {if (x == '0') cnt0 += y; if (x == '1') cnt1 += y;};add(st[i], 1);while (cnt0 && cnt1) add(st[l ++], -1);a[i] = i - l + 1;}cnt0 = 0, cnt1 = 0;for (int i = n, r = n; i >= 1 ; -- i) {auto add = [&](char x, int y) {if (x == '0') cnt0 += y; if (x == '1') cnt1 += y;};add(st[i], 1);while (cnt0 && cnt1) add(st[r --], -1);b[i] = r - i;}build(1, 1, n);for (int i = 1; i <= n ; ++ i) {int cnt = 0, r = 1;for (; r <= n ;) {r = query(1, 1, n, r, i);if (r == -1) break;int p = b[r] / i;cnt += p + 1, r += i * (p + 1);}print(cnt), putc(' ');}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【翻译】无需安装Python,就可以在.NET里调用Python库

原文地址&#xff1a;https://henon.wordpress.com/2019/06/05/using-python-libraries-in-net-without-a-python-installation/pythonnet这个屌爆的项目的出现&#xff0c;使得我们可以用一种新的方式&#xff0c;让C#可以和Python之间进行互操作。但是它的设置和部署可能有点…

Codeforces Round #706 (Div. 2) E. Garden of the Sun 思维构造

传送门 题意&#xff1a; 给你一个nmnmnm的矩阵&#xff0c;其中包含字符′.′.′.′和′X′X′X′&#xff0c;你可以将任何′.′.′.′改成′X′X′X′&#xff0c;现在问你能否通过修改一些′.′.′.′来使′X′X′X′联通且不存在环。保证原本的′X′X′X′没有任何两个相…

CF1067E Random Forest Rank(树形dp,概率与期望,线性代数)

CF1067E Random Forest Rank Solution 考虑树的邻接矩阵的秩的意义&#xff0c;不难发现相当于每个点找一个“代表”&#xff0c;对于一个点xxx&#xff0c;它的“代表”为一个与xxx相邻的结点&#xff0c;要求保证所有点的“代表”不重复&#xff0c;求能找到“代表”的点的…

Ocelot(六)- 架构图

简介Ocelot是一个用.NET Core实现并且开源的API网关&#xff0c;它功能强大&#xff0c;包括了&#xff1a;路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、k8s 集成。这些功能只都只需要简单的配置即可完成。架构图Ocelot的目标是使用…

P5170 【模板】类欧几里得算法(类欧)

P5170 【模板】类欧几里得算法 Description 要求在O(lgn)O(lgn)O(lgn)的时间内求出&#xff1a; ∑i0n⌊aibc⌋\sum_{i 0}^n{\lfloor\frac{aib}{c}\rfloor}∑i0n​⌊caib​⌋ ∑i0ni⌊aibc⌋\sum_{i 0}^n{i\lfloor\frac{aib}{c}\rfloor }∑i0n​i⌊caib​⌋ ∑i0n⌊aibc⌋2…

AtCoder Beginner Contest 192 F - Potion 背包dp

传送门 题意&#xff1a; 给你nnn个数&#xff0c;让后让你选出来kkk个AAA&#xff0c;把他们求和&#xff0c;之后再递增kkk直到正好达到xxx&#xff0c;求最小的递增次数。 思路&#xff1a; 转化一下题意就是求∑Ax(modlen)\sum Ax(\bmod\ \ len)∑Ax(mod len)&#xff0…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法开源地址 https://github.com/liningit/LnskyDB在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如…

P4887 【模板】莫队二次离线(第十四分块(前体))

P4887 【模板】莫队二次离线&#xff08;第十四分块(前体)&#xff09; Solution 简单学习了一下二次离线莫队&#xff0c;写了个板子题。 这题直接莫队时间复杂度为O(Cnn)O(Cn\sqrt n)O(Cnn​)&#xff0c;其中C(14k)C\binom{14}{k}C(k14​)&#xff0c;显然不太行。 我们…

P1297 [国家集训队]单选错位 期望

传送门 题意&#xff1a; 思路&#xff1a; 手推了一下没想到还真的能过。 对于相邻的两个数aia_iai​和ai1a_{i1}ai1​&#xff0c;分两种情况讨论&#xff1a; (1) ai<ai1a_i<a_{i1}ai​<ai1​ 时&#xff0c;答案在[1,ai][1,a_i][1,ai​]的范围内概率为aiai1\fra…

也读《人月神话》:没有银弹的软件工程

一、关于人月神话这本书记得在上大学的时候&#xff0c;就经常听学长和老师讲起《人月神话》&#xff0c;但是却一直没有阅读。记得当时一听到这个书名&#xff0c;还以为是个神马科幻类别的书&#xff0c;结果是个软件工程方面的书籍。这本书是“图灵奖得主、“IBM360系统之父…

CF1088F. Ehab and a weird weight formula(倍增)

CF1088F. Ehab and a weird weight formula Solution 这题大概是个大力找性质题&#xff08;莫名感觉学习文化课有利于找性质&#xff1f;&#xff01;&#xff1f;&#xff09;。 性质1&#xff1a;不难发现一个点比它权值小的有且仅有一个&#xff08;最小权点除外&#x…

P6154 游走 概率dp

传送门 题意&#xff1a; 思路&#xff1a; 给你个DAGDAGDAG&#xff0c;由于每一条路径出现概率相等&#xff0c;那么期望就是总长度路径个数\frac{总长度}{路径个数}路径个数总长度​。设f[i]f[i]f[i]表示到iii这个点的总长度&#xff0c;g[i]g[i]g[i]表示到iii这个点路径的…

[译]如何在C#中调试LINQ查询

LINQ是我在C#中最喜欢的功能之一。它让代码看起来更漂亮美观。我们得到了一个易于编写和理解的简洁函数式语法。好吧&#xff0c;至少我们可以使用LINQ方法的语法风格。LINQ很难进行调试。我们无法知道该查询内部发生了什么。我们可以看到输入和输出&#xff0c;但这就是它的全…

CF1303F - Number of Components(并查集)

CF1303F - Number of Components Solution 思路还是有点妙的。 容易想到并查集&#xff0c;但是并查集不容易维护删边&#xff0c;怎么办呢&#xff1f; 我们考虑拆贡献&#xff0c;把加边的贡献和删边的贡献拆开&#xff0c;分别维护。 只加边就是四连通加边&#xff0c;算…

CodeForces - 375D Tree and Queries 树启 + 思维

传送门 题意&#xff1a; 思路&#xff1a; 很明显子树问题会想到树启&#xff0c;让后如何updateupdateupdate呢&#xff1f;一个显然的思路就是维护一个树状数组&#xff0c;查询次数>kj>k_j>kj​的个数。但是这样复杂度是O(nlog2n)O(nlog^2n)O(nlog2n)的&#xf…

WebSocket数据加密——AES与RSA混合加密

前言之前在写“一套简单的web即时通讯”&#xff0c;写到第三版的时候没什么思路&#xff0c;正好微信公众号看到一篇讲API交互加密&#xff0c;于是就自己搞了一套AES与RSA混合加密&#xff0c;无意中产生应用在WebSocket想法&#xff0c;好在思路都差不多&#xff0c;稍微改动…

CF1365G Secure Password(构造,交互,二进制分组)

CF1365G Secure Password Solution 妙妙思维题。 注意到(136)>n\binom{13}{6}>n(613​)>n。&#xff08;谁tm能注意到这个&#xff1f;&#xff01;&#xff1f;&#xff09; 我们可以把所有13位二进制数中有6个1的拿出来给nnn个数重标号。然后对于每一位iii&…

基于 EntityFramework 生成 Repository 模式代码

借助 WeihanLi.EntityFramework 实现简单的 RepositoryIntro很多时候一些简单的业务都是简单的增删改查&#xff0c;动态生成一些代码完成基本的增删改查&#xff0c;而这些增删改查代码大多类似&#xff0c;只有一些有复杂业务逻辑的可能需要手动去写。于是实现了一个基于 EF …

Codeforces Round #601 (Div. 2)

传送门 文章目录A.Changing Volume题意&#xff1a;思路&#xff1a;B. Fridge Lockers题意&#xff1a;思路&#xff1a;C. League of Leesins题意&#xff1a;思路&#xff1a;D. Feeding Chicken题意&#xff1a;思路&#xff1a;E1 E2. Send Boxes to AliceA.Changing Volu…

CF1375G. Tree Modification(贪心,黑白染色)

CF1375G. Tree Modification Solution 假设我们取定了根&#xff0c;那么只可能从深度大的点接到深度小的点&#xff0c;我们每次取一个高度为2的子树接到该子树的父亲&#xff0c;这样取一定不劣&#xff0c;操作次数相当于是偶数深度点&#xff08;根深度为0&#xff09;的…