题意:http://uoj.ac/problem/228

sol  :线段树开根操作

   对于节点x,可以在max[x]-min[x]<=1时直接做,转化为区间减或区间覆盖

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#define int long long
using namespace std;
const int Mx=;
int n,m,a[Mx],Min[Mx],Max[Mx],sum[Mx];
int l[Mx],r[Mx],lson[Mx],rson[Mx],Add_tag[Mx],Cover_tag[Mx]; void pushup(int x)
{
int L=lson[x],R=rson[x];
Min[x]=min(Min[L],Min[R]);
Max[x]=max(Max[L],Max[R]);
sum[x]=sum[L]+sum[R];
} void build(int x,int L,int R)
{
l[x]=L,r[x]=R,lson[x]=x<<,rson[x]=x<<|;
if(L==R) { Min[x]=a[L],Max[x]=a[L],sum[x]=a[L]; return ;}
int mid=(L+R)>>;
build(x<<,L,mid);
build(x<<|,mid+,R);
pushup(x);
} void pushdown(int x)
{
int LS=lson[x],RS=rson[x],LL=l[LS],LR=r[LS],RL=l[RS],RR=r[RS];
if(Add_tag[x]!=)
{
Max[LS]+=Add_tag[x],Min[LS]+=Add_tag[x],sum[LS]+=(LR-LL+)*Add_tag[x];
Max[RS]+=Add_tag[x],Min[RS]+=Add_tag[x],sum[RS]+=(RR-RL+)*Add_tag[x];
if(Cover_tag[LS]<1e8) Cover_tag[LS]+=Add_tag[x];
else Add_tag[LS]+=Add_tag[x];
if(Cover_tag[RS]<1e8) Cover_tag[RS]+=Add_tag[x];
else Add_tag[RS]+=Add_tag[x];
}
if(Cover_tag[x]<1e8)
{
Max[LS]=Cover_tag[x],Min[LS]=Cover_tag[x],sum[LS]=(LR-LL+)*Cover_tag[x];
Max[RS]=Cover_tag[x],Min[RS]=Cover_tag[x],sum[RS]=(RR-RL+)*Cover_tag[x];
Cover_tag[LS]=Cover_tag[x];
Cover_tag[RS]=Cover_tag[x];
}
Add_tag[x]=,Cover_tag[x]=1e9;
} void Add(int x,int ql,int qr,int val)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R)
{
if(Cover_tag[x]<1e8) Cover_tag[x]+=val;
else Add_tag[x]+=val;
Max[x]+=val,Min[x]+=val,sum[x]+=(R-L+)*val;
return ;
}
pushdown(x);
Add(lson[x],ql,qr,val);
Add(rson[x],ql,qr,val);
pushup(x);
} void Cover(int x,int ql,int qr,int val)
{
int L=l[x],R=r[x];
Add_tag[x]=,Cover_tag[x]=val;
Max[x]=val,Min[x]=val,sum[x]=(R-L+)*val;
} void Sqrt(int x,int ql,int qr)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R&&Max[x]-Min[x]<=)
{
int mx=(int)sqrt(Max[x]),mn=(int)sqrt(Min[x]);
if(mx==mn) Cover(x,L,R,mx);
else Add(x,L,R,mx-Max[x]);
return ;
}
pushdown(x);
Sqrt(lson[x],ql,qr);
Sqrt(rson[x],ql,qr);
pushup(x);
} int Query(int x,int ql,int qr)
{
int L=l[x],R=r[x];
if(ql>R||qr<L) return ;
if(ql<=L&&qr>=R) return sum[x];
pushdown(x);
int ans=Query(lson[x],ql,qr)+Query(rson[x],ql,qr);
pushup(x);
return ans;
} signed main()
{
for(int i=;i<Mx;i++) Cover_tag[i]=1e9;
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
build(,,n);
for(int i=,num,x,y,z;i<=m;i++)
{
scanf("%lld%lld%lld",&num,&x,&y);
if(num==) scanf("%lld",&z),Add(,x,y,z);
if(num==) Sqrt(,x,y);
if(num==) printf("%lld\n",Query(,x,y));
}
return ;
}

