花神游历各国 题解(小清新线段树/树状数组+并查集)
题面
众所周知,这是一道小清新线段树
然而可以用树状数组水过去且跑得飞快
看到区间开方第一反应肯定是线段树懒标记区间修改之类的,但是这个东西似乎确凿不可维护
所以考虑暴力循环单点修改->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
花神游历各国 题解(小清新线段树/树状数组+并查集)相关推荐
- ybt.1550 花神游历各国 题解
[题目描述] 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家). 每一次 ...
- hdu 6200 mustedge mustedge mustedge(dfs序+树状数组+并查集)
题目链接:hdu 6200 mustedge mustedge mustedge 题意: 一开始给你一个有n个节点m条无向边的图,现在定义mustedge为u->v的路径上必须经过的边. 现在有 ...
- POJ-2985(树状数组 + 并查集 + 二分)
题目:http://poj.org/problem?id=2985 这题考察了两个点呢,组合并用到了并查集,求第K大的数用到了树状数组,刚开始WA了几次,发现是在组合并之后仅仅update(*, -1 ...
- [BZOJ3211] 花神游历各国 - 线段树
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 4766 Solved: 1741 [Submit][Status][Dis ...
- 【luogu4145】 上帝造题的七分钟2 / 花神游历各国 [线段树]
P4145 上帝造题的七分钟2 / 花神游历各国 把一段区间里的每个数都开方 求区间和 可以发现最多开方开6次就能都变为1 所以可以hei暴力地一个点一个点地改 具体操作我用的和buildtree差不 ...
- 3211: 花神游历各国
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 1042 Solved: 381 [Submit][Status] Desc ...
- BZOJ3211: 花神游历各国
BZOJ3211: 花神游历各国 Description Input Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 ...
- bzoj 3211: 花神游历各国 bzoj 3038: 上帝造题的七分钟2
3211: 花神游历各国 Time Limit: 5 Sec Memory Limit: 128 MB Submit: 3438 Solved: 1277 [Submit][Status][Dis ...
- 数据结构之树的应用:并查集
树的应用:并查集 并查集的概念: 三种基本操作: 例: 代码实现: 并查集的概念: 将所有的数据元素放在一个集合中,将集合分成若干个互不相交的子集,每一个子集对应一颗树,所有的自己组成森林. 三种基本 ...
最新文章
- python网站开发实例-【9】Python接口开发:flask Demo实例
- 远程桌面上的文件复制到本地
- 循环队列及C语言实现二
- 三场直播丨达梦DM8数据库体系结构、从零快速搭建一整套监控体系、Oracle Database Server经典体系结构...
- Tokyo Tyrant (ttserver)的master-slave复制协议分析
- Wannafly挑战赛14 F
- 域名访问html乱码,显示地址和域名解析时出现乱码
- 强大的火狐插件(转)
- CFDA发布GMP《计算机化系统和确认与验证》两个附录
- 在线生成 html 页面,细说在线版H5页面生成器
- 还没毕业,我就进了HR的黑名单!
- opencv实现阈值分割算法和分水岭算法
- 嵌入式开发工程师需要掌握哪些知识呢?
- 不要在意FIl短期,FIl未来价值可期
- RMON学习笔记(二)
- 百度AI语音SDK集成
- 【JavaScript】Interview必背(详细版)
- R语言计算KS值、绘制KS曲线
- BCG ribbon在对话框中使用
- RT-thread基础移植//依据rtt实战学习记录
热门文章
- python标准库导入语句有哪些_如何将python标准库缺失的进行导入?
- java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
- finereport连接oracle_FINEREPORT连接远程ORACLE数据库
- sql server修改字段编码格式_原理:一条 sql 的执行过程详解
- Java开发面试问题,Jsoup解析html
- java线程池队列场景,Java面试题汇总
- 【PAT (Advanced Level) Practice】1002 A+B for Polynomials (25 分)
- 【Java Web开发指南】Java插入中文到数据库中文变成问号解决
- python【力扣LeetCode算法题库】1248- 统计「优美子数组」
- python【蓝桥杯vip练习题库】ALGO-190素因子去重(数论 递归)