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 ...
随机推荐
- DDD学习与感悟——总是觉得自己在CRUD怎么办?
一.DDD是什么? DDD全名叫做Domins drives Design:领域驱动设计.再说的通俗一点就是:通过领域建模的方式来实现软件设计. 问题来了:什么是软件设计?为什么要进行软件设计? 软件 ...
- 数据库系列:MySQL不同操作分别用什么锁?
数据库系列:MySQL慢查询分析和性能优化 数据库系列:MySQL索引优化总结(综合版) 数据库系列:高并发下的数据字段变更 数据库系列:覆盖索引和规避回表 数据库系列:数据库高可用及无损扩容 数据库 ...
- idea常用快捷键使用
idea常用快捷键使用:1.shift+u 大小写2.alt+shift+u 驼峰命名(插件:CamelCase)3.ctrl+alt 点击跳转实现类4.ctrl 点击跳转接口类5.Alt+F7 查看 ...
- tomact
常见的java相关的web服务器软件: *webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费. *webSphere:IBM公司,大型的JavaEE ...
- pinia状态管理初识
一款官方推荐的,代替vuex的,新的状态管理工具. 官方网: https://pinia.vuejs.org/zh/introduction.html 主要区别: 去除了modules的概念,每个st ...
- 神经网络优化篇:如何理解 dropout(Understanding Dropout)
理解 dropout Dropout可以随机删除网络中的神经单元,为什么可以通过正则化发挥如此大的作用呢? 直观上理解:不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传 ...
- 从零玩转人脸识别验证-face
title: 从零玩转人脸识别验证 date: 2022-05-15 21:05:52.974 updated: 2023-05-16 00:00:11.594 url: https://www.yb ...
- 从零玩转Nginx
01[熟悉]实际开发中的问题? 现在我们一个项目跑在一个tomcat里面 当一个tomcat无法支持高的并发量时.可以使用多个tomcat 那么这多个tomcat如何云分配请求 |-nginx 02[ ...
- wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】
引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...
- 普通用户登录切换到root用户
使用su命令: 在终端中输入以下命令并按Enter键: su - 输入root用户的密码,然后按Enter键. 如果密码正确,你将会切换为root用户,并且可以执行root用户的操作. 使用sudo命 ...