用树状数组动态和查询修改排名。

树状数组可以很方便地查询前缀和,那么可以利用这一特点,记录一个点在树状数组里最后一次出现的位置,

查询出这个位置,就可以知道这个点的排名了。更改这个点的排名的时候只要把原来位置修改成0,然后在新的位置加上1就行了。

把询问离线,数据范围比较大,先用快排+去重离散(用map也可,就是慢了一点),

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5+, N = maxn*-; int a[maxn],q[maxn],C[N+],sz,pos[maxn]; #define lowbit(x) ((x)&-(x)) void add(int x,int d)
{
while(x<N){
C[x] += d; x += lowbit(x);
}
} int sum(int x)
{
int ret = ;
while(x>){
ret += C[x]; x -= lowbit(x);
}
return ret;
} int b_search(int val,int *A = a,int l = ,int r = sz)
{
int m;
while(l<r){
m = (l+r)>>;
if(val>A[m]) l = m+;
else if(val<A[m]) r = m;
else return m;
}
return -;
} int main()
{
freopen("mtf.in","r",stdin);
freopen("mtf.out","w",stdout);
int n; cin>>n;
for(int i = ; i < n; i++) scanf("%d",a+i),q[i]=a[i];
sort(a,a+n);
sz = unique(a,a+n)-a;
for(int i = ; i < sz; i++){
add(pos[i] = maxn+i,);
}
int cur = maxn-;
for(int i = ; i < n; i++){
int x = b_search(q[i]), ans;
if(pos[x] == maxn+x) ans = sum(pos[x]) - x- + q[i];
else ans = sum(pos[x]);
printf("%d%c",ans,i==n-?'\n':' ');
add(pos[x],-);
add(pos[x] = cur--,);
}
return ;
}

Gym 100342F Move to Front (树状数组动态维护和查询)的更多相关文章

  1. HH的项链 树状数组动态维护前缀

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const ...

  2. 【poj2155】Matrix(二维树状数组区间更新+单点查询)

    Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...

  3. 「BZOJ1537」Aut – The Bus(变形Dp+线段树/树状数组 最优值维护)

    网格图给予我的第一反应就是一个状态 f[i][j] 表示走到第 (i,j) 这个位置的最大价值. 由于只能往下或往右走转移就变得显然了: f[i][j]=max{f[i-1][j], f[i][j-1 ...

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

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

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

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

  6. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  7. NBOJv2 1050 Just Go(线段树/树状数组区间更新单点查询)

    Problem 1050: Just Go Time Limits:  3000 MS   Memory Limits:  65536 KB 64-bit interger IO format:  % ...

  8. hdu1556 树状数组区间更新单点查询板子

    就是裸的区间更新: 相对于直观的线段树的区间更新,树状数组的区间更新原理不太相同:由于数组中的一个结点控制的是一块区间,当遇到更新[l,r]时,先将所有能控制到 l 的结点给更新了,这样一来就是一下子 ...

  9. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

随机推荐

  1. 3.15-3.21 hive项目实战

    一.创建表并导入日志数据,引出问题 ##建表 hive (default)> create table IF NOT EXISTS default.bf_log_src( > remote ...

  2. 解决 'chromedriver' executable needs to be in PATH.'报错

    试了把chromedriver.exe放到chrome安装文件下,python安装文件下,然后把路径配到path里,均无用. 最后是修改函数调用得以解决: from selenium import w ...

  3. linux中的条件变量

    1 大家可能知道互斥量是线程程序中必须的工具了,但是也不能是万能的,就比如某个线程正在等待共享数据某个条件的发生,这个时候会发生什么呢.它就可能重复的尝试对互斥对象锁定和解锁来检查共享数据结构. 2 ...

  4. c++函数模板二栈实现

    1 没有使用模板的栈实现 #include <iostream> #include <string> using namespace std; class Stack { pu ...

  5. web开发菜鸟应该如何向前端大神提问题(一次性把问题描述清楚)

    1. 问题的环境和背景这里的背景一般包括,是针对桌面浏览器还是移动端开发?如果是桌面浏览器,则兼容性要求如何?比方说,你来咨询父级是百分比高度的垂直居中效果,你就要说明,你这个效果是需要兼容IE7+还 ...

  6. Codeforces 174B【模拟构造】

    题意: 给你一个串只有小写字母和点,让你构造前缀是1-8,后缀是1-3长度的文件名: 思路: 那么以"."作为分割点,把字符串都拿出来,然后 首段长度<=8 OK; 中间&l ...

  7. [Xcode 实际操作]七、文件与数据-(23)UI Testing系统界面测试功能的使用

    目录:[Swift]Xcode实际操作 本文将演示UI Testing系统界面测试功能的使用. 如果项目中尚未引入界面测试功能,请点击项目属性面板->[General]面板左下角的[+]图标 - ...

  8. github 收藏项目的方法

    1,Watching 需要收藏的项目 2,查看收藏的项目

  9. 洛谷 P3957 跳房子

    https://www.luogu.org/problemnew/show/P3957 错误记录:1.没开longlong 2. -inf不够小 #include<cstdio> #inc ...

  10. CATIA 基础详解 第01章 CATIA初认识

    1.1 CATIA V5产品介绍 CATIA V5是基于美国IBM公司与法国达索系统公司(Dassault Systèmes)软件解决方案推出的新一代产品,它致力于满足以设计流程为中心的设计需求.它提 ...