2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)
传送门
线段树妙题。
显然平方几次就会循环(打表证明不解释)。
然后所有环长度的lcmlcmlcm不大于70.
因此维护一下当前区间中的节点是否全部在环上。
不是直接暴力到叶子节点修改。
否则整体打标记。
简单合并一下就行了。(细节见代码)
代码:
#include<bits/stdc++.h>
#define N 100005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,m,mod,a[N],tot=0,tim[N],cnt=0,nxt[10005];
bool inloop[10005],vis[10005];
struct Node{int l,r,sum,cir[70],pos,tag,len;bool in;}T[N<<2];
inline void solve(int p,int val){
if(!(T[p].in=inloop[T[p].sum=val]))return;
T[p].len=1,T[p].cir[T[p].pos=0]=val;
for(int i=nxt[val];i!=val;i=nxt[i])T[p].cir[T[p].len++]=i;
}
inline int lcm(int a,int b){return a/__gcd(a,b)*b;}
inline void pushup(int p){
T[p].sum=T[lc].sum+T[rc].sum;
T[p].in=T[lc].in&T[rc].in;
if(!T[p].in)return;
T[p].len=lcm(T[lc].len,T[rc].len);
int tl=T[lc].pos,tr=T[rc].pos;
for(int i=0;i<T[p].len;++i){
T[p].cir[i]=T[lc].cir[tl++]+T[rc].cir[tr++];
if(tl==T[lc].len)tl=0;
if(tr==T[rc].len)tr=0;
}
T[p].pos=0;
}
inline void pushnow(int p,int v){
T[p].tag+=v,T[p].pos+=v;
if(T[p].pos>=T[p].len)T[p].pos%=T[p].len;
T[p].sum=T[p].cir[T[p].pos];
}
inline void pushdown(int p){if(T[p].tag)pushnow(lc,T[p].tag),pushnow(rc,T[p].tag),T[p].tag=0;}
inline void build(int p,int l,int r){
T[p].l=l,T[p].r=r;
if(l==r)return solve(p,a[l]);
build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr&&T[p].in)return pushnow(p,1);
if(T[p].l==T[p].r)return solve(p,nxt[T[p].sum]);
pushdown(p);
if(qr<=mid)update(lc,ql,qr);
else if(ql>mid)update(rc,ql,qr);
else update(lc,ql,mid),update(rc,mid+1,qr);
pushup(p);
}
inline int query(int p,int ql,int qr){
if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum;
pushdown(p);
if(qr<=mid)return query(lc,ql,qr);
if(ql>mid)return query(rc,ql,qr);
return query(lc,ql,mid)+query(rc,mid+1,qr);
}
int main(){
n=read(),m=read(),mod=read();
for(int i=1;i<=n;++i)a[i]=read();
for(int i=0;i<mod;++i)nxt[i]=i*i%mod,inloop[i]=true;
for(int i=0;i<mod;++i)
if(!vis[i]){
int tmp=i;
while(!vis[tmp])vis[tmp]=1,tmp=nxt[tmp];
for(int j=i;j!=tmp;j=nxt[j])inloop[j]=false;
}
build(1,1,n);
while(m--){
int op=read(),l=read(),r=read();
if(!op)update(1,l,r);
else printf("%d\n",query(1,l,r));
}
return 0;
}
2018.10.18 bzoj4105: [Thu Summer Camp 2015]平方运算(线段树)的更多相关文章
- BZOJ4105 [Thu Summer Camp 2015]平方运算 【线段树】
题目链接 BZOJ4105 题解 平方操作orz,虽说应该是线段树,但是不会维护啊QAQ 小瞧一眼题解... 平方成环?环长\(lcm\)小于\(60\)? 果然还是打表找规律题.... 那就很好做了 ...
- bzoj4105: [Thu Summer Camp 2015]平方运算
填坑 我不知道怎么算的,但是所有环的LCM数不会超过60 然后用线段树维护这个东西,每个节点记录子树内的循环节 没到循环节的暴力枚举 复杂度是nlogn再乘以循环节长度 #include<cst ...
- bzoj:4105: [Thu Summer Camp 2015]平方运算
Description Input 第一行有三个整数N,M,p,分别代表序列的长度.平方操作与询问操作的总次数以及在平方操作中所要模的数. 接下来一行N个数代表一开始的序列{X1,X2,... ...
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
- 2018.10.18 NOIP训练 ZUA球困难综合征(线段树)
传送门 考虑到模数等于7 * 13 * 17 * 19. 那么只需要维护四棵线段树求出每个数处理之后模7,13,17,197,13,17,197,13,17,19的值再用crtcrtcrt合并就行了. ...
- [Thu Summer Camp 2015]解密运算
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MB Description 对于一个长度为N的字符串,我 ...
- 【BZOJ 4104】 4104: [Thu Summer Camp 2015]解密运算 (智商)
4104: [Thu Summer Camp 2015]解密运算 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 370 Solved: 237 De ...
- BZOJ4104:[Thu Summer Camp 2015]解密运算——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4104 对于一个长度为N的字符串,我们在字符串的末尾添加一个特殊的字符".".之 ...
- BZOJ4104 [Thu Summer Camp 2015]解密运算 【乱搞】
题目链接 BZOJ4104 题解 我们将已知字符排序,由循环就可以得到一个对应关系 如样例就是: 0->第5行 1->第1行 1->第2行 1->第3行 1->第5行 2 ...
随机推荐
- SpringMVC 之@RequestBody 接收Json数组对象
1. 摘要 程序流程: 前台使用ajax技术,传递json字符串到后台: 后台使用Spring MVC注解@RequestBody 接受前台传递的json字符串,并返回新的json字符串到前台: 前台 ...
- 制作keil5的pack
[原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/6273415.html 我在这里就交大家怎样制作自己的Pack,(这里是我制作好的http ...
- 使用MATPLOTLIB 制图(散点图,热力图)
import numpy as np import pandas as pd import matplotlib.pyplot as plt data = pd.read_csv('D:\\myfil ...
- class(类的使用说明)
class 的三大特性 封装:内部调用对于外部用户是透明的 继承: 在分类里的属性,方法被自动继承 多态:调用这个功能,可以使多个类同时执行 r1 = Role(r1, 'Alex', 'Police ...
- egret 精简游戏项目
新建一个游戏项目,我们可以删除resource文件夹下除了default.thm.json和default.res.json文件,一旦删除,当新建皮肤exml文件时会报错 还可以删除src文件夹里除了 ...
- 认识serviceLoader
最近在研究系统设计方面的东西,发现有很多通用的解决方案,包括spring配置扩展以及serviceLoader的应用,这里简单记录下serviceLoader的简单应用,网上例子很多,大同小异,本人觉 ...
- 常见jsp跳转总结
这次做项目,用到几种不同的JSP跳转的方式,在此总结5中常用方法. 常用的跳转方式有以下几种: (1)href超链接标记,属于客户端跳转 (2)使用javascript完成,属于客户端跳转 (3)提交 ...
- HTML CSS + DIV实现整体布局 part2
9.盒模型的层次关系 我们通过一个经典的盒模型3D立体结构图来理解,如图: 从上往下看,层次关系如下: 第1层:盒子的边框(border), 第2层:元素的内容(content).内边 ...
- -moz 火狐 -msIE -webkit[chrome safari]
-moz代表firefox浏览器私有属性 -ms代表IE浏览器私有属性 -webkit代表chrome.safari私有属性
- Zookeeper—学习笔记(一)
1.Zookeeper基本功能 (增 删 改 查:注册,监听) 两点: 1.放数据(少量). 2.监听节点. 注意: Zookeeper中的数据不同于数据库中的数据,没有表,没有记录,没有字段: Z ...