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

正解:线段树。

我们可以发现,开根号时一个区间中的数总是趋近相等。判断一个区间的数是否相等,只要判断最大值和最小值是否相等就行了。如果这个区间的数相等,那么他们开方的数也相等,我们直接转化为减去一个数就行了。

但是这是没有办法$AC$的,我们还要加一个特判,就是最大值与最小值差为$1$,且他们开方以后的差也为$1$,如$8$和$9$这两个数,这样就能通过所有数据了。复杂度证明?我不会。。

 //It is made by wfj_2048~
#include <algorithm>
#include <iostream>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#define ls (x<<1)
#define rs (x<<1|1)
#define N (100010)
#define il inline
#define RG register
#define ll long long
#define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout) using namespace std; ll lazy[*N],sum[*N],mx[*N],mn[*N],a[N],n,m; il ll gi(){
RG ll x=,q=; RG char ch=getchar();
while ((ch<'' || ch>'') && ch!='-') ch=getchar();
if (ch=='-') q=-,ch=getchar();
while (ch>='' && ch<='') x=x*+ch-,ch=getchar();
return q*x;
} il void add(RG ll x,RG ll l,RG ll r,RG ll v){
sum[x]+=(r-l+)*v,mx[x]+=v,mn[x]+=v,lazy[x]+=v; return;
} il void merge(RG ll x,RG ll l,RG ll r){
sum[x]=sum[ls]+sum[rs]+(r-l+)*lazy[x];
mx[x]=max(mx[ls],mx[rs])+lazy[x];
mn[x]=min(mn[ls],mn[rs])+lazy[x];
return;
} il void build(RG ll x,RG ll l,RG ll r){
if (l==r){ sum[x]=mx[x]=mn[x]=a[l]; return; }
RG ll mid=(l+r)>>;
build(ls,l,mid),build(rs,mid+,r);
merge(x,l,r); return;
} il void update(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll v){
if (xl<=l && r<=xr){ add(x,l,r,v); return; } RG ll mid=(l+r)>>;
if (xr<=mid) update(ls,l,mid,xl,xr,v);
else if (xl>mid) update(rs,mid+,r,xl,xr,v);
else update(ls,l,mid,xl,mid,v),update(rs,mid+,r,mid+,xr,v);
merge(x,l,r); return;
} il void Sqrt(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll la){
if (xl<=l && r<=xr){
if (mn[x]==mx[x]){
RG ll del=mx[x]+la-(ll)sqrt(mx[x]+la);
add(x,l,r,-del); return;
} else{
RG ll s1=(ll)sqrt(mn[x]+la),s2=(ll)sqrt(mx[x]+la);
if (mn[x]+==mx[x] && s1+==s2){
RG ll del=mx[x]+la-s2;
add(x,l,r,-del); return;
}
}
}
RG ll mid=(l+r)>>; la+=lazy[x];
if (xr<=mid) Sqrt(ls,l,mid,xl,xr,la);
else if (xl>mid) Sqrt(rs,mid+,r,xl,xr,la);
else Sqrt(ls,l,mid,xl,mid,la),Sqrt(rs,mid+,r,mid+,xr,la);
merge(x,l,r); return;
} il ll query(RG ll x,RG ll l,RG ll r,RG ll xl,RG ll xr,RG ll la){
if (xl<=l && r<=xr) return sum[x]+(r-l+)*la;
RG ll mid=(l+r)>>; la+=lazy[x];
if (xr<=mid) return query(ls,l,mid,xl,xr,la);
else if (xl>mid) return query(rs,mid+,r,xl,xr,la);
else return query(ls,l,mid,xl,mid,la)+query(rs,mid+,r,mid+,xr,la);
} il void work(){
n=gi(),m=gi(); for (RG ll i=;i<=n;++i) a[i]=gi(); build(,,n);
for (RG ll i=,type,l,r,x;i<=m;++i){
type=gi();
if (type==) l=gi(),r=gi(),x=gi(),update(,,n,l,r,x);
if (type==) l=gi(),r=gi(),Sqrt(,,n,l,r,);
if (type==) l=gi(),r=gi(),printf("%lld\n",query(,,n,l,r,));
}
return;
} int main(){
File("standard");
work();
return ;
}

