0x42 数据结构进阶-树状数组
A题 楼兰图腾
链接:https://ac.nowcoder.com/acm/contest/1032/A
树状数组 + 逆序对
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
typedef long long ll;
const int maxn = 2e5 + 10;
int a[maxn], c[maxn], l[maxn], r[maxn], n;
void update(int p, int val) {
while (p <= n) {
c[p] += val;
p += lowbit(p);
}
}
int ask(int x) {
int res = 0;
while (x > 0) {
res += c[x];
x -= lowbit(x);
}
return res;
}
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
//求正序,前面有几个比a[i]大
for (int i = 1; i <= n; i++) {
update(a[i], 1);
l[i] = ask(a[i] - 1);
}
memset(c, 0, sizeof c);
//树状数组清零求逆序,后面有几个比a[i]大
for (int i = n; i >= 1; i--) {
update(a[i], 1);
r[i] = ask(a[i] - 1);
}
ll ans = 0;
//依次枚举每个点作为中间点,以该点位中心的 ‘v’ 个数显然是 left[i] * right[i]
for (int i = 2; i <= n - 1; i++) {
ans += 1ll * (i - l[i] - 1) * (n - i - r[i]);
}
cout << ans << " ";
ans = 0;
//同理枚举 '^'的个数
for (int i = 2; i <= n - 1; i++) {
ans += 1ll * l[i] * r[i];
}
cout << ans << endl;
return 0;
}
B题 A Tiny Problem with intergers
链接:https://ac.nowcoder.com/acm/contest/1032/B
树状数组 区间修改 + 单点查询
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
typedef long long ll;
const int maxn = 1e5 + 10;
int tr[maxn], n, q, a, pre;
void add(int i, int v) {
while (i <= n) {
tr[i] += v;
i += lowbit(i);
}
}
int getsum(int x) {
int res = 0;
while (x) {
res += tr[x];
x -= lowbit(x);
}
return res;
}
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; ++i)cin >> a, add(i, a - pre), pre = a;
char c; int u, v, a;
while (q--) {
cin >> c >> u;
if (c == 'C') {
cin >> v >> a; add(u, a), add(v + 1, - a);
}
else
cout << getsum(u) << endl;
}
}
C题 A Simple Problem with Integers
链接:https://ac.nowcoder.com/acm/contest/1032/C
树状数组 区间修改 + 区间查询 / (线段树 or 分块)
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) (x & -x)
typedef long long ll;
const int maxn = 1e5 + 10;
ll n, q, tr1[maxn], tr2[maxn], a, pre;
void add(int x, int v) {
for (int i = x; i <= n; i += lowbit(i)) tr1[i] += v, tr2[i] += 1ll * v * (x - 1);
}
ll getsum(int x) {
long long sum = 0;
for (int i = x; i; i -= lowbit(i)) sum += tr1[i] * x - tr2[i];
return sum;
}
int main() {
//freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0);
cin >> n >> q;
for (int i = 1; i <= n; i++) cin >> a, add(i, a - pre), pre = a;
char c; int u, v, a;
while (q--) {
cin >> c >> u >> v;
if (c == 'C') {
cin >> a; add(u, a), add(v + 1, - a);
}
else
cout << getsum(v) - getsum(u - 1) << endl;
}
}
D题 Lost Cows
链接:https://ac.nowcoder.com/acm/contest/1032/D
树状数组 + 二分(or倍增)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
long long tr[maxn];
void add(int x, int v){
if (x == 0) return;
while (x < maxn) {
tr[x] += v;
x += x & -x;
}
}
long long query(int x){
long long rec = 0;
while (x) {
rec += tr[x];
x -= x & -x;
}
return rec;
}
int a[maxn], ans[maxn];
int main(){
freopen("in.txt", "r", stdin);
int n; scanf("%d", &n);
for (int i = 2; i <= n; i++)
scanf("%d", &a[i]);
//二分,查询前mid个数有多少1比较,更新区间
for (int i = n; i; i--) {
int l = 1, r = n + 1, t;
while (l <= r) {
int mid = l + r >> 1;
if (query(mid) + a[i] < mid) t = mid, r = mid - 1;
else l = mid + 1;
}
ans[i] = t;
add(t, 1);
}
for (int i = 1; i <= n; i++)
printf("%d\n", ans[i]);
}
0x42 数据结构进阶-树状数组的更多相关文章
- Codeforces Round #248 (Div. 2) B称号 【数据结构:树状数组】
主题链接:http://codeforces.com/contest/433/problem/B 题目大意:给n(1 ≤ n ≤ 105)个数据(1 ≤ vi ≤ 109),当中有m(1 ≤ m ≤ ...
- [ACM_数据结构] POJ2352 [树状数组稍微变形]
Description Astronomers often examine star maps where stars are represented by points on a plane and ...
- 数据结构(树状数组):HEOI2012 采花
[题目描述] 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便 ...
- 【poj 3167】Cow Patterns(字符串--KMP匹配+数据结构--树状数组)
题意:给2个数字序列 a 和 b ,问按从小到达排序后,a中的哪些子串与b的名次匹配. a 的长度 N≤100,000,b的长度 M≤25,000,数字的大小 K≤25. 解法:[思考]1.X 暴力. ...
- 牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)
链接:E.简单数据结构1 题意: 给一个长为n的序列,m次操作,每次操作: 1.区间加 2.对于区间,查询 ,一直到- 请注意每次的模数不同. 题解:扩展欧拉定理降幂 对一个数p取log(p)次的 ...
- ACM数据结构-树状数组
模板: int n; int tree[LEN]; int lowbit(int x){ return x&-x; } void update(int i,int d){//index,del ...
- NOIp 数据结构专题总结 (2):分块、树状数组、线段树
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) 分块 阅:<「分块」数列分块入门 1-9 by hzwer> 树状数组 Binary Indexed T ...
- 【洛谷 p3374】模板-树状数组 1(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某一个数加上x:2.求出某区间每一个数的和. 解法:树状数组求前缀和. #include<cstdio> #include<cstd ...
- 【洛谷 p3368】模板-树状数组 2(数据结构)
题目:已知一个数列,你需要进行下面两种操作:1.将某区间每一个数数加上x:2.求出某一个数的和. 解法:树状数组+前缀和优化.数组中每位存和前一位的数的差,这样区间修改只用改两位,单点询问就是求前缀和 ...
- 数据结构--树状数组(黑龙江省第八届大学生程序设计竞赛--post office)
例题来源: 题目: 1468: Post office 题目描述 There are N(N<=1000) villages along a straight road, numbered fr ...
随机推荐
- 【学到一个新名词】String interning(字符串驻留/字符串内部化)
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 在阅读 VictoriaMetrics v1.95.1 的 ...
- Linux机器自建账号并赋予sudo权限,同时修改远程端口
默认使用root账号来操作Linux有一定风险,因此需要自建账号并赋予sudo权限,方便使用 登录为root用户后,创建账号 adduser <username> Ubuntu系统会同时要 ...
- c#|创建一个简单的窗体项目
- 【Javaweb】做一个房产信息管理系统三(src目录的部署工作【三层框架】各个层含义)
接下来,我打算进行Java文件的部署工作,但实际上为了得到更多的分数,我们还是应该先做页面 首先我们需要了解对于Javaweb,src下的目录应该如何部署:(三层架构单独开一篇讲) 那么这些都有什么含 ...
- preparedStatement.setObject()为什么要这样写?
setObject就是给JDBC的SQL语句的占位符赋值的,即是下面的"?" 预编译的SQL:参数使用?作为占位符 注意:sql的参数使用?作为占位符. 如: select * f ...
- STM32外设:串行通信 USART、I2C、SPI
USART:Universal Synchronous Asynchronous Receiver Transmitter 通用同步异步接收发送器 UART:异步中断 主要功能:接收指定长度的帧 数据 ...
- [ABC284G] Only Once
Problem Statement For a sequence of length $N$, $A = (A_1,A_2,\dots,A_N)$, consisting of integers be ...
- MongoDB中的分布式集群架构
MongoDB 中的分布式集群架构 前言 Replica Set 副本集模式 副本集写和读的特性 Sharding 分片模式 分片的优势 MongoDB 分片的组件 分片键 chunk 是什么 分片的 ...
- 最好用的AI换脸软件,rope下载介绍
随着AI技术的广泛运用,市面上的换脸软件也多了起来,今天给各位介绍其中的王者Rope! 先上两个动图,给大伙看看效果 rope是如何实现这种自然的效果呢?这得益于机器学习技术的不断发展,rope经过深 ...
- 【scikit-learn基础】--『预处理』之 正则化
数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...