【题解】Atcoder AGC#03 E-Sequential operations on Sequence
2024-09-24 21:05:41
仙题膜拜系列...首先我们可以发现:如果在截取了一段大的区间之后再截取一段小的区间,显然是没有什么用的。所以我们可以将操作序列变成单调递增的序列。
然后怎么考虑呢?启示:不一定要考虑每一个数字出现的次数——我们还可以计算每一段完整的序列出现的次数。如果我们求出第 \(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 ;
}
最新文章
- 登录式与非登录式&;交互式与非交互式shell及其环境初始化过程
- http 网络请求
- Oracle 10g RAC中的DRM问题及关闭
- Modoer列表页性能分析及优化
- WinForm条码打印
- HTML 5 学习之应用程序缓存
- uva 10891 Game of Sum(区间dp)
- 玩转python之字符串逐个字符或逐词反转
- 转:Loadrunner打开https报错“Internet…
- Spring中@Transactional用法
- chrome总是提示“请停用开发者模式运行的扩展程序”
- eclipse+pyDev
- (逆序对 分治法)P1908 逆序对 洛谷
- BigDecimal - Java精确运算
- 求含有n个因子的最小正整数(n<;=1000000)
- OpenNMS编译,打包并在Windows下启动
- Your Customers Do Not Mean What They Say
- Nodejs统计每秒记录日志数
- HDU 1024 Max Sum Plus Plus(dp)
- PHP 基础函数(三)数组和变量之间的转换
热门文章
- 用PowerDesign反向生成数据库Sql语句问题
- jenkins通过maven指定testng的xml文件,并给testng代码传参
- JavaWeb(三)——Tomcat服务器(二)
- java 二叉树的创建 遍历
- sql注入记录------类型转换错误---convert()函数,一句话图片马制作
- 用命令从mysql中导出/导入表结构及数据
- Linux中常用的关机和重新启动命令
- RabbitMQ基本模式
- TensorFlow高级API(tf.contrib.learn)及可视化工具TensorBoard的使用
- 算法与数据结构3.1 stack