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 ...
随机推荐
- TCP三次挥手
tcp:三次握手 client和server之间需要经历三次握手才能建立连接(connnect()方法中封装了三次握手的步骤)syn:同步请求,建立连接的请求ack:对syn请求包的确认 应答syn: ...
- Vue学习笔记【12】——过滤器
概念:Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化.过滤器可以用在两个地方:mustache 插值和 v-bind 表达式.过滤器应该被添加在 JavaScript 表达式的尾部,由 ...
- PHP ftp_fget() 函数
定义和用法 ftp_fget() 函数从 FTP 服务器上下载一个文件并保存到本地一个已经打开的文件中. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_fget(ftp ...
- Android中如何搭建一个WebServer
今天终于把老大交代的任务搞完了,感觉收获挺多的,所以就写一篇来记录一下吧,首先还是来看一下,老大们的需求 需求: 希望移动端的用户标识(IMEI)和HTML页面的用户标识(Cookie)连接起来,其中 ...
- Android中自己定义一个shade.xml
自己定义一个shade: <shape> <!-- 实心 --> <solid android:color="#ff9d77"/> <!- ...
- 贪心——cf708b
先求0,1的个数,然后贪心输出01即可 #include<bits/stdc++.h> using namespace std; #define ll long long ll a,b,c ...
- vue笔记一:设置表头的背景颜色以及下边框颜色
最近做的一个项目有个小小的需求,就是把表头的背景颜色改为黑色,表格边框颜色改为这个颜色,中间出了些问题,因为vue的表格样式是内联样式,一修改就影响到其他地方的表格样式,尽管我单独加了id还是不行,经 ...
- 简单介绍Collection框架的结构
Collection:List列表,Set集 Map:Hashtable,HashMap,TreeMap Collection 是单列集合 List 元素是有序的.可重复 有序的 collect ...
- 力扣算法题—150. Evaluate Reverse Polish Notation
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, ...
- HTML5 placeholder实际应用经验分享及拓展
QQ邮箱登陆(http://mail.qq.com) 如下截图啦: 我在上面一个demo类似原理上做了下修改,制作了一个这样子交互效果的demo,希望对有兴趣的同行能帮上点忙,您可以狠狠地点击这里:透 ...