试题描述
花仔喜欢步行游历各国,花仔有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花仔对每个国家都有一个喜欢度(当然花仔并不一定喜欢所有国家),每一次旅行中,花仔会选择一条旅游路线,它在那一串国家中是连续的一段,这次旅行带来的开心值是这些国家的喜欢度的总和,当然花仔对这些国家的喜欢程序并不是恒定的,有时会突然对某些国家产生反感,使他对这些国家的喜欢度delta变为√​delta,也就是开根号。现在给出花仔每次的旅行路线,以及开心度的变化,请求出花仔每次旅行的开心值。
输入
第一行是一个整数 N,表示有 N 个国家。
第二行有 N 个空格隔开的整数,表示每个国家的初始喜欢度delta[i]。
第三行是一个整数 M,表示有 M 条信息要处理。
第四行到最后,每行3个整数 x,l,r(l≤r),当x=1 时,询问游历国家 l 到 r 的开心值总和,也就是 ∑i=l→r delta[i];当x=2时,修改国家 l 到 r 中每个国家的喜欢度,delta=√​delta​​​。
注:建议使用 sqrt 函数,且向下取整。
输出
每次 x=1 时,每行一个整数。表示这次旅行的开心度。
输入示例
4
1 100 5 5
5
1 1 2
2 1 2
1 1 2
2 2 3
1 1 4
输出示例
101
11
11
其他说明
对于100%的数据,n≤10^5,m≤2×10^5,0≤delta[i]<10^9。

可以说是个线段树的板子了

难度是在如何维护根号上,我们可以将开根操作转换为减法

即x=x-(x-sqrt(x))

因为数据范围很大,所以我们不能一个一个修改,但是判断条件要变一下,只有在修改范围内并且与其sqrt的差相同的才能同时修改

最后一点就是要开long long,但是不能开太多,可能会T

下面给出代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
inline int rd(){int x=0,f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';return x*f;
}
inline void write(long long x){if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');return ;
}
struct node{int l,r;long long maxn,minn;long long sum;int f;
}tree[400006];
int n,m;
void build(int i,int x,int y){tree[i].l=x,tree[i].r=y;if(x==y){tree[i].maxn=rd();tree[i].sum=tree[i].minn=tree[i].maxn;return ;}int mid=(x+y)>>1;build(i*2,x,mid);build(i*2+1,mid+1,y);tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);tree[i].minn=min(tree[i*2].minn,tree[i*2+1].minn);return ;
}
void pushdown(int x){if(!tree[x].f) return ;int h=tree[x].f;tree[x*2].f+=h,tree[x*2+1].f+=h;tree[x*2].sum-=(tree[x*2].r-tree[x*2].l+1)*h,tree[x*2+1].sum-=(tree[x*2+1].r-tree[x*2+1].l+1)*h;tree[x*2].maxn-=h,tree[x*2+1].maxn-=h,tree[x*2].minn-=h,tree[x*2+1].minn-=h;tree[x].f=0;return ;
}
void extract_a_root(int i,int x,int y){if(tree[i].l>=x&&tree[i].r<=y&&(tree[i].maxn-(long long)sqrt(tree[i].maxn))==(tree[i].minn-(long long)sqrt(tree[i].minn))){int h=tree[i].minn-(int)sqrt(tree[i].minn);tree[i].f+=h;tree[i].sum-=((tree[i].r-tree[i].l+1)*h);tree[i].maxn-=h;tree[i].minn-=h;return ;}if(tree[i].l>y||tree[i].r<x) return ;pushdown(i);if(tree[i*2].r>=x) extract_a_root(i*2,x,y);if(tree[i*2+1].l<=y) extract_a_root(i*2+1,x,y);tree[i].sum=tree[i*2].sum+tree[i*2+1].sum;tree[i].maxn=max(tree[i*2].maxn,tree[i*2+1].maxn);tree[i].minn=min(tree[i*2].minn,tree[i*2+1].minn);return ;
}
long long solve(int i,int x,int y){if(tree[i].l>=x&&tree[i].r<=y) return tree[i].sum;if(tree[i].l>y||tree[i].r<x) return 0;pushdown(i);long long num=0;if(tree[i*2].r>=x) num+=solve(i*2,x,y);if(tree[i*2+1].l<=y) num+=solve(i*2+1,x,y);return num;
}
int main(){n=rd();build(1,1,n);m=rd();for(int i=1;i<=m;i++){int f=rd(),x=rd(),y=rd();if(f==2) extract_a_root(1,x,y);if(f==1) write(solve(1,x,y)),puts("");}return 0;
}

