A Simple Problem with Integers 上海大都会赛

2024-02-22 18:48

本文主要是介绍A Simple Problem with Integers 上海大都会赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.nowcoder.com/acm/contest/163/H

两种操作 区间平方取模和区间求和 模数是2018 很蹊跷 感觉运算几次之后会变为0或1 就打了个表 发现了循环节长度大部分是6 少数是2和3 只有2017自己是1 为统一取个lcm=6即可 但是每个数不一定要运算几次才能进入循环节 有345不等 直接取个10

当一个区间内所有数都进入循环节后 则可以对这个区间直接更新或查询 否则继续向下二分 最后会落到叶节点身上 开个变量记录一下这个数被操作了几次 到十次就记为进入循环节

还有就是pushup和pushdown的设计比较麻烦 还需要考虑合并循环节和循环节的后移

感觉线段树的题目一般就是两类 一是抽象建模 这种题一般不好想 但是只要思路理清了 那几个函数都不用怎么改 二是这种刚正面的题 各种操作将你安排的明明白白..一般会有一些神奇的规律来剪枝之类

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;struct node
{int l;int r;int sum;int cnt;int laz;int flag;int val[6];int ptr;
};node tree[200010];
int pre[3000][20];
int ary[50010];
int n,q;void init()
{int i,j,val;for(i=0;i<2018;i++){val=i;for(j=0;j<16;j++){pre[i][j]=val;val=(val*val)%2018;}}
}void pushup(int cur)
{int i;tree[cur].sum=tree[2*cur].sum+tree[2*cur+1].sum;if(tree[2*cur].flag&&tree[2*cur+1].flag){tree[cur].ptr=0;for(i=0;i<6;i++){tree[cur].val[i]=tree[2*cur].val[(tree[2*cur].ptr+i)%6]+tree[2*cur+1].val[(tree[2*cur+1].ptr+i)%6];}tree[cur].flag=1;}
}void pushdown(int cur)
{int gou;if(tree[cur].laz!=0){gou=tree[cur].laz;tree[2*cur].ptr=(tree[2*cur].ptr+gou)%6;tree[2*cur].laz+=gou;tree[2*cur].sum=tree[2*cur].val[tree[2*cur].ptr];tree[2*cur+1].ptr=(tree[2*cur+1].ptr+gou)%6;tree[2*cur+1].laz+=gou;tree[2*cur+1].sum=tree[2*cur+1].val[tree[2*cur+1].ptr];tree[cur].laz=0;}
}void build(int l,int r,int cur)
{int m,i;tree[cur].l=l;tree[cur].r=r;tree[cur].sum=0;tree[cur].cnt=0;tree[cur].laz=0;tree[cur].flag=0;for(i=0;i<6;i++){tree[cur].val[i]=0;}tree[cur].ptr=0;if(l==r){tree[cur].sum=ary[l];for(i=0;i<6;i++){tree[cur].val[i]=pre[ary[l]][10+i];}return;}m=(l+r)/2;build(l,m,2*cur);build(m+1,r,2*cur+1);pushup(cur);
}void update(int pl,int pr,int cur)
{if(pl<=tree[cur].l&&tree[cur].r<=pr){if(tree[cur].flag){tree[cur].ptr=(tree[cur].ptr+1)%6;tree[cur].laz=(tree[cur].laz+1)%6;tree[cur].sum=tree[cur].val[tree[cur].ptr];return;}}if(tree[cur].l==tree[cur].r)//flag必为0{tree[cur].sum=(tree[cur].sum*tree[cur].sum)%2018;tree[cur].cnt++;if(tree[cur].cnt==10) tree[cur].flag=1;return;}pushdown(cur);if(pl<=tree[2*cur].r) update(pl,pr,2*cur);if(pr>=tree[2*cur+1].l) update(pl,pr,2*cur+1);pushup(cur);
}int query(int pl,int pr,int cur)
{int res;if(pl<=tree[cur].l&&tree[cur].r<=pr){return tree[cur].sum;}pushdown(cur);res=0;if(pl<=tree[2*cur].r) res+=query(pl,pr,2*cur);if(pr>=tree[2*cur+1].l) res+=query(pl,pr,2*cur+1);return res;
}int main()
{int t,cas,i,l,r;char op[10];init();scanf("%d",&t);for(cas=1;cas<=t;cas++){scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&ary[i]);}build(1,n,1);printf("Case #%d:\n",cas);scanf("%d",&q);while(q--){scanf("%s%d%d",op,&l,&r);if(op[0]=='C'){update(l,r,1);}else{printf("%d\n",query(l,r,1));}}}return 0;
}

 