uoj#228 基础数据结构练习题的更多相关文章

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

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

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

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

  3. uoj#228. 基础数据结构练习题(线段树区间开方)

    题目链接:http://uoj.ac/problem/228 代码:(先开个坑在这个地方) #include<bits/stdc++.h> using namespace std; ; l ...

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

    传送门 只有区间加区间开方我都会--然而加在一起我就gg了-- 然后这题的做法就是对于区间加直接打标记,对于区间开方,如果这个区间的最大值等于最小值就直接区间覆盖(据ljh_2000大佬说这个区间覆盖 ...

  5. UOJ #228. 基础数据结构练习题 线段树 + 均摊分析 + 神题

    题目链接 一个数被开方 #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",st ...

  6. UOJ #228 - 基础数据结构练习题(势能线段树+复杂度分析)

    题面传送门 神仙题. 乍一看和经典题 花神游历各国有一点像,只不过多了一个区间加操作.不过多了这个区间加操作就无法再像花神游历各国那样暴力开根直到最小值为 \(1\) 为止的做法了,稍微感性理解一下即 ...

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

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

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

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

  9. 【UOJ#228】 基础数据结构练习题

    题目描述 sylvia 是一个热爱学习的女孩子,今天她想要学习数据结构技巧. 在看了一些博客学了一些姿势后,她想要找一些数据结构题来练练手.于是她的好朋友九条可怜酱给她出了一道题. 给出一个长度为 n ...

随机推荐

  1. 通过git提交代码到仓库

    昨天有一个妹子问我如何在还没有commit之前push本地的代码到仓库,现在写写,希望能够帮到大家. 当我们pull的时候会出现没有代码commit的错误提示,在这种情况下,我们需要再commit之前 ...

  2. C 风格字符串相加

    <<C++ Primer>> 第四版Exercise Section 4.3.1 的4.3.0 有如下题目:编写程序连接两个C风格字符串字面值,把结果存储在C风格字符串中.代码 ...

  3. 【常见踩坑】USB调试安装失败(Installation failed with message INSTALL_CANCELED_BY_USER)

    一.写在前面 最近一直在忙活着项目重构,忙活了一个多月(那是天天加班,不分昼夜呀,ps:这不是我司要求的哈),终于把沉积了三四年的老项目给重构了,目前在测试阶段,也总算有了点闲时来跟大家分享分享一些问 ...

  4. solr query的post方式

    众所周知, solr 是通过 GET 方式来进行查询的. 那么solr 是否支持POST 方式进行查询呢? 通过一番调研,发现SOLR其实是支持POST方式进行查询的. 方式为: 使用form 方式提 ...

  5. mysql新建数据库时的collation选择(转)

    转自别处的文章.末尾附原文链接 mysql的collation大致的意思就是字符序.首先字符本来是不分大小的,那么对字符的>, = , < 操作就需要有个字符序的规则.collation做 ...

  6. C#实现不影响当前线程情况下间隔一定的时间执行一段代码

    大家知道C#间隔一定时间去执行一段代码,常用的有 1. Thread.Sleep(多少毫秒); 2. 使用Timer控件间隔一定的时间,设置执行一次 以上两种方法,实现起来不难,弊端在于会阻塞当前线程 ...

  7. Java web的几种异常处理 (转)

    一.在servlet容器中处理异常 以下两种方式: 1. 在web.xml定义异常处理  如果没有在web的应用中作异常处理,那么异常就会抛给Servlet容器,应该说此时Servlet容器是处理异常 ...

  8. SQL Server 给表和字段添加说明

    .添加表说明 EXECUTE sp_addextendedproperty N'MS_Description','表说明',N'user',N'dbo',N'table',N'表名',NULL,NUL ...

  9. 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结

    老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...

  10. 《JavaScript程序设计》第2课:JS类型系统

    JS类型系统可以分为标准类型和对象类型,进一步标准类型又可以分为原始类型和引用类型,而对象类型又可以分为内置对象类型.普通对象类型.自定义对象类型. 1. 标准类型 标准类型共包括了6个分别是:und ...