[ 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 取 ...
随机推荐
- (原)Android到IOS开发的转换(一)
序)闲扯几句 很早就想入手ios开发,但是一直没有机会,个人没有水果机器,上个公司上班的那台mac mini虽然就在我身边,灰都有一层了,但是一直没有机会开机学习下,因为事多,自上一篇文章后,离职后, ...
- hdu1505City Game(动态规划)
City Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- 安装QC的心(新)路历程 纯记录 无技术
之前就只是看来软件测试原书第二版学习力理论知识,关于书中提到的缺陷管理工具,测试管理工具等也没有亲自去安装使用,感觉太不应该了.于是我就上网了解了一些测试管理工具后,决定先选择QC来学习.说实话,当初 ...
- vue路由文档笔记
引入router this.$router 和 router 使用起来完全一样.我们使用 this.$router 的原因是我们并不想在每个独立需要封装路由的组件中都导入路由 可以在任何组件内通过 t ...
- tp5 项目实战 初级 文字步骤
项目实战 环境搭建 新建模块 admin 新建文件夹 controller model view View 中新建 user index 相关样式 js 图片 放入publ ...
- 1087 All Roads Lead to Rome (30 分)(最短路径)
直接用Dijkstra做 #include<bits/stdc++.h> using namespace std; int n,m; map<string,int>si; ma ...
- 解决jQuery load()加载GB2312页面时出现乱码
jquery的字符集是utf-8,load方法加载完GB2312编码静态页面后,出现中文乱码. 这是jQueryAJAX.html <!DOCTYPE html PUBLIC "-// ...
- 计蒜客16495 Truefriend(fwt)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...
- 【题解】HNOI2009无归岛
这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环 ...
- [CF912B]New Year's Eve
题意:在1~n中选不超过m个数,求其异或最大值 题解:经过找规律发现如果m为1,输出n,不然输出最小的不超过n的2^k-1 C++ Code: #include<cstdio> using ...