【算法】线段树||树状数组&&并查集

【题解】修改必须暴力单点修改,然后利用标记区间查询。

优化:一个数经过不断开方很快就会变成1,所以维护区间最大值。

修改时访问到的子树最大值<=1时,该区间就不必修改。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=;
struct treess{int k,l,r;long long maxs,sum;}t[maxn*];
int n,m;long long a[maxn];
void build(int k,int l,int r)
{
t[k].l=l;t[k].r=r;
if(l==r)t[k].maxs=t[k].sum=a[l];
else
{
int mid=(l+r)>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
t[k].maxs=max(t[k<<].maxs,t[k<<|].maxs);//printf("k=%d maxs=%d",k,t[k].maxs);
t[k].sum=t[k<<].sum+t[k<<|].sum;
}
}
void update(int k,int l,int r)
{
int left=t[k].l,right=t[k].r;
if(t[k].maxs<=)return;
if(left==right)a[left]=floor(sqrt(a[left])),t[k].maxs=t[k].sum=a[left];
else
{
int mid=(left+right)>>;
if(l<=mid)update(k<<,l,r);
if(r>mid)update(k<<|,l,r);
t[k].maxs=max(t[k<<].maxs,t[k<<|].maxs);
t[k].sum=t[k<<].sum+t[k<<|].sum;
}
}
long long ask(int k,int l,int r)
{
int left=t[k].l,right=t[k].r;
if(l<=left&&right<=r)return t[k].sum;
int mid=(left+right)>>;long long ans=;
if(l<=mid)ans=ask(k<<,l,r);
if(r>mid)ans+=ask(k<<|,l,r);
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lld",&a[i]);
scanf("%d",&m);
build(,,n);
for(int i=;i<=m;i++)
{
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if(l>r)swap(l,r);
if(k==)update(,l,r);
else printf("%lld\n",ask(,l,r));
}
return ;
}

并查集将ai=1的节点并起来,也就是fa[i]表示i后第一个ai≠1的节点,然后用树状数组单点修改区间维护前缀和。