uoj228:基础数据结构练习题的更多相关文章

  1. uoj228 基础数据结构练习题

    趁别人题解没有放出来赶快写一篇 整数序列,操作 区间加 区间变成sqrt(下取整) 区间和 考虑一下对于每个区间里所有sqrt不同的段操作,那么可以在O(段数logn)一次的时间内完成sqrt操作.考 ...

  2. [UOJ228] 基础数据结构练习题 - 线段树

    考虑到一个数开根号 \(loglog\) 次后就会变成1,设某个Node的势能为 \(loglog(maxv-minv)\) ,那么一次根号操作会使得势能下降 \(1\) ,一次加操作最多增加 \(l ...

  3. 【UOJ228】基础数据结构练习题(线段树)

    [UOJ228]基础数据结构练习题(线段树) 题面 UOJ 题解 我们来看看怎么开根? 如果区间所有值都相等怎么办? 显然可以直接开根 如果\(max-sqrt(max)=min-sqrt(min)\ ...

  4. 【UOJ#228】基础数据结构练习题 线段树

    #228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几 ...

  5. uoj #228. 基础数据结构练习题 线段树

    #228. 基础数据结构练习题 统计 描述 提交 自定义测试 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的 ...

  6. 【线段树】uoj#228. 基础数据结构练习题

    get到了标记永久化 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一 ...

  7. 【uoj228】 基础数据结构练习题

    http://uoj.ac/problem/228 (题目链接) 题意 给出一个序列,维护区间加法,区间开根,区间求和 Solution 线段树.考虑区间开根怎么做.当区间的最大值与最小值相等时,我们 ...

  8. UOJ228:基础数据结构练习题——题解

    http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...

  9. UOJ228 简单数据结构练习题

    Description 传送门 维护一个数列, 有以下操作: 对[l,r]同时加上x 把[l,r]开根后下取整. 查询[l,r]之和 n,m \(\leq\)$ 100000, $\(a_i,x \l ...

随机推荐

  1. 查询删除的SAP凭证

    标准报表查询:RSSCD100 函数模块:CHANGEDOCUMENT_DISPLAY, Display Change Documents 数据表查询:CDHDR, Change document h ...

  2. 经典sql语句汇总

    1,某条数据放首位,其他倒序并分页 select * from Student order by( case     when id='2'  then 1 ELSE 4 END),id desc l ...

  3. svn+apache安装配置

    1.安装httpd,mod_dav_svn,subversion yum install -y httpd mod_dav_svn subversion 2.创建仓库 mkdir /var/www/s ...

  4. php-5.6.26源代码 - opcode处理器,“函数调用opcode”处理器,如何调用扩展模块的函数

    // opcode处理器 --- ZEND_DO_FCALL_SPEC_CONST_HANDLER实现在 php-5.6.26\Zend\zend_vm_execute.h static int ZE ...

  5. Aizu:0009- Prime Number

    Prime Number Time limit 1000 ms Memory limit 131072 kB Problem Description Write a program which rea ...

  6. JDK及配置

    Java Jdk开发时环境,程序员使用 Jre运行时环境,用户使用 Jdk的配置 1.新建java_home   jdk的安装路径 例:C:\Program Files (x86)\Java\jdk1 ...

  7. Apache服务配置

    Apache 1.安装Apache服务 第1步:把光盘设备中的系统镜像挂载到/media/cdrom目录. [root@zhangjh ~]# mkdir -p /media/cdrom/ [root ...

  8. MethodTrace 生成的trace文件为空

    今天我准备生成一个trace文件,看看程序卡在哪里. 一般: Debug.startMethodTracing("yuge"); Debug.stopMethodTracing() ...

  9. sqlsever存储过程学习笔记

    1,创建数据表 use test create table money( id ,) primary key, money int, monetary_unity char ); 2,考虑到货币单位的 ...

  10. 更新域名解析以后,IP在cmd中ping不正确,清理DNS缓存

    1清除ARP缓存,cmd下使用命令arp -d*代替执行. 2清除NETBT,cmd下使用命令nbtstat -R代替执行. 再清除DNS缓存,cmd下使用命令ipconfig /flushdns代替 ...