这篇关于A Simple Problem with Integers 上海大都会赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736169

相关文章

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

uva 10025 The ? 1 ? 2 ? ... ? n = k problem(数学)

题意是    ?  1  ?  2  ?  ...  ?  n = k 式子中给k,? 处可以填 + 也可以填 - ,问最小满足条件的n。 e.g k = 12  - 1 + 2 + 3 + 4 + 5 + 6 - 7 = 12 with n = 7。 先给证明,令 S(n) = 1 + 2 + 3 + 4 + 5 + .... + n 暴搜n,搜出当 S(n) >=

11991 - Easy Problem from Rujia Liu?

题意: 输入一串整型数列,再输入两个数k,v,输出第k个v的序号。不存在则输出0,如第一个样例 8 41 3 2 2 4 3 2 11 3 //第1个3,序号为2,输出22 4 //第2个4,不存在,输出03 2 //第3个2,序号为7,输出74 2 思路: struct num {

HDU 1016 Prime Ring Problem (深搜)

OJ题目 : click here ~~ 大概题意:n个数,形成一个环,使得相邻两个数的和为素数。以1开始,按字典序输出序列。 很简单的深搜。 AC_CODE int n;int visit[22];int num[22];int len;bool Is_prime(int x){for(int i = 2;i*i <= x;i++)if(x%i == 0) return

使用django-simple-captcha遇到的坑

使用django-simple-captcha遇到的坑 一站点gongshare.com在做注册功能时验证码采用的django-simple-captcha,因为笔者开发环境采用的Windows 64bit系统,结果安装使用的时候接二连三遇到好几个坑。 django-simple-captcha需要依赖django1.3+、PIL1.1.7+或者Pillow2.0+,根据文档安装后开始使用时,

观趋势 谋发展 2024 SSHT上海智能家居展有哪些创新呈现?

引言:大数跨境发布的《2024全球智能家居市场洞察报告》显示,智能家居市场正迎来快速增长,预计从2024年的1215.9亿美元增长至2032年的6332.0亿美元,复合年增长率为22.9%。 近年来,随着物联网、AI等底层技术的飞速进步,智能家居行业仿佛被按下了“加速键”,迎来了前所未有的蓬勃发展,吸引了无数企业的涌入,新品如雨后春笋般不断涌现,用户群体也以前所未有的速度增长。然而,随着市场的逐

2024年上海松江启动建筑绿色低碳发展专项检查,共绘城市节能新篇章

2024年9月4日,2024年度松江区建筑工程绿色低碳发展工作专项检查会议正式开展,会议内容主要围绕以下三点, 1、《关于开展 2024年度本市建筑领域绿色低碳发展工作监督检查的通知》宣贯。 2、分项计量、能效测评工作验收要求介绍。 3、专项检查工作安排。 我国在早期没有高度重视建筑物的环保节能,造成了过去30年内竣工的建筑绝大多数是高能耗工程建筑,这类工程建筑在未来几十年里将耗费许多能源

LVM 'Can’t open /dev/sdb1 exclusively. Mounted filesystem?' Problem

在将几块盘做LVM时,遇到一个之前都没遇到过的问题: root@ubuntu:~# pvcreate /dev/sdc1Can't open /dev/sdc1 exclusively. Mounted filesystem? 首先第一反应就是查看这个分区是否已经在使用了,但是没有。 查看硬盘的一些信息: root@ubuntu:~# cat /proc/partitionsmajo

HYPERCASUAL - Simple Characters(卡通游戏火柴人物模型)

介绍HyperCasual - 简单角色! 一套低多边形角色资源,用于创建超休闲风格的游戏。 包含演示场景 角色(x10) 生化人、小丑、Flaty_Boss、女孩、守门员、英雄、亚马逊女战士、男人、红衣男人、修理工 每个网格大约有700-2000个顶点 角色设置与Mecanim兼容(本包中不包含动画) 着色器适用于可编写脚本的渲染管线(HD + LW) 下载:​​Unity资源商店链接资源