题意:

有N个队伍(1 <= N <= 100,000),每个队伍开始有ai个人[0 <= ai<= 100,000,000],有Q个操作[0<=Q<= 500,000]

操作分为三种,1 A:表示在第A个队列加一个人。 2 X:表示求长度大于等于X队列数量。3 Y:表示所有长度大于等于Y的队列减去一个人。

题解:

把各个队列按长度排序

用差分数列来维护这个数组,这样求每个队列的长度就是求前缀和。每次求长度的复杂度是lgn,因为队列是按长度排序的,所以可以通过二分查找到某个长度在队列中的位置,复杂度为lgn*lgn。

两个数组sa[i]记录每个按长度排序后的第i个队列原来的位置。 rk[i]记录在位置i的队列按长度排序的位置。

对于在第i个队列加一个人,求出第i个队列的长度len,在所有长度为len的队列的最后一个加一,这样操作是为了不改变队列的顺序,然后是需要交换下i的位置和队列中长度为len的最后一个位置就好了。

AC代码(950MS):

#include <bits/stdc++.h>
using namespace std; const int N = ;
struct Node {
int pos;
int len;
bool operator < (Node x) const {
return len < x.len;
}
} a[N];
int sa[N], rk[N], bit[N];
int n, q; int lowbit(int x) { return x & -x; } void add(int pos, int val)
{
while (pos <= n) {
bit[pos] += val;
pos += lowbit(pos);
}
} int sum(int pos)
{
int res = ;
while (pos) {
res += bit[pos];
pos -= lowbit(pos);
}
return res;
} int lb(int x)
{ // 找第一个大于等于x的数
int l = , r = n + , m;
while (l < r) {
m = (l + r) >> ;
if (sum(m) < x) l = m + ;
else r = m;
}
return r;
} int main()
{
while (~scanf("%d%d", &n, &q)) {
for (int i = ; i <= n; ++i) {
scanf("%d", &a[i].len);
a[i].pos = i;
}
sort(a + , a + + n);
for (int i = ; i <= n; ++i) {
sa[i] = a[i].pos;
rk[ a[i].pos ] = i;
add(i, a[i].len - a[i - ].len);
}
int ch, x;
while (q--) {
scanf("%d%d", &ch, &x);
if (ch == ) {
int bp = rk[x]; // 原来的位置
int len = sum(bp);
int sp = lb(len + ) - ; // 加一后的位置
swap(rk[ sa[bp] ], rk[ sa[sp] ]);
swap(sa[bp], sa[sp]);
add(sp, ); add(sp + , -);
} else if (ch == ) {
int ans = lb(x);
printf("%d\n", n - ans + );
} else {
int sp = lb(x);
add(sp, -);
}
}
}
return ;
}

SPOJ TEMPLEQ - Temple Queues(二分查找+树状数组)的更多相关文章

  1. Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化

    题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$  $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...

  2. [luogu4479][BJWC2018]第k大斜率【二维偏序+二分+离散化+树状数组】

    传送门 https://www.luogu.org/problemnew/show/P4479 题目描述 在平面直角坐标系上,有 n 个不同的点.任意两个不同的点确定了一条直线.请求出所有斜率存在的直 ...

  3. 【BZOJ4009】[HNOI2015]接水果 DFS序+整体二分+扫描线+树状数组

    [BZOJ4009][HNOI2015]接水果 Description 风见幽香非常喜欢玩一个叫做 osu!的游戏,其中她最喜欢玩的模式就是接水果.由于她已经DT FC 了The big black, ...

  4. BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组

    BZOJ_2225_[Spoj 2371]Another Longest Increasing_CDQ 分治+树状数组 Description        给定N个数对(xi, yi),求最长上升子 ...

  5. BZOJ 4009: [HNOI2015]接水果 (整体二分+扫描线 树状数组)

    整体二分+扫描线 树状数组 具体做法看这里a CODE #include <cctype> #include <cstdio> #include <cstring> ...

  6. Codeforces 899 F. Letters Removing (二分、树状数组)

    题目链接:Letters Removing 题意: 给你一个长度为n的字符串,给出m次操作.每次操作给出一个l,r和一个字符c,要求删除字符串l到r之间所有的c. 题解: 看样例可以看出,这题最大的难 ...

  7. cf1073D Berland Fair (二分答案+树状数组)

    用一个树状数组维护前缀和,每次我二分地找一个位置,使得我能一路买过去 但这个买不了 那以后肯定也都买不了了,就把它改成0,再从头二分地找下一个位置,直到这一圈我可以跑下来 然后就看跑这一圈要花多少钱. ...

  8. AtCoder Regular Contest 101 (ARC101) D - Median of Medians 二分答案 树状数组

    原文链接https://www.cnblogs.com/zhouzhendong/p/ARC101D.html 题目传送门 - ARC101D 题意 给定一个序列 A . 定义一个序列 A 的中位数为 ...

  9. TZOJ 4602 高桥和低桥(二分或树状数组+二分)

    描述 有个脑筋急转弯是这样的:有距离很近的一高一低两座桥,两次洪水之后高桥被淹了两次,低桥却只被淹了一次,为什么?答案是:因为低桥太低了,第一次洪水退去之后水位依然在低桥之上,所以不算“淹了两次”.举 ...

随机推荐

  1. 抽象工厂模式(python版)

    http://blog.csdn.net/ponder008/article/details/6886039 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类.优点:易 ...

  2. mysql语句中把string类型字段转datetime类型

    mysql语句中把string类型字段转datetime类型   在mysql里面利用str_to_date()把字符串转换为日期   此处以表h_hotelcontext的Start_time和En ...

  3. [topcoder]ZigZag

    http://community.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493 动态规划题.如果不用DP,暴力的应当在2^ ...

  4. thinkphp 定制错误页面

    在前台配置文件里加上: 'TMPL_EXCEPTION_FILE' => '.Public/tpl/error.html',// 异常cuowu页面的模板文件 然后在Public下新建一个tpl ...

  5. js 中中括号,大括号使用详解

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen",&quo ...

  6. 配置SQL Server 2008服务器

    怎么配置SQL Server 2008服务器_百度经验 http://jingyan.baidu.com/article/9faa7231a922c1473c28cb23.html 1.验证安装是否成 ...

  7. CheckBoxList 获取与设置选中的值

    /// <summary> ///CheckBoxListHelper 的摘要说明 ///CheckBoxList获取与设置选中的值 /// </summary> public ...

  8. VMware Workstation与Hyper-V不兼容。请先从系统中移除Hyper-V角色,然后再运行VMware Workstation。

    VMware Workstation与Hyper-V不兼容.请先从系统中移除Hyper-V角色,然后再运行VMware Workstation. 今天在用win8.1的时候发现了这个问题,解决办法如下 ...

  9. Application.CommonAppDataPath的路径

    Application.CommonAppDataPath; win7的路径 C:\ProgramData\CompanyName\ProductName\2.0.5.1 [assembly: Ass ...

  10. 从Hadoop框架与MapReduce模式中谈海量数据处理(含淘宝技术架构) (转)

    转自:http://blog.csdn.net/v_july_v/article/details/6704077 从hadoop框架与MapReduce模式中谈海量数据处理 前言 几周前,当我最初听到 ...