题意:有一个序列,初始是从\(1\)到\(n\)的\(n\)个数。有\(q\)次操作,每次操作给出\(q_i\),把当前的序列重复无数遍,然后截取最前面的\(q_i\)个元素作为新序列。要求输出完成所有\(q\)次操作后,每个\(1\)到\(n\)的数各出现了多少次。

\(n,q \leq 10^5, \, q_i \leq 10^{18}\)

首先一个要点在于操作后序列的长度可以达到\(10^{18}\)。因此,要从每次操作间寻找思路。

首先,我们发现如果一次操作之后又\(q_i\)比它小的操作,那么它就是没有意义的。所以,我们可以让\(q_i\)单调递增。然后,考虑每一次操作后的结果,它就是前一次操作后的结果重复若干遍,再加上前一次操作的一个前缀。前面一部分可以通过计算前一次操作后的结果时乘上一个系数来处理。那么,问题就变成如何后面的不完整部分了。

更确切地说,我们的答案还要加上一次操作后结果的一个前缀,其长度是\(q_i \bmod p_{i-1}\)。这里敏感的人或许已经发现了,我们又一个经典的结论,就是一个数对一个不大于它的数取模后,至少减小一倍。证明显然。那么,我们每次二分小一个不大于它的\(q_i\),最多做\(O(\log n)\)次后就能把这个长度缩小到\(n\)以内。到最后,就是答案序列的一个前缀加了。这里的复杂度是\(O(\log^2 n)\)。

因此,我们就能在\(O(n \log^2 n)\)时间内解决本题。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100010;
int q,n,len[N],val[N],ans[N],m;
void doit(int x,int v) {
if (!x) return;
int t = upper_bound(len+1,len+m+1,x) - len - 1;
if (t == 0) ans[1] += v, ans[x+1] -= v;
else {
val[t] += (x / len[t]) * v;
doit(x % len[t],v);
}
}
signed main() {
int x;
scanf("%lld%lld",&n,&q);
len[++m] = n;
for (int i = 1 ; i <= q ; ++ i) {
scanf("%lld",&x);
while (m && len[m] >= x) -- m;
len[++m] = x;
}
val[m] = 1;
for (int i = m ; i >= 2 ; -- i) {
val[i-1] += val[i] * (len[i] / len[i-1]);
doit(len[i] % len[i-1],val[i]);
}
ans[1] += val[1];
ans[len[1]+1] -= val[1];
for (int i = 2 ; i <= n ; ++ i)
ans[i] += ans[i-1];
for (int i = 1 ; i <= n ; ++ i)
printf("%lld\n",ans[i]);
return 0;
}

小结:还是不够熟练。以及,想题时用笔整理思路,或许是个好习惯。

【做题】agc003E - Sequential operations on Sequence——经典结论的更多相关文章

  1. agc003E Sequential operations on Sequence

    题意: 有一个数字串S,初始长度为n,是1 2 3 4 …… n. 有m次操作,每次操作给你一个正整数a[i],你先把S无穷重复,然后把前a[i]截取出来成为新的S. 求m次操作后,每个数字在S中出现 ...

  2. 【agc003E】Sequential operations on Sequence

    Portal -->agc003E Description 给你一个数串\(S\),一开始的时候\(S=\{1,2,3,...,n\}\),现在要对其进行\(m\)次操作,每次操作给定一个\(a ...

  3. Agc003_E Sequential operations on Sequence

    传送门 题目大意 $1,2...n,n$个数从小到大排列,有$m$此操作,每次操作给定一个参数$x$,将当且数列作为循环节无限地展开下去,再取前$x$个作为新的数列,求最终的数列每个数出现的次数. $ ...

  4. 【AGC003 E】Sequential operations on Sequence

    Description 你有一个长度为 \(n\) 的序列,第 \(i\) 项为 \(i\). 有 \(m\) 次操作,每次操作给定一个 \(x\),你需要将序列无限循环后截取前 \(x\) 项,作为 ...

  5. AtCoder Grand Contest 003 E - Sequential operations on Sequence

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_e 题目大意 一串数,初始为\(1\sim N\),现有\(Q\)个操作,每次操作会把数组长度 ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. (转)poj算法做题顺序

    初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj329 ...

  8. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  9. AtCoder Grand Contest 1~10 做题小记

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-Grand-Contest-from-1-to-10.html 考虑到博客内容较多,编辑不方便的情 ...

随机推荐

  1. object base基类分析

    uvm_object,是所有uvm data和hierarchical class的基类,实现了copy,compare,print,record之类的函数 扩展类中必须实现create和get_ty ...

  2. Day8 面向对象

    一.面向对象和面向过程 各位,我们现在如果要将大象放冰箱,用面向过程怎么实现呢? 1.把大象放到冰箱里 第一步:把冰箱门打开 第二步:把大象放进去 第三步:把门关上 def open_fridge_d ...

  3. Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04(转)

    http://www.powerxing.com/install-hadoop/ http://blog.csdn.net/beginner_lee/article/details/6429146 h ...

  4. jQuery工具--$.each()和$.merge()

       jQuery.each(object, [callback])或者jQuery(object).each([callback]) 概述 通用遍历方法,可用于遍历对象和数组. 不同于遍历 jQue ...

  5. rest-framework 序列化格式Restful API设计规范

    理解RESTful架构 Restful API设计指南 理解RESTful架构 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式 ...

  6. 在lua中从一个字符串中移除空间源码

    /* trim.c - based on http://lua-users.org/lists/lua-l/2009-12/msg00951.html from Sean Conner */ #inc ...

  7. 字符编码几个缩写 ACR CCS CEF CES TES

    摘自https://zhuanlan.zhihu.com/p/27012967 5. 在Unicode Technical Report (UTR统一码技术报告) #17<UNICODE CHA ...

  8. ExtJS5入门

    https://www.cnblogs.com/xiaoliu66007/p/7988060.html

  9. 第一周java测验感想

     在正式开学的第一周,建民老师就给我们来了一个下马威.我本身的编程基础比较差,不知道怎么去想,怎么去一步步的去完成这么一个工程.所以我在星期四的下午十分的痛苦…因为不知道怎么搞嘛.尽管在暑假的时候看了 ...

  10. Python+OpenCV图像处理(六)—— ROI与泛洪填充

    一.ROI ROI(region of interest),感兴趣区域.机器视觉.图像处理中,从被处理的图像以方框.圆.椭圆.不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI. 代码如下 ...