洛谷 P3962 [TJOI2013]数字根 解题报告
P3962 [TJOI2013]数字根
题意
数字根:这个数字每一位的数字加起来求和,反复这个过程直到和小于10。
给出序列\(a\),询问区间\([l,r]\)连续的子区间里最大前5个不同的数字根,不够5个-1补全。
一个区间的数字根指区间和的数字根。
\(a_i\le 10^9,n\le 10^5\)
开始写了个线段树发现是个假做法给我气死了...
数字根结论:对自然数\(x\),若\(x=0\),数字根为\(0\),否则为\((x-1)\bmod 9+1\)
做法:预处理每个位置右边最早可以出现根\(1,2,\dots 9\)的位置(\(0\)特判),扔到st表里面,然后询问直接查一下区间最小值是否不比右端点大就可以了。
Code:
#include <cstdio>
#include <algorithm>
#include <cctype>
using std::min;
const int N=1e5+10;
int read()
{
int x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return x;
}
int n,q,a[N],dew[N],f[N],yuy[N][10],Log[N];
struct yuu
{
int st[N][20];
void init()
{
for(int j=1;j<=18;j++)
for(int i=1;i<=n-(1<<j)+1;i++)
st[i][j]=min(st[i][j-1],st[i+(1<<j-1)][j-1]);
}
int query(int l,int r)
{
int d=Log[r+1-l];
return min(st[l][d],st[r-(1<<d)+1][d]);
}
}bee[10];
int main()
{
n=read();
for(int i=1;i<=n;i++)
{
a[i]=read();
dew[i]=dew[i-1]+(a[i]==0);
f[i]=(f[i-1]+a[i])%9;
}
for(int i=0;i<9;i++) yuy[n+1][i]=n+1;
for(int i=n;i;i--)
{
for(int j=0;j<9;j++) yuy[i][j]=yuy[i+1][j];
if(a[i]) yuy[i][f[i]]=i;
}
for(int i=1;i<=n;i++)
for(int j=0;j<9;j++)
bee[j].st[i][0]=yuy[i][(f[i-1]+j)%9];
for(int i=2;i<=n;i++) Log[i]=Log[i>>1]+1;
for(int i=0;i<9;i++) bee[i].init();
q=read();
for(int l,r,i=1;i<=q;i++)
{
l=read(),r=read();
int ct=5;
for(int j=9;j&&ct;j--)
if(bee[j==9?0:j].query(l,r)<=r)
printf("%d ",j),--ct;
if(ct&&dew[r]-dew[l-1]) printf("0 "),--ct;
while(ct--) printf("-1 ");
puts("");
}
return 0;
}
2019.2.12
洛谷 P3962 [TJOI2013]数字根 解题报告的更多相关文章
- 洛谷3962 [TJOI2013]数字根
题目描述 一个数字的数字根定义为:这个数字每一位的数字加起来求和,反复这个过程直到和小于10.例如,64357的数字跟为7,因为6+4+3+5+7=25,2+5=7个区间的数字根定义为这个区间所有数字 ...
- 洛谷 P3965 [TJOI2013]循环格 解题报告
P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
- 洛谷1303 A*B Problem 解题报告
洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- Luogu P3962 [TJOI2013]数字根 st
题面 我先对数字根打了个表,然后得到了一个结论:\(a\)的数字根=\((a-1)mod 9+1\) 我在询问大佬后,大佬给出了一个简单的证明: \(\because 10^n\equiv 1(mod ...
- 洛谷 P1129 [ZJOI2007]矩阵游戏 解题报告
P1129 [ZJOI2007]矩阵游戏 题目描述 小\(Q\)是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏――矩阵游戏.矩阵游戏在一个\(N*N\)黑白方阵进行(如同国际象棋一般 ...
随机推荐
- [转]zookeeper集群 initLimit和syncLimit
initLimit和syncLimit是针对集群的参数 1.tickTime:CS通信心跳数 Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就 ...
- virtual box问题记录
1.已存在的虚拟机打开错误,可能是版本不一样的问题,我5.2.16版本,原虚拟机所属版本为4.3.12,换回4.3.12版本virtual box即可.
- java基础(个人学习笔记) A
1. 声明long类型的变量 需要在数值的末尾+l/L.(不加L的话,貌似默认就是int型了.当给long赋值一个超过int范围的值的时候,会出问题.) 2. package java_ ...
- WPF制作带明细的环形图表
效果 明细用Popup实现的,录gif时,Popup显示不出来,不知道为什么,所以静态图凑合看吧 大体思路 图表使用Arc+Popup实现 图表分为两部分,一是环形部分,一是标注的明细部分. 环形部分 ...
- LeetCode Pow(x, n) (快速幂)
题意 Implement pow(x, n). 求X的N次方. 解法 用正常的办法来做是会超时的,因为可能有21亿次方的情况,所以需要优化一下.这里用到了快速幂算法,简单来说就是将指数分解成二进制的形 ...
- Mongo 开发笔记
时间 程序的时间是本地时间 ,数据库中的时间是 ISO 标准时间 . ISO时间 + 8 小时 = 本地时间(北京时间 ) Java驱动会自动做转化. 语法 数组查询 数据查询使用 elemMatch ...
- Git常用命令梳理
在日常的Git版本库管理工作中用到了很多操作命令,以下做一梳理: 查看分支列表,带有*的分支表示是当前所在分支 [root@115~~]#git branch 查看分支详细情况 (推荐这种方式) [r ...
- Python常见字符编码间的转换
主要内容: 1.Unicode 和 UTF-8的爱恨纠葛 2.字符在硬盘上的存储 3.编码的转换 4.验证编码是否转换正确 5.Python bytes类型 前 ...
- Natural Language Generation/Abstractive Summarization
调研目的: 了解生成式文本摘要的常用技术和当前的发展趋势,明确当前项目有什么样的摘要需求,判断现有技术能否用于满足当前的需求,进一步明确毕业设计方向及其可行性 调研方向: 项目中需要用到摘要的地方以及 ...
- 程序设计第三次作业---C++计算器雏形
Github链接:https://github.com/Wasdns/object-oriented 题目:程序设计第三次作业 程序设计第三次作业附加 我的程序设计第三次作业附加 代码规范 更新时间: ...