Gym 100960G (set+树状数组)
Problem Youngling Tournament
题目大意
给一个序列a[i],每次操作可以更改一个数,每次询问 将序列排序后有多少个数a[i]>=sum[i-1]。
n<=10^5,q<=5*10^4,a[i]<=10^12
解题分析
可以发现,在最优情况下,该序列长度最多为logn。
将询问离线后,用multiset来维护a[i],用树状数组来维护sum[i]。树状数组所存下标为离散化后的a[i]。
每次查询时跳跃式地在set中查找。
时间复杂度 O((n+m)log(n+m)+mlognlogn)
参考程序
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std; #define N 100008
#define M 50008
#define LL long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define clr(x,v) memset(x,v,sizeof(x));
#define bitcnt(x) __builtin_popcount(x)
#define rep(x,y,z) for (int x=y;x<=z;x++)
#define repd(x,y,z) for (int x=y;x>=z;x--)
const int mo = ;
const int inf = 0x3f3f3f3f;
const int INF = ;
/**************************************************************************/ int n,m,tot,flag;
LL a[N],c[N],x[N*];
int b[N];
multiset<long long> S;
struct Binary_Indexed_Tree{
LL a[N*];
void clear(){
clr(a,);
}
void insert(int x,LL val){
for (int i=x;i<=N<<;i+=i & (-i))
a[i]+=val;
}
LL sigma(int x){
LL res=;
for (int i=x;i>;i-=i & (-i))
res+=a[i];
return res;
}
LL query(int x,int y){
return sigma(y)-sigma(x-);
}
}T;
int id(LL xy){
return lower_bound(x+,x+tot+,xy)-x;
}
set <long long> :: iterator it,it1;
void query(){
int ans=; LL tmp;
it = S.begin();
it1 = it ; it1++;
if (*it==*it1) ans++;
tmp=T.sigma(id(*it));
while (){
it = S.lower_bound(tmp);
if (it==S.begin()) it++;
if (it==S.end()) break;
it1 = it; it1--;
tmp=T.sigma(id(*it1));
if (*it>=tmp) ans++;
tmp=T.sigma(id(*it));
}
printf("%d\n",ans); } int main(){
scanf("%d",&n);
rep(i,,n){
scanf("%lld",&a[i]);
x[++tot]=a[i];
}
scanf("%d",&m);
rep(i,,m){
scanf("%d%lld",&b[i],&c[i]);
x[++tot]=c[i];
}
sort(x+,x+tot+);
tot=unique(x+,x+tot+)-x;
T.clear();
rep(i,,n){
T.insert(id(a[i]),a[i]);
S.insert(a[i]);
}
query();
rep(i,,m){
S.erase(S.find(a[b[i]]));
T.insert(id(a[b[i]]),-a[b[i]]);
S.insert(c[i]);
T.insert(id(c[i]),c[i]);
a[b[i]]=c[i];
query();
} }
Gym 100960G (set+树状数组)的更多相关文章
- Gym - 101755G Underpalindromity (树状数组)
Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...
- CF Gym 100463A (树状数组求逆序数)
题意:给你一个序列,和标准序列连线,求交点数. 题解:就是求逆序对个数,用树状数组优化就行了.具体过程就是按照顺序往树状数组了插点(根据点的大小),因为第i大的点应该排在第i位,插进去的时候他前面本该 ...
- GYM 100741A Queries(树状数组)
A. Queries time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input ...
- GYM 101889F(树状数组)
bit扫描坐标套路题,注意有重复的点,莽WA了. const int maxn = 1e5 + 5; struct node { ll B, F, D; bool operator < (con ...
- Codeforces Gym 100114 H. Milestones 离线树状数组
H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...
- Gym 101908C - Pizza Cutter - [树状数组]
题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...
- Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp
Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...
- Gym - 100269F Flight Boarding Optimization(dp+树状数组)
原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...
- 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels
题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...
随机推荐
- Auty自动化测试框架第四篇——生成测试结果报告
[本文出自天外归云的博客园] 本次为Auty框架添加生成测试结果报告功能,文件结构更新:
- Tsung安装与使用
Tsung安装与使用 Tsung安装与使用的详细说明,包括测试场景的脚本配置说明 Ray 2013/11/11 目录 安装tsung Tsung运行环境安装... Tsung安装... 使用Tsu ...
- crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫
crawler4j是用Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫.下面实例结合jsoup解析网页,javacsv存储采集数据:采集自如ziroom租房网(h ...
- centos7 安装webmin
一 下载webmin软件包 wget http://prdownloads.sourceforge.net/webadmin/webmin-1.791-1.noarch.rpm 二 安装perl环境 ...
- macaca运行报错之chrome-driver问题处理,关闭 Chrome 的自动更新
由于chrome浏览器自动更新,导致 macaca运行报错,重新安装和更新chrome-driver 之后,还需要把chrome浏览器降级到50版本: 但是chrome会自动更新,所以需要禁止.找到这 ...
- Trick
1. var b = a.slice(beginIndex,endIndex); [].slice.call( [] ) Array.prototype.slice.call([]) will cop ...
- Winform实现右下角弹窗_提示信息
网页是否经常在电脑右下角弹窗显示消息?其实Winform也是可以实现的.下面介绍两种方法. 第一步:设计窗体 第二步:实现代码 第一种方法 引用user32 声明常量 窗体Load事件 窗体FormC ...
- 【Java基础】分支结构(1)
java 分支结构 if , if else , if elseif if /** 文件路径:G:\JavaByHands\if-else\ 文件名称:IfElseT.java 编写时间:2016/6 ...
- android View事件分发机制结论
原始博客有对源码的分析:http://blog.csdn.net/lmj623565791/article/details/39102591 结论:1.view事件的分发流程: dispatchTou ...
- Ubuntu配置pyethapp
1. 安装系统依赖 apt-get install build-essential automake pkg-config libtool libffi-dev libgmp-dev 2. Clone ...