BZOJ3211花神游历各国-线段树&树状数组-(HDU4027同类型)
(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦
题意:BZOJ HDU
原题目描述在最下面。
两种操作,1:把区间的数字开方一次,2:区间求和。
思路:
线段树:
显然不能暴力单点更新。但是有一个规律就是一个数再开方log次后就会变成1了。变成1就没有开方的必要了。
所以用lazy==1
表示此区间内数字全都小于等于1,无需更新。
对于lazy==0
单点更新,lazy==1
的不更新。
求和就是普通的区间求和。看下push_up()函数即可。
树状数组:
树状数组区间求和很方便。然后这题的开发更操作只需要修改一下add函数即可。每次add(\(i, \sqrt{ ar_{i} - ar_{i}}\))。
当然也不是暴力枚举更新。有些点的值小于等于1就没必要更新。这是用一个并查集维护一下每个位置下一个需要更新的位置在哪里就可以了。
####AC代码:
BZOJ3211线段树
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include<assert.h>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e5+7;
const int mod = 10007;
int n, q;
struct lp{
int l,r;
LL delta;
int lazy;
}cw[N<<2];
LL ar[N];
//lazy==1表示全部小于等于1
void push_up(int rt){
cw[rt].delta=cw[lson].delta+cw[rson].delta;
cw[rt].lazy=(cw[lson].lazy&cw[rson].lazy);
}
void build(int l,int r,int rt){
int mid = (l+r)>>1;
cw[rt].l=l,cw[rt].r=r;
cw[rt].lazy=0;
if(l==r){
cw[rt].delta=ar[l];
if(ar[l]<=1)cw[rt].lazy=1;
return;
}
build(l,mid,lson);build(mid+1,r,rson);
push_up(rt);
}
void update(int L,int R,int rt){
int l=cw[rt].l,r=cw[rt].r,mid=(l+r)>>1;
if(l==r){
cw[rt].delta=(LL)sqrt(cw[rt].delta*1.0);
if(cw[rt].delta<=1)cw[rt].lazy=1;
return;
}
if(L<=mid&&cw[lson].lazy==0)update(L,R,lson);
if(R>mid&&cw[rson].lazy==0)update(L,R,rson);
push_up(rt);
}
LL query(int L,int R,int rt){
int l=cw[rt].l,r=cw[rt].r,mid=(l+r)>>1;
if(L<=l&&r<=R){
return cw[rt].delta;
}
LL sum = 0;
if(L>mid)sum = query(L,R,rson);
else if(R<=mid)sum = query(L,R,lson);
else {
sum = query(L,R,lson)+query(L,R,rson);
}
return sum;
}
int main(){
while(~scanf("%d", &n)){
for(int i=1;i<=n;++i){
scanf("%lld",&ar[i]);
}
build(1,n,1);
scanf("%d",&q);
while(q--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==2){
update(l,r,1);
}else{
printf("%lld\n", query(l,r,1));
}
}
}
return 0;
}
BZOJ3211树状数组
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include<assert.h>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e5+7;
const int mod = 10007;
int n, q;
LL bit[N],ar[N];
int fa[N];
void add(int x,LL z){while(x<=n)bit[x]+=z,x+=lowbit(x);}
LL query(int x){LL sum=0;while(x)sum+=bit[x],x-=lowbit(x);return sum;}
int Fi(int x){
return fa[x]==x?x:fa[x]=Fi(fa[x]);
}
int main(){
while(~scanf("%d", &n)){
memset(bit,0,sizeof(bit));
for(int i=1;i<=n;++i){
scanf("%lld",&ar[i]);
add(i,ar[i]);
}
for(int i=1;i<=n;++i)fa[i]=i;
fa[n+1]=n+1;
scanf("%d",&q);
while(q--){
int op,l,r;
scanf("%d%d%d",&op,&l,&r);
if(op==2){
for(int j=l;j<=r;){
LL tmp = (LL)sqrt(ar[j]);
add(j,tmp-ar[j]);
ar[j]=tmp;
fa[j]=j;
if(tmp<=1)fa[j]=j+1;
j=(Fi(j)==j?j+1:fa[j]);
}
}else{
printf("%lld\n", query(r)-query(l-1));
}
}
}
return 0;
}
HDU4027
```
#include
#include
#include
#include
#include
#define lson rt>1;
cw[rt].l = l;cw[rt].r = r;
cw[rt].lazy = 0;
if(l==r){
cw[rt].val = ar[l];
if(cw[rt].val>1;
if(l==r){
cw[rt].val = (LL)sqrt(cw[rt].val*1.0);
if(cw[rt].val mid&&cw[rson].lazy==0) update(L,R,rson);
push_up(rt);
}
LL query(int L, int R, int rt){
int l = cw[rt].l, r = cw[rt].r, mid = (l+r)>>1;
if(Lmid){
if(cw[rson].lazy)return R-L+1;
sum = query(L,R,rson);
}else if(Rr)l^=r^=l^=r;
if(op==0){
update(l, r, 1);
}else if(op == 1){
printf("%I64d\n", query(l, r, 1));
}
}
printf("\n");
}
return 0;
}
```
####原题目描述:

