(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

题意: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同类型)的更多相关文章

  1. bzoj3211: 花神游历各国(线段树) 同codevs2492

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 3628  Solved: 1326[Submit][Status][Discu ...

  2. bzoj3211 花神游历各国 线段树,势能分析

    [bzoj3211]花神游历各国 2014年3月17日2,7230 Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input ...

  3. bzoj3211花神游历各国 线段树

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4252  Solved: 1547[Submit][Status][Discu ...

  4. 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 ...

  5. bzoj3211花神游历各国&&bzoj3038上帝造题的七分钟2*

    bzoj3211花神游历各国 题意: n个数的序列,m个操作,操作两种:区间开根(向下取整)和区间求和.n≤100000,m≤200000,序列中的数非负且≤109. 题解: 一个≤109的数开6次根 ...

  6. BZOJ3211花神游历各国

    BZOJ3211花神游历各国 BZOJ luogu 分块 记一个all表示该块是否全部<=1,如果all不为真就暴力修改 因为一个数被开根的次数不多,即使\(10^{12}\)只要开根6次也会变 ...

  7. BZOJ-3211花神游历各国 并查集+树状数组

    一开始想写线段树区间开方,简单暴力下,但觉得变成复杂度稍高,懒惰了,编了个复杂度简单的 3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Subm ...

  8. [BZOJ3211]花神游历各国&&[BZOJ3038] 上帝造题的七分钟2 树状数组+并查集

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4057  Solved: 1480[Submit][Status][Discu ...

  9. BZOJ3211: 花神游历各国(线段树)

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 5692  Solved: 2114[Submit][Status][Discu ...

随机推荐

  1. js实现复制|剪切指定内容到粘贴板--clipboard

    这是著名开源项目 clipboard.js 的 README.md,里面讲解的更加详细,有兴趣的同学可以了解一下.项目地址:https://github.com/zenorocha/clipboard ...

  2. 【leetcode】967. Numbers With Same Consecutive Differences

    题目如下: Return all non-negative integers of length N such that the absolute difference between every t ...

  3. 调试Android有什么错误

    项目目录的cmd调试查看有什么错误 gradlew processDebugManifest --stacktrace

  4. Android中的gen文件为空或者不存在的处理方法

    Android中的gen文件时链接程序和XML中资源定义的桥梁,所以如果gen文件夹为空可能有以下的几个原因: 1.XML文件错误,这时可以检查res文件夹中的文件是否有错误 2.导入新的Androi ...

  5. JXOI2017 加法

    题目描述: 可怜有一个长度为 \(n\) 的正整数序列 \(A\),但是她觉得 \(A\) 中的数字太小了,这让她很不开心. 于是她选择了 \(m\) 个区间 \([l_i, r_i]\) 和两个正整 ...

  6. 海外版本Google登录

    海外版本: 1.安裝谷歌安裝器:手机浏览器搜索“谷歌安装器”,安装酷安的好一些,地址: https://www.coolapk.com/apk/com.goplaycn.googleinstall 2 ...

  7. MVC3中_ViewStart.cshtml的一些事

    MVC3中,使用Razor模板引擎的话,会自动生成一个_ViewStart.cshtml文件. 很多人把这个文件当成类似Webform中的Master模板文件,其实这个_ViewStart.cshtm ...

  8. 2、Appium Desktop 使用介绍

    1.appium运行界面介绍 默认显示监控的 host 和 port , 这和 Appium-Server 中是一致的.  2.点击 “Start Server V 1.7.2” 按钮启动服务,出现如 ...

  9. BigDecimal.divide方法

    java.math.BigDecimal.divide(BigDecimal divisor, int roundingMode) 返回一个BigDecimal,其值为(this/除数),其标度是th ...

  10. java实现邮件定时发送

    最近做项目时客户提出了一个需求:系统定时发送E-mail到其客户,达到通知的效果.先将实例分享给大家,如果确实有一些帮助的话,请大家来点掌声! 首先介绍java定时器(java.util.Timer) ...