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;
}
```
####原题目描述:
![这里写图片描述](https://img-blog.csdn.net/20180725224908876?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5NTk5MDY3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
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 ...
随机推荐
- 用 CSS 实现酷炫的动画充电效果
巧用 CSS 实现酷炫的充电动画 循序渐进,看看只使用 CSS ,可以鼓捣出什么样的充电动画效果. 画个电池 当然,电池充电,首先得用 CSS 画一个电池,这个不难,随便整一个: 欧了,勉强就是它了. ...
- Mongodb导入本地数据(.dat)到仓库(window)
借鉴文章,完成了数据文件导入到Mongodb, 尊重作者版权:https://blog.csdn.net/weixin_44198965/article/details/100022616 1.找到你 ...
- react-router v3和v4区别
1.默认路由 v3 <IndexRoute> v4 <Route exact> 2.授权路由 import Redirect from 'react-router-dom' & ...
- js过滤字符串中的html标签
var str = 'add<a>daad</a><p>fsdada</p>' str.replace(/<[^<>]+>/g, ...
- NX二次开发-Block UI C++界面Specify Point(指定点)控件的获取(持续补充)
Specify Point(指定点)控件的获取 NX9+VS2012 #include <uf.h> #include <uf_ui.h> UF_initialize(); / ...
- js设计模式——4.迭代器模式
js设计模式——4.迭代器模式 代码演示 /*js设计模式——迭代器模式*/ class Iterator { constructor(container) { this.list = contain ...
- 训练集(train set) 验证集(validation set) 测试集(test set)。
训练集(train set) 验证集(validation set) 测试集(test set). http://blog.sina.com.cn/s/blog_4d2f6cf201000cjx.ht ...
- Access数据库中自动编号字段重置为1
在清空一张ACESS数据库表后,在重添加数据之前,希望此表的自动编号能从1开始,怎么办呢? 下面的方法告诉我们,除了通过转存数据库表的方法外,还有几种更简单的方法: 方法一(前提:数据库表可带内容进行 ...
- Netty 相关目录
Netty 相关目录 Netty 源码学习--客户端流程分析 Netty 源码学习--服务端流程分析 Netty 源码分析--ChannelPipeline Netty 源码学习--EventLoop ...
- 如何省略.jsx文件名
在webpack.config.js文件夹中module.exports中添加: resolve:{ extensions:[".js", ".jsx", &q ...