http://www.lydsy.com/JudgeOnline/problem.php?id=3289

题意:……

思路:求交换次数即求逆序对数。确定了这个之后,先离散化数组。然后在后面插入元素的话,就是在区间里面找比它大的元素数量,在前面插入元素的话,就是在区间里面找比它小的元素数量。删除操作类似。因为排序是从小到大排序,所以要找比它大的数量就是区间长度减去小于等于该元素的数量,所以是(R - L + 1 - sum(a[i])),要找比它小的数量就是(sum(a[i] - 1))。然后用莫队算法处理区间询问就好了。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 50010
struct node {
int l, r, id, ans;
} p[N];
int bit[N], a[N], b[N], num[N], ans, kuai, n; bool cmp(const node &a, const node &b) {
if(a.l / kuai == b.l / kuai) return a.r < b.r;
return a.l / kuai < b.l / kuai;
}
bool cmpid(const node &a, const node &b) { return a.id < b.id; }
int lowbit(int x) { return x & (-x); }
void add(int x, int w) { for( ; x <= n; x += lowbit(x)) bit[x] += w; }
int sum(int x) { int ans = ; for( ; x ; x -= lowbit(x)) ans += bit[x]; return ans; } int main() {
while(~scanf("%d", &n)) {
for(int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
int q; scanf("%d", &q);
for(int i = ; i <= q; i++) scanf("%d%d", &p[i].l, &p[i].r), p[i].id = i; memset(bit, , sizeof(bit));
ans = ; kuai = sqrt(n);
sort(b + , b + + n);
int cnt = unique(b + , b + + n) - b - ;
for(int i = ; i <= n; i++) a[i] = lower_bound(b + , b + + cnt, a[i]) - b; sort(p + , p + + q, cmp);
for(int L = , R = , i = ; i <= q; i++) {
int l = p[i].l, r = p[i].r;
for( ; L < l; L++) { ans -= sum(a[L] - ); add(a[L], -); }
for( ; L > l; L--) { ans += sum(a[L-] - ); add(a[L-], ); }
for( ; R < r; R++) { ans += R - L + - sum(a[R+]); add(a[R+], ); }
for( ; R > r; R--) { ans -= R - L + - sum(a[R]); add(a[R], -); }
p[i].ans = ans;
}
sort(p + , p + + q, cmpid);
for(int i = ; i <= q; i++) printf("%d\n", p[i].ans);
}
return ;
}

最新文章

  1. Android图片缓存之初识Glide
  2. 2016网络大事记 mark
  3. 69 个经典 Spring 面试题和答案
  4. 【译】怎样编写移动优先的CSS
  5. 按下enter键后表单自动提交问题
  6. android Xutils dbutils 注解
  7. Configuration Management小结
  8. XCODE真机调试设备连接一直忙碌如何处理
  9. 用python的numpy作线性拟合、多项式拟合、对数拟合
  10. 给出2n+1个数,其中有2n个数出现过两次,如何用最简便的方法找出里面只出现了一次的那个数(转载)
  11. #define DEBUG用法
  12. 《Javascript网页经典特性300例》
  13. lua游戏开发实践指南学习笔记1
  14. python之pyqt4的简单窗口布局以及信号和槽(上代码)
  15. Java 线程和多线程执行过程分析
  16. 如何取得select结果数据集的前10条记录。postgresql
  17. Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
  18. python json 解析
  19. An &#39;&#39;all&#39;&#39; model group must appear in a particle with...问题解决记录
  20. 计算n^k的开头三位和末尾三位(fmod(double x,double y)函数的引入)

热门文章

  1. Lexer的设计--上(3)
  2. 完美实现鼠标拖拽事件,解决各种小bug,基于jquery
  3. centos搭建svn服务器并同步到web目录
  4. 零元学Expression Blend 4 - Chapter 3 熟悉操作第一步(制作一个猴子脸)
  5. 数据库连接池之_Druid简单使用
  6. 企业级架构 MVVM 模式指南 (WPF 和 Silverlight 实现) 译(1)
  7. jQuery仪表盘指示器动画插件 6种仪表样式
  8. 开启Qt Lite Project
  9. 每一位想有所成就的程序员都必须知道的15件事(走不一样的路,要去做,实践实践再实践,推销自己,关注市场)good
  10. linux下mysql定时备份