转载于:https://www.cnblogs.com/WWHHTT/p/9799965.html

bzoj3211花神游历各国相关推荐

  1. BZOJ3211: 花神游历各国

    BZOJ3211: 花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 ...

  2. [BZOJ3211] 花神游历各国 - 线段树

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 4766  Solved: 1741 [Submit][Status][Dis ...

  3. BZOJ3211 花神游历各国

    题目蓝链 Solution 由于每一个数最多被开根\(5\)次就会为\(1\),所以我们可以用一个并查集维护下一个大于\(1\)的数的位置.然后再用树状数组维护一下区间和,每次修改直接暴力改就行了,修 ...

  4. 3211: 花神游历各国

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 1042  Solved: 381 [Submit][Status] Desc ...

  5. bzoj 3211: 花神游历各国 bzoj 3038: 上帝造题的七分钟2

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 3438  Solved: 1277 [Submit][Status][Dis ...

  6. 【luogu4145】 上帝造题的七分钟2 / 花神游历各国 [线段树]

    P4145 上帝造题的七分钟2 / 花神游历各国 把一段区间里的每个数都开方 求区间和 可以发现最多开方开6次就能都变为1 所以可以hei暴力地一个点一个点地改 具体操作我用的和buildtree差不 ...

  7. 1550:花神游历各国

    [题目描述] 原题来自:BZOJ 3211 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并 ...

  8. ybt.1550 花神游历各国 题解

    [题目描述] 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家). 每一次 ...

  9. 1276. 花神游历各国

    花神喜欢步行游历各国,顺便虐爆各地竞赛. 花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家). 每一次旅行中,花神 ...

最新文章

  1. 魔豆路由工程版体验:智能路由脱离手机的尝试
  2. 网上报名的一些感慨.
  3. JSP简单练习-获取表单数据
  4. 荣耀鸿蒙系统内测,官宣!荣耀 Magic UI 4.0 与 EMUI 11 同步内测:后续支持升级为鸿蒙操作系统...
  5. ActiveMQ, RabbitMQ和ZeroMQ 选型关注点
  6. 学python需要什么基础-要学 Python 需要怎样的基础?
  7. 如何在线查看.mmap格式文件
  8. c语言程序无法正常运行怎么办,win7系统运行软件提示应用程序无法正常启动0xc000005怎么办...
  9. 不要再被骗了------QQ盗号原理大揭秘
  10. 程序员开发常用英语词汇汇总,满满的干货!
  11. Unraid配置阿里云加速镜像安装荒野无灯qBittorrent镜像
  12. RMAN备份恢复性能优化--MAXSETSIZE, MAXPIECESIZE, FILESPERSET, SECTION SIZE等
  13. 【离散数学】群、环和域的关系
  14. PhotoSwipe 官方API解读(一)
  15. 期货手续费标准和保证金比例
  16. 图片base64转码,本地和网络图片均可,类对象转map,类对象转键值对字符串
  17. 如何在网站左侧和右侧的漂浮图片上添加QQ咨询、旺旺、微博、电话?
  18. 二分搜索树--二叉树
  19. Nacos 基础知识
  20. Android RecyclerView实现图片自适应高度的瀑布流

热门文章

  1. uniapp开发app实现支付语音播报功能
  2. 关于母亲节的c语言程序设计,编程人员对母亲的祝福
  3. c语言表单文件上传,requests实现文件上传(对应postman form-data)
  4. (附源码)计算机毕业设计ssm宠物短期寄养平台
  5. 干翻Dubbo系列第二篇:Dubbo3相对其他版本的升级
  6. 转炉流程轴承钢技术的开发是轴承钢的冶炼时间缩短
  7. TI C28x DSP的中断嵌套
  8. Java 异常处理 try catch
  9. 设计模式之Proxy模式(笔记)
  10. crm系统不断提升客户忠诚度