[ CodeVS冲杯之路 ] P2492
不充钱,你怎么AC?
题目:http://codevs.cn/problem/2492/
在此先orz小胖子,教我怎么路径压缩链表,那么这样就可以在任意节点跳进链表啦(手动@LCF)
对于查询操作,直接树状数组(以下简称BIT)维护,修改操作就一个个暴力开方搞,再用差值单点更新BIT
不过这样会TLE,要加一点优化对不对,正如开头所说的路径压缩链表
路径压缩链表其实就是个并查集,在普通的链表里,删去两个连续的节点后会是下面这种情况,如删去2,3

当访问 2 的时候,会跳到3,但 3 已经删除了,这就不合法了
于是我们要用路径压缩,搞成下面这种情况

它是不是非常优秀,就按照并查集一样实现,具体参考代码
那么我们想,为什么要搞链表呢?修改的时候直接暴力扫不就行了?
显然 sqrt(1)=1,那么对于 1 的操作不就是无用功?那么记录下来 1 的位置,然后用链表在扫的时候把它跳转掉,因为区间可以是中间的一段,所以要用路径压缩
记得开long long,然后数组多开 1 个,因为若 r 为极限数据,那么跳到最后一个还会往后面跳一个,没开大的话会RE(反正多开一点好一些),记得链表的 f[n+1]=n+1 也要赋值
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
typedef long long LL;
using namespace std; const int N=;
LL a[N],s[N];
int f[N],n;
namespace QuQ
{
inline int lowbit(int x)
{
return x&-x;
}
inline void plus(int x,LL k)
{
while (x<=n)
{
a[x]+=k;
x+=lowbit(x);
}
}
inline LL sum(int x)
{
LL k=;
while (x)
{
k+=a[x];
x-=lowbit(x);
}
return k;
}
}
namespace OvO
{
inline LL read()
{
char ch=getchar();
LL k=;
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='')
{
k=k*+ch-'';
ch=getchar();
}
return k;
}
inline void write(LL x)
{
if (x>) write(x/);
putchar(x%+'');
}
}
inline int find(int x)
{
return f[x]==x?x:f[x]=find(f[x]);
}
int main()
{
int m,i,l,r;
LL x;
n=OvO::read();
for (i=;i<=n;i++)
{
s[i]=OvO::read();
QuQ::plus(i,s[i]);
f[i]=i;
}
f[n+]=n+;
m=OvO::read();
while (m--)
{
x=OvO::read();
l=OvO::read();
r=OvO::read();
if (l>r) swap(l,r);
if (x)
{
OvO::write(QuQ::sum(r)-QuQ::sum(l-));
putchar('\n');
}
else for (l=find(l);l<=r;l=find(l+))
{
x=s[l];
x-=s[l]=sqrt(s[l]);
if (s[l]==) f[l]=find(l+);
QuQ::plus(l,-x);
}
}
return ;
}
[ CodeVS冲杯之路 ] P2492的更多相关文章
- [ CodeVS冲杯之路 ] P1368
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1368/ 嗯……泡泡堂,很劲啊,其实就是个盗版的田忌赛马 http://www.cnblogs.com/hyfer/p/ ...
- [ CodeVS冲杯之路 ] P1092
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1092/ 嗯,这道题有一定难度啊,需要先用扩展欧几里得算法求出逆元,然后按照大小构一颗带边权为小时数的树 树链剖分后在树 ...
- [ CodeVS冲杯之路 ] P3955
不充钱,你怎么AC? 题目:http://codevs.cn/problem/3955/ 最长上升子序列的加强版,n 有1000000,n 方的 DP 肯定会 TLE,那么用二分栈维护 二分栈我讲不好 ...
- [ CodeVS冲杯之路 ] P1165
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1165/ 题目很简单,代码最好写朴实一点,不要想着哪些情况可以合并在一起啊等等 老老实实一个个判断,不然很容易出错 细节 ...
- [ CodeVS冲杯之路 ] P1053
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1053/ 直接扫一遍串,把字母对应的 ascii 码直接做数组下标,交给数组统计 最后查询一遍数组的 'a'-'z' , ...
- [ CodeVS冲杯之路 ] P1171
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1171/ 代码调了很久才调好啊,一开始题目都看错了(要是真的NOIP肯定没戏了QuQ) 后面发现CodeVS上的数据输入 ...
- [ CodeVS冲杯之路 ] P1197
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1197/ 密钥的字母可以全转换为小写字母,然后一一映射,a→0,b→1,c→2,依此类推 对于密文只需将每一位减去对应密 ...
- [ CodeVS冲杯之路 ] P2456
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2456/ 用贪心的思想,木材当然要尽量分成多的木板,而大的木材能够分成大木板,但是小的木材不一定能够分成大的木板,所以木 ...
- [ CodeVS冲杯之路 ] P2952
不充钱,你怎么AC? 题目:http://codevs.cn/problem/2952/ 题目讲一个细胞可分裂成 2 个,那么当前数目就是2a,a 为时间 然后 q 个细胞一起会死亡,也就是对 q 取 ...
随机推荐
- [转]使用Gradle管理你的Android Studio工程
本文转自:http://www.flysnow.org/2015/03/30/manage-your-android-project-with-gradle.html Gradle简介 Gradle ...
- 21天学习caffe(一)
ubuntu环境安装caffe1 安装依赖 apt-get install libatlas-base-dev apt-get install python-dev apt-get install l ...
- Python 3 学习笔记之——面向对象
1. 类的介绍 类(Class) 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例,类是对象的抽象. 方法:类中定义的函数. 类变量:类变量在整个实 ...
- 分词(Tokenization) - NLP学习(1)
自从开始使用Python做深度学习的相关项目时,大部分时候或者说基本都是在研究图像处理与分析方面,但是找工作反而碰到了很多关于自然语言处理(natural language processing: N ...
- PyQt5图像全屏显示
Windows装这个:https://pypi.python.org/pypi/PyQt5Ubuntu输入这个:sudo apt-get install python3-pyqt5 或者直接输入:pi ...
- C#故事
C# 在腾讯的发展 <先定个小目标, 使用C# 开发的千万级应用> Xamarin 携程使用.Net技术 分布式高并发redis MQ dubbo kafka zookeeper
- 健康领域今年开始井喷了,养老地产和私人医生这两个领域目测成为下一轮BAT在健康领域布局的竞争方向
医疗行业做了六年多的时间,今年到了井喷的阶段,腾讯先是入股了丁香园,然后又一亿美金融资挂号网,春雨医生获得5000万美元的C轮融资,这是要上市的节奏.. 从互联网战略上,健康网和医疗网都是做资料刚开始 ...
- 【原创】Sagger使用
Swagger使用 1. Spring MVC配置文件中的配置 <mvc:annotation-driven/> <context:component-scan base-packa ...
- redis-20180118
1.redis hash 100% 2.redis list 100% 3.redis sentinel 20%
- JavaScript中的String对象详解
1.属性 String对象最常用的属性是length,用于返回字符串对象的长度. 2.方法 CharAt(index) 返回字符串对象中指定索引号组成的字符串,位置的有效值为0到字符串的长度减1. ...