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+树状数组)的更多相关文章

  1. Gym - 101755G Underpalindromity (树状数组)

    Let us call underpalindromity of array b of length k the minimal number of times one need to increme ...

  2. CF Gym 100463A (树状数组求逆序数)

    题意:给你一个序列,和标准序列连线,求交点数. 题解:就是求逆序对个数,用树状数组优化就行了.具体过程就是按照顺序往树状数组了插点(根据点的大小),因为第i大的点应该排在第i位,插进去的时候他前面本该 ...

  3. GYM 100741A Queries(树状数组)

    A. Queries time limit per test 0.25 seconds memory limit per test 64 megabytes input standard input ...

  4. GYM 101889F(树状数组)

    bit扫描坐标套路题,注意有重复的点,莽WA了. const int maxn = 1e5 + 5; struct node { ll B, F, D; bool operator < (con ...

  5. Codeforces Gym 100114 H. Milestones 离线树状数组

    H. Milestones Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descripti ...

  6. Gym 101908C - Pizza Cutter - [树状数组]

    题目链接:https://codeforces.com/gym/101908/problem/C 题意: 一块正方形披萨,有 $H$ 刀是横切的,$V$ 刀是竖切的,不存在大于等于三条直线交于一点.求 ...

  7. Codeforces Gym 100269F Flight Boarding Optimization 树状数组维护dp

    Flight Boarding Optimization 题目连接: http://codeforces.com/gym/100269/attachments Description Peter is ...

  8. Gym - 100269F Flight Boarding Optimization(dp+树状数组)

    原题链接 题意: 现在有n个人,s个位置和你可以划分长k个区域你可以把s个位置划分成k个区域,这样每个人坐下你的代价是该区域内,在你之前比你小的人的数量问你怎么划分这s个位置(当然,每个区域必须是连续 ...

  9. 【容斥原理】【推导】【树状数组】Gym - 101485G - Guessing Camels

    题意:给你三个1~n的排列a,b,c,问你在 (i,j)(1<=i<=n,1<=j<=n,i≠j),有多少个有序实数对(i,j)满足在三个排列中,i都在j的前面. 暴力求的话是 ...

随机推荐

  1. testng依赖,顺序,跳过

    依赖测试@test(dependsOnMethods = {"open"})@testpublic static void open{    System.out.println( ...

  2. Tomcat内存设置

    MyEclipse Tomcat的JDK菜单:“Optional Java VM arguments:”框中输入“有前置空格”   -Xms512m -Xmx512m -XX:PermSize=512 ...

  3. Open source packages on Deep Reinforcement Learning

    智能车 self driving car + 强化学习 reinforcement learning + 神经网络 模拟 https://github.com/MorvanZhou/my_resear ...

  4. http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321

    集体智慧勘误表: http://www.oreilly.com/catalog/errataunconfirmed.csp?isbn=9780596529321 ------------------- ...

  5. MFC编程入门之十(对话框:设置对话框控件的Tab顺序)

    前面几节为大家演示了加法计算器程序完整的编写过程,本节主要讲对话框上控件的Tab顺序如何调整. 上一讲为"计算"按钮添加了消息处理函数后,加法计算器已经能够进行浮点数的加法运算.但 ...

  6. Oracle 优化 - CPU 问题

    作为 OLTP 应用,一般不太有 CPU 问题,比较少 - 毕竟大多数问题都是 IO 引起:但是偶尔也会有. 问题判断 很简单 - OS 出现 CPU 很高的问题,持续高于 90% 应用可能会表现慢 ...

  7. Android自动化测试中Monkeyrunner详解

    之前有写过monkey测试详细说明,几天就说说monkeyrunner. monkeyrunner工具提供了一个API,使用此API写出的程序可以在Android代码之外控制Android设备和模拟器 ...

  8. 0030 Linux 网络操作命令

    1. 主机是否可达 ping IP 2. 服务是否在运行 telnet IP port 3. 网络配置 ifconfig ip route arp 4. 网络访问 curl wget 5. 网络追踪 ...

  9. while 和 for 对比

    for 语句实例 本例中的循环使用 for 循环来显示 cars 数组中的所有值: cars=["BMW","Volvo","Saab",& ...

  10. 【转】CentOS 6.5安装pyspider过程记录

    原文地址:http://blog.sina.com.cn/s/blog_48c95a190102wczx.html 1.根据pyspider官方推荐的安装方法,使用pip命令直接安装pyspider ...