5028: 小Z的加油店(线段树)
NOI2012魔幻棋盘弱化版
gcd(a,b,c,d,e)=gcd(a,b-a,c-b,d-c,e-d)
然后就可以把区间修改变成差分后的点修了。
用BIT维护原序列,线段树维护区间gcd,支持点修区查
#include<iostream> #include<cstring> #include<cstdlib> #include<cstdio> #define ll long long using namespace std; const int maxn=500010; struct poi{int sum;}tree[maxn<<2]; int n,m,ty,x,y,z,ans; int a[maxn],bit[maxn]; void read(int &k) {int f=1;k=0;char c=getchar();while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();k*=f; } inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lowbit(int x){return x&-x;} inline void add(int x,int delta){for(;x<=n;x+=lowbit(x))bit[x]+=delta;} inline int querybit(int x){int sum=0;for(;x;x-=lowbit(x))sum+=bit[x];return sum;} inline void pushup(int x){tree[x].sum=gcd(tree[x<<1].sum,tree[x<<1|1].sum);} void build(int x,int l,int r) {if(l==r){tree[x].sum=a[l]-a[l-1];return;}int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);pushup(x); } void update(int x,int l,int r,int cx,int delta) {if(l==r){tree[x].sum+=delta;return;}int mid=(l+r)>>1;if(cx<=mid)update(x<<1,l,mid,cx,delta);else update(x<<1|1,mid+1,r,cx,delta);pushup(x); } void query(int x,int l,int r,int cl,int cr) {if(cl<=l&&r<=cr){ans=gcd(ans,abs(tree[x].sum));return;}int mid=(l+r)>>1;if(cl<=mid)query(x<<1,l,mid,cl,cr);if(cr>mid)query(x<<1|1,mid+1,r,cl,cr); } int main() {read(n);read(m);for(int i=1;i<=n;i++)read(a[i]),add(i,a[i]),add(i+1,-a[i]);build(1,1,n);for(int i=1;i<=m;i++){read(ty);read(x);read(y);if(ty==1)ans=querybit(x),query(1,1,n,x+1,y),printf("%d\n",ans);else{read(z);add(x,z);add(y+1,-z);update(1,1,n,x,z);update(1,1,n,y+1,-z);}} }
View Code
转载于:https://www.cnblogs.com/Sakits/p/7523044.html
5028: 小Z的加油店(线段树)相关推荐
- 【XSY2720】区间第k小 整体二分 可持久化线段树
题目描述 给你你个序列,每次求区间第\(k\)小的数. 本题中,如果一个数在询问区间中出现了超过\(w\)次,那么就把这个数视为\(n\). 强制在线. \(n\leq 100000,a_i<n ...
- 小C的数学问题 线段树+分治
题目描述 小C是个云南中医学院的大一新生,在某个星期二,他的高数老师扔给了他一个问题. 让他在1天的时间内给出答案. 但是小C不会这问题,现在他来请教你. 请你帮他解决这个问题. 有n个数,每个数有权 ...
- 牛客-小H的询问(线段树)
原题链接:更好的阅读体验 题目描述 小H给你一个数组{a},要求支持以下两种操作: 0 l r(1<=l<=r<=n),询问区间[l,r]中权值和最大的有效子区间的权值和,一个子区间 ...
- 【codevs3304】水果姐逛水果店Ⅰ,线段树练习
水果姐逛水果街Ⅰ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店 ...
- 线段树 区间加 gcd 差分
小阳的贝壳 如果线段树要维护区间gcd 这个很简单,但是如果有了区间加,维护gcd 就比较麻烦了. 这个首先可以证明的是 gcd(x,y,z)=gcd(x,y-x,z-y) 这个可以推到 n 个 ...
- [LOJ3153] 三级跳(单调栈 + 线段树)
problem loj3153 solution 有一个显然正确但又不起眼却是正解必备的结论: 考虑 (x,y,z)(x,y,z)(x,y,z) 答案三元对,如果有一个数 i∈(x,y)∧ai≥axi ...
- 线段树什么的最讨厌了
Description 小Y 最近学习了线段树,但是由于她的智商比较低,运用的还不是很熟练.于是小R 给了她一点练习题训练,其中有一道是这样的. 这是小R 写的线段树的一段建树代码: 只要调用buil ...
- BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
题意 题目链接 Sol 不难发现题目给出的是一个树,其中\(\frac{i}{K}\)是\(i\)的父亲节点 首先,当\(d_i\)互不相同时,一个显然的贪心策略就是优先给编号小的分配较大的权值.可以 ...
- ACdream1157 Segments(CDQ分治 + 线段树)
题目这么说的: 进行如下3种类型操作: 1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R] 2)C i (1-base) 删除第i条增加的线 ...
- 小清的线段树25题日志01 线段树下你和我 欢乐多又多
前言 难度大致会按排序来 就不写总结啦 嘻嘻 适合刚学线段树的人(和我一样 练手 /*if you can't see the repayWhy not just work step by stepr ...
最新文章
- 最大的问题是没有发现问题之一:谈谈滥用继承
- 服务器支持热部署吗,热部署
- scenebuilder各控件属性介绍_C#控件及常用设计整理(三)
- 面向对象三大特性之一:继承(C++)
- 下载mysql镜像教程_docker下安装mysql镜像
- 在 Excel 里使用 ODBC 读取 SAP BTP 平台上 CDS view 的数据
- datagridview滚动条自动滚动_微软新贡献:进一步优化Chromium的滚动特性
- linux之Vim用快捷键快速移动光标至行首和行尾
- 囊括计算机 电子信息仿真技术,什么是虚拟现实?
- textarea怎么占满整个td_保健品为什么偏偏盯上老人?作为子女,应怎么面对老人狂买保健品...
- 这是我的第一个博客,以后遇到问题一起解决
- #CSP 201509-1 数列分段(100分)
- linux运行大端程序,ARM 平台上的Linux系统启动流程
- Oracle数据库连接、退出缓慢问题查询与处理
- 如何制作SCI论文中的Figure(三)
- [转]如何编程实现 2 + 2 = 5?
- 7天连锁酒店郑南雁:顺势创业者无为管理人
- Could not resolve placeholder
- Longhorn 企业级云原生容器存储解决方案-部署篇
- licecap免费+轻量+使用简单的录屏制作gif工具
热门文章
- Java拥挤度,零基础学JAVA难不难?
- python中str类型_python的str是什么类型
- python2与python3同时安装_Linux-CentOS安装python2和python3实现共存
- python入门学多久_为什么Python适合初学者,一般要学习多久
- python字典默认排序_Python字典练习:设置默认获取排序,小,知识点,setdefaultgetsorted...
- dh参数逆运动学_干货 | 运动学好像够用了,我们为什么还需要动力学
- LeetCode----两数之和
- python语法学习第七天--文件
- c语言荷兰国旗问题算法,荷兰国旗问题
- 计算机组成原理——第一章