带删除的寻数问题,都可以用类似的并查集套路解决。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define lowbit(x) x&(-x)
#define ll long long
using namespace std;
const ll maxn=;
ll n,m,fa[maxn],a[maxn];
long long c[maxn]; void modify(ll x,ll k){for(ll i=x;i<=n;i+=lowbit(i))c[i]+=k;}
long long ask(ll x){long long as=;for(ll i=x;i>=;i-=lowbit(i))as+=c[i];return as;}
ll find(ll x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int main(){
scanf("%lld",&n);
for(ll i=;i<=n;i++)scanf("%lld",&a[i]),modify(i,a[i]);
for(ll i=;i<=n+;i++)fa[i]=i;
scanf("%lld",&m);
for(ll i=;i<=m;i++){
ll k,l,r;
scanf("%lld%lld%lld",&k,&l,&r);
if(l>r)swap(l,r);
if(k==)printf("%lld\n",ask(r)-ask(l-));
else{
for(ll j=l;j<=r;j++){
j=find(j);
if(j<=r){
modify(j,(ll)sqrt(a[j])-a[j]);
a[j]=(ll)sqrt(a[j]);
if(a[j]<=)fa[j]=find(j+);
}
}
}
}
return ;
}

【BZOJ】3038: 上帝造题的七分钟2 && 3211: 花神游历各国的更多相关文章

  1. 题解【luogu4145 上帝造题的七分钟2(花神游历各国)】

    题目大意: 一个序列,支持区间开方与求和操作. 算法:线段树实现开方修改与区间求和 分析: 显然,这道题的求和操作可以用线段树来维护 但是如何来实现区间开方呢 大家有没有这样的经历:玩计算器的时候,把 ...

  2. 题解【luoguP4145 上帝造题的七分钟2(花神游历各国)】

    题目链接 题解 题目大意: 一个序列,支持区间开方与求和操作. 算法:线段树实现开方修改与区间求和 分析: 显然,这道题的求和操作可以用线段树来维护 但是如何来实现区间开方呢 大家有没有这样的经历:玩 ...

  3. 【线段树】bzoj3038 上帝造题的七分钟2 / bzoj3211 花神游历各国

    暴力修改,记录一段是否全部为1或0,若全是了,则不再修改. 注意3211一定要判是否为0,否则会T得惨无人道. #include<cstdio> #include<cmath> ...

  4. BZOJ 3038: 上帝造题的七分钟2

    3038: 上帝造题的七分钟2 Description XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分 ...

  5. BZOJ 3038: 上帝造题的七分钟2【线段树区间开方问题】

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1469  Solved: 631[Submit][Status][Dis ...

  6. bzoj 3038: 上帝造题的七分钟2 线段树||hdu 4027

    3038: 上帝造题的七分钟2 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1066  Solved: 476[Submit][Status][Dis ...

  7. BZOJ 3038: 上帝造题的七分钟2 / BZOJ 3211: 花神游历各国 (线段树区间开平方)

    题意 给出一些数,有两种操作.(1)将区间内每一个数开方(2)查询每一段区间的和 分析 普通的线段树保留修改+开方优化.可以知道当一个数为0或1时,无论开方几次,答案仍然相同.所以设置flag=1变表 ...

  8. BZOJ 3038 上帝造题的七分钟2 (并查集+树状数组)

    题解:同 BZOJ 3211 花神游历各国,需要注意的是需要开long long,还有左右节点需要注意一下. #include <cstdio> #include <cmath> ...

  9. BZOJ 3038 上帝造题的七分钟2 树状数组+并查集

    题目大意:一个序列,有两种操作.1.将一段数中的每个数开根号.2.查询一段数的和. 思路:和3211是一个题,有兴趣的能够看看我的那篇博客. CODE: #include <cmath> ...

随机推荐

  1. TensorFlow高级API(tf.contrib.learn)及可视化工具TensorBoard的使用

    一.TensorFlow高层次机器学习API (tf.contrib.learn) 1.tf.contrib.learn.datasets.base.load_csv_with_header 加载cs ...

  2. 3dContactPointAnnotationTool开发日志(十)

      要是那几个状态栏不能拖动的话岂不是显得太呆板了,于是我又参考Unity官方视频教程学习了如何实现拖动状态栏的功能,还挺简单的.   比如说要拖动这个PanelStatus面板,我只让使用者通过拖动 ...

  3. Linux文件传输FTP详解

    ftp命令用来设置文件系统相关功能.ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相 ...

  4. Perfmon - Windows 自带系统监控工具

    一. 简述 可以用于监视CPU使用率.内存使用率.硬盘读写速度.网络速度等. Perfmon提供了图表化的系统性能实时监视器.性能日志和警报管理,系统的性能日志可定义为二进制文件.文本文件.SQLSE ...

  5. Tiny4412 LED 程序

    package cn.hyc.led; import android.os.Bundle; import android.app.Activity; import android.view.Menu; ...

  6. ASP.NET MVC 多语言解决方案

    1:打开VS,新建ASP.NET MVC4项目 2:创建一个放本地化资源的文件夹并命名为"Language",右键选择添加新项,选择资源文件并命名为"Com" ...

  7. 导入导出SQL数据库

    在需要导出的数据库名上右键,选择转储SQL-数据和结构 在需要导入的连接中新建相同名称的数据库,右键选择运行SQL文件,即可将数据库数据转储到新的数据库中

  8. Android------去除标题栏

    这里暂时只给出一种方法,在java代码中去除 1.继承Activity 在onCreate方法中 getWindow().setFlags(WindowManager.LayoutParams.FLA ...

  9. vue2.0 自定义时间过滤器

    html <td>{{serverInfo.serverTime| formatTime('YMDHMS')}}</td> js serverTime: new Date(). ...

  10. Python 源码剖析(六)【内存管理机制】

    六.内存管理机制 1.内存管理架构 2.小块空间的内存池 3.循环引用的垃圾收集 4.python中的垃圾收集 1.内存管理架构 Python内存管理机制有两套实现,由编译符号PYMALLOC_DEB ...