题意:

有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. 双十一运维怎么过,OneAPM 帮你救火,轻松运维

    一年一度的双十一来了 有人剁手买买买,有人愁眉苦脸抱着服务器哭 对,说的就是你,汪 苦逼的运维工程师双十一怎么过来的? 守着电脑看预警还是通宵加服务器扩容 还是帮女朋友守着购物车等着一键清空 或者 今 ...

  2. java核心技术记录

    Java是一种强类型的语言,这意味着必须为每一个变量声明一种类型.在java中,一共有8种基本类型,其中4种整型.2种浮点型.1种用于表示Unicode编码的字符单元的字符类型char和一种用于表示真 ...

  3. linux distribution是什么?

    linux distribution,即Linux发行版,有很多种类,包括Fedora,Ubuntu,Debian,Red Hat,SuSE等,其内核都是差不多的,只是界面设计和功能上各有千秋.

  4. nginx静态资源分离部署

    修改nginx.conf文件,用于nginx处理静态资源. 主要配置如下(在server配置中加入location配置即可): server { listen 80; server_name 123. ...

  5. 命令行添加用户的“作为服务登录”权利(添加Windows用户的时候,门道不是一般的多)good

    1.打开控制台(“开始”|“运行”中输入:MMC) 2.“文件”菜单|“添加删除管理单元”|“添加...”|选“安全模板”|“关闭”. 3.在“C:\Windows\Security\template ...

  6. *IntelliJ IDEA使用Hibernate连接数据库

    在IntelliJ IDEA中配置MySQL Database.

  7. JS中的自执行函数

    本来规划的是2013年,狠狠的将JS学习下,谁知计划赶不上变化,计划泡汤了.13年的我对JS来说可以说是属于跟风,对它的理解和认识也仅仅是皮毛而已,也是因为要完成<ArcGIS API for ...

  8. IMX51+WINCE6.0平台缩写意义

    1.以EPIT为例 EPIT(Enhanced Periodic Interrupt Timer)为增强型周期中断定时器,其中有CR控制寄存器,要设置CR寄存器的SWR位,代码如下: // Asser ...

  9. poj 2488 A Knight's Journey( dfs )

    题目:http://poj.org/problem?id=2488 题意: 给出一个国际棋盘的大小,判断马能否不重复的走过所有格,并记录下其中按字典序排列的第一种路径. #include <io ...

  10. Glimpse

    给自己程序配好Glimpse. Glimpse.Mvc 有问题 遇到稍微复杂点的内套多个PartialView,内存就爆了彪1.7g,不开Glimpse一点问题都没.另外Glimpse.Nlog也有问 ...