题面

众所周知,这是一道小清新线段树

然而可以用树状数组水过去且跑得飞快

看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护

所以考虑暴力循环单点修改->T飞

于是我们关注一下开方本身的特殊性

我们知道,如果每次向下取整,一个数经过多次操作最终会变成1(或0)

事实上,大概经过 log(logx)次就会变成1

这是什么概念呢?经过博主测试,1e9只要经过五次开方取整就会变成1

那么接下来就能够利用1每次不必再操作优化复杂度

可以维护一个类似链表的结构,指向下一个>1的数,用并查集维护

并查集+树状数组这两种常数极小的结构组合起来简直快的飞起:

蒟蒻第一次上榜有点激动Orz

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;const int L=1<<20|1;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)typedef long long ll;
const int N=100005;
ll c[N];
int n,m,data[N],fa[N];
inline int read()
{int f=1,x=0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
int lb(int x){return x&-x;}
int findf(int x)
{if(x==fa[x])return x;fa[x]=findf(fa[x]);return fa[x];
}
void update(int p,int v)
{while(p<=n)c[p]+=v,p+=lb(p);
}
ll sum(int p)
{ll res=0;while(p)res+=c[p],p-=lb(p);return res;
}
int main()
{n=read();for(int i=1;i<=n;i++)data[i]=read(),update(i,data[i]);m=read();for(int i=1;i<=n;i++)fa[i]=data[i]<=1?i+1:i;fa[n+1]=n+1;while(m--){int op=read(),l=read(),r=read();if(op==1)printf("%lld\n",sum(r)-sum(l-1));else if(op==2)for(int i=l;i<=r;i=findf(i+1)){int sqt=(int)sqrt(data[i]);update(i,sqt-data[i]),data[i]=sqt;    if(data[i]<=1)fa[i]=findf(i+1);}}return 0;
}

View Code

转载于:https://www.cnblogs.com/Rorschach-XR/p/11008046.html

花神游历各国 题解(小清新线段树/树状数组+并查集)相关推荐

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

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

  2. hdu 6200 mustedge mustedge mustedge(dfs序+树状数组+并查集)

    题目链接:hdu 6200 mustedge mustedge mustedge 题意: 一开始给你一个有n个节点m条无向边的图,现在定义mustedge为u->v的路径上必须经过的边. 现在有 ...

  3. POJ-2985(树状数组 + 并查集 + 二分)

    题目:http://poj.org/problem?id=2985 这题考察了两个点呢,组合并用到了并查集,求第K大的数用到了树状数组,刚开始WA了几次,发现是在组合并之后仅仅update(*, -1 ...

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

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

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

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

  6. 3211: 花神游历各国

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

  7. BZOJ3211: 花神游历各国

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

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

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

  9. 数据结构之树的应用:并查集

    树的应用:并查集 并查集的概念: 三种基本操作: 例: 代码实现: 并查集的概念: 将所有的数据元素放在一个集合中,将集合分成若干个互不相交的子集,每一个子集对应一颗树,所有的自己组成森林. 三种基本 ...

最新文章

  1. python网站开发实例-【9】Python接口开发:flask Demo实例
  2. 远程桌面上的文件复制到本地
  3. 循环队列及C语言实现二
  4. 三场直播丨达梦DM8数据库体系结构、从零快速搭建一整套监控体系、Oracle Database Server经典体系结构...
  5. Tokyo Tyrant (ttserver)的master-slave复制协议分析
  6. Wannafly挑战赛14 F
  7. 域名访问html乱码,显示地址和域名解析时出现乱码
  8. 强大的火狐插件(转)
  9. CFDA发布GMP《计算机化系统和确认与验证》两个附录
  10. 在线生成 html 页面,细说在线版H5页面生成器
  11. 还没毕业,我就进了HR的黑名单!
  12. opencv实现阈值分割算法和分水岭算法
  13. 嵌入式开发工程师需要掌握哪些知识呢?
  14. 不要在意FIl短期,FIl未来价值可期
  15. RMON学习笔记(二)
  16. 百度AI语音SDK集成
  17. 【JavaScript】Interview必背(详细版)
  18. R语言计算KS值、绘制KS曲线
  19. BCG ribbon在对话框中使用
  20. RT-thread基础移植//依据rtt实战学习记录

热门文章

  1. python标准库导入语句有哪些_如何将python标准库缺失的进行导入?
  2. java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
  3. finereport连接oracle_FINEREPORT连接远程ORACLE数据库
  4. sql server修改字段编码格式_原理:一条 sql 的执行过程详解
  5. Java开发面试问题,Jsoup解析html
  6. java线程池队列场景,Java面试题汇总
  7. 【PAT (Advanced Level) Practice】1002 A+B for Polynomials (25 分)
  8. 【Java Web开发指南】Java插入中文到数据库中文变成问号解决
  9. python【力扣LeetCode算法题库】1248- 统计「优美子数组」
  10. python【蓝桥杯vip练习题库】ALGO-190素因子去重(数论 递归)