CF1042D Petya and Array
思路:
离散化+树状数组(或权值线段树)。bit数组一定要开够。和求逆序对数量很像。
实现:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int MAXN = 200005; 5 ll a[MAXN], b[MAXN], bit[2 * MAXN]; 6 int n; 7 int lowbit(int x) 8 { 9 return x & -x; 10 } 11 ll sum(int x) 12 { 13 ll ans = 0; 14 while (x) 15 { 16 ans += bit[x]; 17 x -= lowbit(x); 18 } 19 return ans; 20 } 21 void add(int i, ll x, int maxn) 22 { 23 while (i <= maxn) 24 { 25 bit[i] += x; 26 i += lowbit(i); 27 } 28 } 29 int main() 30 { 31 ll t; 32 while (cin >> n >> t) 33 { 34 memset(b, 0, sizeof b); 35 memset(bit, 0, sizeof bit); 36 for (int i = 1; i <= n; i++) 37 { 38 cin >> a[i]; 39 b[i] = b[i - 1] + a[i]; 40 } 41 vector<ll> v; 42 for (int i = 0; i <= n; i++) 43 { 44 v.push_back(b[i]); 45 v.push_back(b[i] + t); 46 } 47 sort(v.begin(), v.end()); 48 v.erase(unique(v.begin(), v.end()), v.end()); 49 ll ans = 0; 50 for (int i = n; i >= 1; i--) 51 { 52 int pos = lower_bound(v.begin(), v.end(), b[i]) - v.begin() + 1; 53 add(pos, 1, v.size()); 54 pos = lower_bound(v.begin(), v.end(), b[i - 1] + t) - v.begin() + 1; 55 ans += sum(pos - 1); 56 } 57 cout << ans << endl; 58 } 59 return 0; 60 }
转载于:https://www.cnblogs.com/wangyiming/p/9692448.html
CF1042D Petya and Array相关推荐
- CF1042D Petya and Array 树状数组
题目描述 Petya has an array a a a consisting of n n n integers. He has learned partial sums recently, an ...
- Problem - 1042D - D. Petya and Array(树状数组)
D. Petya and Array 题目大意:给定长度为 n n n的序列 a a a,求出有多少组 l , r l,r l,r使得 a l + a l + 1 + a l + 2 + . . . ...
- D. Petya and Array(树状数组 + 前缀和 + 逆序对的思想)
Problem - D - Codeforces Petya 有一个由 n 个整数组成的数组 a.他最近学习了部分和,现在他可以非常快地计算出数组中任何一段元素的和.这个段是一个非空的序列,相邻的元素 ...
- Codeforce 1042 D. Petya and Array(树状数组、前缀和)
题目链接 省赛选拔学长说是CF的原题,赛后得知学长是用树状数组写的,补了一个树状数组的代码. 题意 NNN个数,问一共有多少个连续区间满足区间和小于 MMM 思路 记录每个数的前缀和sortsorts ...
- ★☆★cf D. Petya and Array
http://codeforces.com/problemset/problem/1042/D 抽象成一个问题:一边增加数组长度,增加之后再随机找小于某阈值的数的个数. 树状数组,离散化,模拟运行一遍 ...
- D - Petya and Array(树状数组,二分)
思路:对于al+..ara_l+..a_ral+..ar这种区间和问题一般都要考虑前缀差,然后问题就转化为了求sum[r]−sum[l−1]<tsum[r]-sum[l-1]<tsum ...
- Remove Duplicate
题目描述: Petya has an array a consisting of n integers. He wants to remove duplicate (equal) elements. ...
- Codeforces Round #643 (Div. 2)
这场是七点半的场,正好跑完步打了一下 于是: 害 还是太菜了 A - Sequence with Digits Let's define the following recurrence: an+1= ...
- Codeforces Round #481 (Div. 3)题解
成功掉到灰,真的心太累了,orz!!!!,不是很懂那些国外大佬为什么每次都是20多分钟AK的,QAQ A. Remove Duplicates time limit per test 1 second ...
最新文章
- Dokcer安装Redis
- 什么是 SAP UI5 的 Component-preload.js, 什么是Minification和Ugification
- matlab 可视化界面,Matlab?的可视化界面设计
- 佛与道的浪漫-红颜弹指老,刹那芳华
- R语言将一列分解为多列
- chapter10--进程和计划任务管理
- Java的对象序列化之serialVersionUID问题
- 检错码与纠错码,一码归一码
- easyx游戏编程:魔塔(c++语言开发)源码
- hbuilder TODO插件
- infinity新标签页失效
- 好好说话之Tcache Attack(3):tcache stashing unlink attack
- C++编译错误C2440“类型转换”: 无法从“void (__thiscall COpenGLWnd::* )(void)”转换为“DuiLib::DUI_PMSG解决办法
- okcc呼叫中心系统防封号系统的工作原理
- Java中getBytes()方法--使用详解
- onchange、onpropertychange、oninput和onblur
- 海康监控主机无法登录后台解决办法
- 【Lua 教程系列第 4 篇】Lua 中的第一行代码 hello world
- 淘宝如何做到懂你的推荐的?揭秘千人千面个性化推荐原理!
- 计算机无法播放视频,电脑自带播放器无法播放视频怎么办