蒜头君的排序

蒜头君是一个爱思考的好孩子,这一天他学习了冒泡排序,于是他就想,把一个乱序排列通过冒泡排序排至升序需要多少次交换,这当然难不倒他,于是他想来点刺激的,给定一个 1 \ldots n1…n 的排列,每次从该排列中选择一个区间 [l,r][l,r],问使用冒泡排序将该区间排至升序需要多少次交换操作。

输入格式

第一行一个整数 nn,表示排列长度。

接下来一行 nn 个整数,表示该排列。

接下来一行一个整数 mm,表示询问次数。

接下来 mm 行,每行 22 个整数 l,rl,r,表示询问 [l,r][l,r] 区间。

输出格式

输出 mm 行,每行 11 个整数,第 ii 行表示第 ii 个询问的答案。

数据规模

样例输入

10
9 8 7 4 5 6 10 3 2 1
5
2 4
8 10
2 8
5 9
4 9

样例输出

3
3
13
7
9题解:动态维护的树状数组一开始很纠结到底怎么动态维护逆序对,之后看了数据才恍然大悟

最后一个范围意思就是左右端点的变化量<=7*10^6

这样连莫队都不需要了,直接左右端点移动就行了

区间[l,r]很容易堆出区间[l-1,r],[l+1,r],[l,r-1],[l,r+1]

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 int c[300001],a[300001],rpos=0,lpos=1,n,m,ans;
 7 void add(int x,int d)
 8 {
 9     while (x<=n)
10     {
11         c[x]+=d;
12         x+=(x&(-x));
13     }
14 }
15 int query(int x)
16 {
17     int s=0;
18     while (x)
19     {
20         s+=c[x];
21         x-=(x&(-x));
22     }
23     return s;
24 }
25 int main()
26 {int i,j,l,r;
27     cin>>n;
28     for (i=1;i<=n;i++)
29     {
30         scanf("%d",&a[i]);
31     }
32     cin>>m;
33      for (i=1;i<=m;i++)
34      {
35          scanf("%d%d",&l,&r);
36           while (rpos<r)
37           {
38             rpos++;
39             ans+=query(n)-query(a[rpos]-1);
40               add(a[rpos],1);
41          }
42          while (rpos>r)
43          {
44             add(a[rpos],-1);
45              ans-=query(n)-query(a[rpos]-1);
46              rpos--;
47          }
48          while (lpos<l)
49          {
50          add(a[lpos],-1);
51              ans-=query(a[lpos]-1);
52              lpos++;
53          }
54          while (lpos>l)
55          {
56              lpos--;
57              ans+=query(a[lpos]-1);
58              add(a[lpos],1);
59          }
60          printf("%d\n",ans);
61      }
62 }
时间: 2024-10-04 10:18:40

蒜头君的排序的相关文章

复习---归并排序求逆序对--计蒜客2017noip模拟赛二--蒜头君的排序

题目链接:https://nanti.jisuanke.com/t/16443 我不会矩阵快速幂,所以只拿了60分, 发现归并排序掌握的并不熟练,借此良机复习一下. 重在归并排序分治思想,要牢记! #include<iostream> #include<cstring> using namespace std; int n,m,a[30005],s[30005],ans,d[30005]; void msort(int l,int r) { if(l==r)return;//如果只

蒜头君打地鼠

蒜头君打地鼠 蒜头君最近迷上了打地鼠,但他发现同时出现在面板上的地鼠太多,于是他想改进一下他的锤子,于是他拿出了一款 k \times kk×k 大小的正方形锤子,但是遗憾的是,这个锤子只能斜着砸.如下图所示: 当 k=2k=2 时,若蒜头君敲击黑点,黑点和图中所有蓝色点将一并被敲到. 当 k=3k=3 时,锤子的图案如下所示: 1 - - * - - 2 - * * * - 3 * * x * * 4 - * * * - 5 - - * - - kk 取其他值时以此类推. 注意:蒜头君只能敲击

蒜头君的树

蒜头君的树 蒜头君有一棵有根树,树的每一边都有边权,蒜头君想知道任意两点间最短距离之和为多少.另外,由于各种原因,蒜头君的树的边的边权会发生若干次改变,蒜头君想让你告诉他,每一次改变后,任意两点间最短距离之和为多少? 输入格式 第一行一个正整数 nn,表示蒜头君的树上的结点个数. 接下来 n-1n?1 行,每行两个正整数 x_i,y_ix?i??,y?i??,x_ix?i?? 表示 i+1i+1 号结点的父亲结点的编号,保证其父结点编号小于自己编号.y_iy?i?? 表示 i+1i+1 号结点的

