洛谷 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\)黑白方阵进行(如同国际象棋一般 ...
随机推荐
- Solr数据库导入
Solr数据库导入 1.在MySQL中创建一张表t_solr,并插入测试数据. 2.把E:\Solr\solr-4.10.4\example\example-DIH\solr\db\conf下的adm ...
- VS2017登陆不了,TFS无法连接成功的问题
由于使用的win7 64位操作系统,重装系统以后,安装了vs2017,登陆不成功,https://auth.gfx.ms/16.000.27887.2/OldConvergedLogin_PCore. ...
- Visual Studio 2019 Serial Keys
Visual Studio 2019 Enterprise BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 2019 Professional NYWVH-HT ...
- PAT甲题题解-1130. Infix Expression (25)-中序遍历
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- cordova打包webapp
cordova打包webapp 在项目开发中,需要将h5页面打包成app,这个时候我们可以使用cordova来打包.在官方文档中,我们可以了解到创建一个app十分简单,你的电脑上有nodejs就行,我 ...
- D. Mysterious Crime
链接 [http://codeforces.com/contest/1043/problem/D] 题意 给你一个m*n的矩阵(m<=10,n<=1e5), 每一行的数字是1到n里不同的数 ...
- Linux内核分析——Linux内核学习总结
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...
- 五子棋游戏SRS文档
SRS技术文档,包括对SRS的解释说明.SRS描述规范.软件需求规格说明书(SRS,Software Requirement Specification)是为了软件开发系统而编写的,主要用来描 ...
- Java提高篇(1)封装
三大特性之---封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能 ...
- JavaScript使用childNodes和children
childNodes用来获取一个元素的所有子元素,这个包括元素节点和文本节点. children用来获取一个元素的子元素节点,注意只是元素节点 其中DOM中常见的三种节点分别如下: 元素节点:< ...