【题解】Atcoder AGC#03 E-Sequential operations on Sequence
仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的。所以我们可以将操作序列变成单调递增的序列。
然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次数——我们还可以计算每一段完整的序列出现的次数。如果我们求出第 \(i\) 次操作过后产生的序列在答案中共出现了 \(rec[i]\) 次,那么第 \(i - 1\) 次操作过后产生的序列必然在答案中出现了 \(\frac{len[i]}{len[i - 1]} * rec[i]\) 次。可是这样还会剩下\(rec[i]\) 段 \(len[i] \ mod \ len[i - 1]\) 的小区间。我们可以考虑如何统计这一段小区间中出现了哪些完整的序列。
由于要统计在这段小区间中出现了哪些完整的序列,我们可以找到操作序列中第一个长度小于它的位置\(pos\)。那么此时这段小区间中会有 \(\frac{nowlen}{len[pos]}\) 段长度为 \(len[pos]\) 的完整区间。显然这是一个递归求解的问题,而一个数最多取模 log 次的性质保证我们最多会递归 log 次。如果最后剩下的区间比第一个小区间还要小,那么我们可以直接知道对于那些数字的出现做出了贡献,维护差分序列区间加一下就好了。
**启示:可以转化一下思路,不一定要计算每个数字的贡献,而可以从后往前递推出每段序列出现的次数,将一段序列看作一个整体。而一个数取模最多不会超过 log 次的限制也可以保证递归的次数。
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000000
#define int long long
int n, Q, m;
int rec[maxn], len[maxn], ans[maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Solve(int x, int t)
{
if(!x) return;
int pos = upper_bound(len + , len + + m, x) - len - ;
if(!pos) { ans[] += t; ans[x + ] -= t; }
else
{
rec[pos] += (x / len[pos]) * t;
Solve(x % len[pos], t);
}
} signed main()
{
n = read(), Q = read(); len[++ m] = n;
for(int i = ; i <= Q; i ++)
{
int x = read();
while(m && len[m] >= x) m --;
len[++ m] = x;
}
rec[m] = ;
for(int i = m; i > ; i --)
{
rec[i - ] += rec[i] * (len[i] / len[i - ]);
Solve(len[i] % len[i - ], rec[i]);
}
ans[] += rec[], ans[len[] + ] -= rec[];
for(int i = ; i <= n; i ++)
{
ans[i] += ans[i - ];
printf("%lld ", ans[i]);
}
return ;
}
【题解】Atcoder AGC#03 E-Sequential operations on Sequence的更多相关文章
- AtCoder Grand Contest 003 E - Sequential operations on Sequence
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_e 题目大意 一串数,初始为\(1\sim N\),现有\(Q\)个操作,每次操作会把数组长度 ...
- [题解] Atcoder AGC 005 F Many Easy Problems NTT,组合数学
题目 观察当k固定时答案是什么.先假设每个节点对答案的贡献都是\(\binom{n}{k}\),然后再减掉某个点没有贡献的选点方案数.对于一个节点i,它没有贡献的方案数显然就是所有k个节点都选在i连出 ...
- Agc003_E Sequential operations on Sequence
传送门 题目大意 $1,2...n,n$个数从小到大排列,有$m$此操作,每次操作给定一个参数$x$,将当且数列作为循环节无限地展开下去,再取前$x$个作为新的数列,求最终的数列每个数出现的次数. $ ...
- 【做题】agc003E - Sequential operations on Sequence——经典结论
题意:有一个序列,初始是从\(1\)到\(n\)的\(n\)个数.有\(q\)次操作,每次操作给出\(q_i\),把当前的序列重复无数遍,然后截取最前面的\(q_i\)个元素作为新序列.要求输出完成所 ...
- 【agc003E】Sequential operations on Sequence
Portal -->agc003E Description 给你一个数串\(S\),一开始的时候\(S=\{1,2,3,...,n\}\),现在要对其进行\(m\)次操作,每次操作给定一个\(a ...
- 【AGC003 E】Sequential operations on Sequence
Description 你有一个长度为 \(n\) 的序列,第 \(i\) 项为 \(i\). 有 \(m\) 次操作,每次操作给定一个 \(x\),你需要将序列无限循环后截取前 \(x\) 项,作为 ...
- agc003E Sequential operations on Sequence
题意: 有一个数字串S,初始长度为n,是1 2 3 4 …… n. 有m次操作,每次操作给你一个正整数a[i],你先把S无穷重复,然后把前a[i]截取出来成为新的S. 求m次操作后,每个数字在S中出现 ...
- AtCoder AGC #3 Virtual Participation
Havana真好听qwq AB题就不写了 SB C.BBuBBBlesort! 有一个长度为$n$的数列 你每次可以用两种操作 1.交换两个相邻元素 2.交换两个隔且仅隔了一个的元素 求把数列排成有序 ...
- 【题解】Atcoder AGC#16 E-Poor Turkeys
%拜!颜神怒A此题,像我这样的渣渣只能看看题解度日╭(╯^╰)╮在这里把两种做法都记录一下吧~ 题解做法:可以考虑单独的一只鸡 u 能否存活.首先我们将 u 加入到集合S.然后我们按照时间倒序往回推, ...
随机推荐
- ORB-SLAM(七)ORBextractor 特征提取
该类中主要调用OpenCV中的函数,提取图像中特征点(关键点及其描述,描述子,以及图像金字塔) 参考TUM1.yaml文件中的参数,每一帧图像共提取1000个特征点,分布在金字塔8层中,层间尺度比例1 ...
- 图片文件转换成Base64编码实现ajax提交图片
//上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...
- SpringBoot入门(二)——起步依赖
本文来自网易云社区 在前一篇我们通过简单几步操作就生成了一个可以直接运行的Web程序,这是因为SpringBoot代替我们做了许多工作,概括来讲可以分为起步依赖和自动配置.这一篇先来看看起步依赖. 项 ...
- python操作字符串内容并重新输出
今天在做一个函数的作业,题目如下: 编写一个函数实现大写转小写,小写变大写,并且转换为镜像字符串,并且将字符串变为镜像字符串. 例如:’A’变为’Z’,’b’变为’y 示范字符串: ”sdSdsfdA ...
- [转]JS私有化的实现——稳妥构造函数
所谓稳妥对象, 指的是没有公共属性, 而且其方法也不引用this的对象.稳妥对象函数遵循与寄生构造函数类似的模式, 但有两点不同: 一是新创建对象的实例方法不引用this: 二是不使用new操作符调用 ...
- 使用Iview Menu 导航菜单(非 template/render 模式)
1.首先直接参照官网Demo例子,将代码拷贝进项目中运行, 直接报错: Cannot read property 'mode' of undefined. 然后查看官网介绍,有一行注意文字,好吧. 2 ...
- Linux命令应用大词典-第13章 用户和组群管理
13.1 useradd:创建用户账户 13.2 adduser:创建用户账户 13.3 lnewusers:创建用户账户 13.4 usermod:修改用户账户 13.5 userdel:删除用户账 ...
- Win10系统XWware虚拟机安装Linux系统(Ubuntu)最新版教程
XWware虚拟机安装Linux系统(Ubuntu)教程 一.下载并安装VMware虚拟机 借助VMware Workstation Pro, 我们可以在同一台Windows或Linux PC上同时运 ...
- BehaviorDesigner学习
行为树: 行为树设计师插件是一个专门为unity设计的AI插件. 学习用!!!插件地址:链接:http://pan.baidu.com/s/1dF2okPN 密码:b43m 通过继承Behavior中 ...
- 《Effective C++》读书笔记 条款02 尽量以const,enum,inline替换#define
Effective C++在此条款中总结出两个结论 1.对于单纯常量,最好以const对象或enum替换#define 2.对于形似函数的宏,最好改用inline函数替换#define 接下来我们进行 ...