BZOJ3211花神游历各国-线段树&树状数组-(HDU4027同类型)的更多相关文章
- bzoj3211: 花神游历各国(线段树) 同codevs2492
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 1326[Submit][Status][Discu ...
- bzoj3211 花神游历各国 线段树,势能分析
[bzoj3211]花神游历各国 2014年3月17日2,7230 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input ...
- bzoj3211花神游历各国 线段树
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4252 Solved: 1547[Submit][Status][Discu ...
- BZOJ3211:花神游历各国(线段树)
Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 2 3 ...
- bzoj3211花神游历各国&&bzoj3038上帝造题的七分钟2*
bzoj3211花神游历各国 题意: n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和.n≤100000,m≤200000,序列中的数非负且≤109. 题解: 一个≤109的数开6次根 ...
- BZOJ3211花神游历各国
BZOJ3211花神游历各国 BZOJ luogu 分块 记一个all表示该块是否全部<=1,如果all不为真就暴力修改 因为一个数被开根的次数不多,即使\(10^{12}\)只要开根6次也会变 ...
- BZOJ-3211花神游历各国 并查集+树状数组
一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...
- [BZOJ3211]花神游历各国&&[BZOJ3038] 上帝造题的七分钟2 树状数组+并查集
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 4057 Solved: 1480[Submit][Status][Discu ...
- BZOJ3211: 花神游历各国(线段树)
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 5692 Solved: 2114[Submit][Status][Discu ...
随机推荐
- 【Flutter学习】基本组件之基本按钮组件
一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...
- word文档操作
1.如何把word文档修改的地方标记出来 : https://zhidao.baidu.com/question/73648149.html 2.word 的几种 视图:https://zhid ...
- access注入篇+sqlmap
access数据库的来历,我就不说了,因为我懒的记,就算记了感觉上也没大多用处,只要记得数据库的结构就行了.先是表名,然后是列名,再者就是数据,我发个实际的图吧,大概就是这么一个结构. 下面,开始说下 ...
- UVA 1525 Falling Leaves
题目链接:https://vjudge.net/problem/UVA-1525 题目链接:https://vjudge.net/problem/POJ-1577 题目大意 略. 分析 建树,然后先序 ...
- mtk_Call setting(SS)
1.SSDS: 2.PDN type 3.server回error之后的处理通过UT接口设置SS之后,网络有时候会回error,有些运营商会根据这些error来决定是否要CSFB, CSFB的条件如下 ...
- JUC源码分析-集合篇:并发类容器介绍
JUC源码分析-集合篇:并发类容器介绍 同步类容器是 线程安全 的,如 Vector.HashTable 等容器的同步功能都是由 Collections.synchronizedMap 等工厂方法去创 ...
- CentOS 7 用 yum 安装 Nginx
在 CentOS 7 中,直接使用 yum 安装 Nignx 会提示无下载源.因此,需要添加 Nginx 的下载源到 yum: sudo rpm -Uvh http://nginx.org/packa ...
- Java支持的数据类型有哪些?什么是拆装箱?
Java中有八种基本数据类型以及引用类型 基本数据类型: byte(1字节),short(2字节),int(4字节),long(8字节),char(2字节),boolean(不确定,取值是true/f ...
- 实现简单的PHP接口,以及使用js/jquery ajax技术调用此接口
主要介绍下如何编写简单的php接口,以及使用js/jquery的ajax技术调用此接口. Php接口文件(check.php): <?php $jsonp_supporter = $_GET[‘ ...
- JS对象 数组排序sort() sort()方法使数组中的元素按照一定的顺序排列。 语法: arrayObject.sort(方法函数)
数组排序sort() sort()方法使数组中的元素按照一定的顺序排列. 语法: arrayObject.sort(方法函数) 参数说明: 1.如果不指定<方法函数>,则按unicode码 ...