蒜头君救人

蒜头君是一个乐于助人的好孩子,这天他所在的乡村发生了洪水,有多名村民被困于孤岛上,于是蒜头君决定去背他们离开困境,假设蒜头君所在的村子是 n \times mn×m 的网格,网格中.号代表平地,#号代表该地已被洪水淹没,A.B--等大写字母表示该地有村民被困,s代表蒜头君的起点,t代表蒜头君的终点. 蒜头君的初始速度为 kk 秒一格,他每次可以向上下左右 44 个方向中的一个移动 11 格.在背上一个村民后,他的速度可能会降低,也可能会加快,但他的速度不能快于 11 秒每格,那么蒜头君想知道,他

蒜头君的兔子

蒜头君的兔子 2017-09-03 题目描述 蒜头君的小伙伴在 第一年 送给他一对 一岁 的兔子,并告诉他:这种兔子 刚生下来时算 0 岁,到了 2 岁时就可以繁殖了,它在 2?10 岁时,每年会生下来一对兔子,这些兔子到了 2 岁也可以繁殖,但这些兔子在 10 岁那年生完仔后 不久就会死亡,蒜头君想知道,第 n 年兔子 产仔之后(第 n 年 10 岁的兔子此时已经死亡),他会有多少对兔子.结果对 1000000007 取模. 输入格式 共一行,一个正整数 n,表示蒜头君想知道第 nn 年的兔子

最长上升子序列——蒜头君的娃娃

蒜头君十分喜爱它的娃娃,经常会把它们摆成一列.蒜头君从左到右依次给他们编号为 11 到 NN,每个娃娃都有自己的萌值 T_iT?i??.现在蒜头君想从已经摆好的队列中,去除几个娃娃,使得剩余的队列满足以下条件: \displaystyle T_1 < ... < T_i > T_{i+1} > ... > T_K (1 \leq i \leq K)T?1??<...<T?i??>T?i+1??>...>T?K??(1≤i≤K) 现在已知队列中 N

蒜头君的坐骑

蒜头君有一只坐骑,人马. 一天,蒜头君骑着他的坐骑走上了一片 n \times mn×m 的大荒野,一开始时,蒜头君在 (1,1)(1,1) 点,他要前往 (n,m)(n,m) 点,蒜头君的人马每次可以向右或向下移动一格.然而这片荒野并不平静,除了起点和终点外每个点都有一只怪物会袭击蒜头君. 然而蒜头君的人马强大无比,它会先对怪物造成等同于它攻击力的伤害,然后蒜头君才会受到怪物的攻击,伤害等同于怪物的攻击力.然后人马再攻击怪物,怪物再攻击蒜头君,直至怪物死去,假设每个怪物具有相同的体力. 此外,

RMQ——蒜头君的玩具娃娃(区间范围最大值-区间范围最小值)

蒜头君有 N 个玩具娃娃,编号依次从 1 到 N,每个娃娃都有自己的高度值.蒜头君想考考聪明的你,蒜头君会有 Q 次询问,每次询问给定两个整数 A 和 B,求问编号 A 和编号 B 之间(包含编号 A 和编号 B),高度最大的娃娃和高度最小的娃娃差是多少. 输入格式 第一行输入两个正整数 N,Q(N≤50,000,Q≤200,000).代表 N 个玩具娃娃,以及蒜头君的 Q 次 询问. 接下来输入 N 行,每行输入一个正整数 h?i??(1≤h?i??≤1,000,000),表示第i 个玩具的高

61计蒜客 动态规划基础 蒜头君的城堡之旅

蒜国地域是一个 n 行 m 列的矩阵,下标均从 1 开始.蒜国有个美丽的城堡,在坐标 (n,m) 上,蒜头君在坐标 (1,1) 的位置上.蒜头君打算出发去城堡游玩,游玩结束后返回到起点.在出发去城堡的路上,蒜头君只会选择往下或者往右走,而在返回的路上,蒜头君只会选择往上或者往左走,每次只能走一格.已知每个格子上都有一定数量的蒜味可乐,每个格子至多经过一次. 现在蒜头君请你来帮他计算一下,如何计划来回行程,可以收集到最多的蒜味可乐. 输入格式 第一行输入两个整数 n,m(1≤n,m≤50),表示蒜