首页 > 其他分享 >一道逆序对题

一道逆序对题

时间:2024-01-15 20:37:18浏览次数:26  
标签:typedef 下标 一道 int 对题 数组 problem 逆序

CF1915F

https://codeforces.com/contest/1915/problem/F

先了解什么是逆序对 https://www.luogu.com.cn/problem/P1908 即i < j但a[i] > a[j]的数对。
求解的方法:树状数组求解。
树状数组维护的其实就是一个区间内比他大并且比他先出现的值,每次查询的范围就是在原数组的下标之前。
我们可以先将数组按照第一关键字为值,第二关键字为下标数从大到小排序,一是离散化处理,二是为了让值相同,下标大的先出现,这样在统计的过程中,就不会多统计。

现在回到本题。
手画一下,当一个区间[l, r], [x, y],是完全包含的关系的时候,就是一种合法的情况。先将所有l排序,这时的顺序是l从小到大的顺序,然后对该顺序下的r统计逆序对(这里面的思维有点绕,需要理清楚)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int mod = 998244353, INF = 1 << 30;
const int N = 2e5 + 10;
PII a[N], b[N];
LL c[N];
int n;


int lowbit(int x) {
    return x & (-x);
}

void update(int p, LL k) {
    for (; p <= n; p += lowbit(p)) {
        c[p] += k;
    }
}

LL ask(int p) {
    LL ans = 0;
    while (p) {
        ans += c[p];
        p -= lowbit(p);
    }
    return ans;
}

void solve() {
    cin >> n;
    vector<int> B(n + 1);
    for (int i = 1; i <= n; i ++) {
        cin >> a[i].first;
        a[i].second = i;
        cin >> B[i];
        c[i] = 0;
    } 
    sort(a + 1, a + 1 + n);
    LL ans = 0;
    for (int i = 1; i <= n; i ++) {
        b[i].first = B[a[i].second];
        b[i].second = i;
    }
    sort(b + 1, b + 1 + n, greater<PII>());
    for (int i = 1; i <= n; i ++) {
        ans += ask(b[i].second - 1);
        update(b[i].second, 1);
    }
    cout << ans << endl;
}


int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int t = 1;
    cin >> t;
    while(t --) solve();
    return 0;
}

标签:typedef,下标,一道,int,对题,数组,problem,逆序
From: https://www.cnblogs.com/lu1no/p/17966231

相关文章

  • 对于 EI K 逆序对排列计数的另一种自然求和方法的理解
    有一个简单的\(O(n^3)\)DP,考虑\(f_{x+1,k}=\sum_{j=0}^{x}f_{x,k-j}\),利用前缀和优化即可。考虑这实际上是\(f_{x+1}(k)=f_x(k)*\frac{1-k^{x+1}}{1-k}\),于是答案实际上为:\[[x^k]f(x)=\prod_{i=1}^n\frac{1-x^i}{1-x}\]接下来的方法来自......
  • 一道字节的 TS 体操面试真题
    前天,小册群友问了我一个TS体操问题,说是面字节时遇到的。今天又催了一下:面试题是这样的:让实现这个FormatDate的类型,用来限制字符串只能是指定的日期格式。看起来好像没多大难度,就是提取出YY、MM、DD和分隔符,然后构造对应的字符串类型就好了。但上手试了一下,还真没那么简单。首......
  • 输入一个整数,将这个整数以字符串的形式逆序输出 程序不考虑负数的情况,若数字含有0,则逆
    描述输入一个整数,将这个整数以字符串的形式逆序输出程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001数据范围:0\len\le2^{30}-1\0≤n≤230−1输入描述:输入一个int整数输出描述:将这个整数以字符串的形式逆序输出点击查看代码#include<i......
  • 设计一个函数实现字符串的逆序,并且不可以使用库函数
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>voidreverse_string(chararr[],intsz){ intleft=0; intright=sz-1; while(arr[left]<arr[right]) { inttmp=arr[left]; arr[left]=arr[right]; arr[right]=tmp; left++; ......
  • js一道try...catch的面试题
    说到try...catch都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上:try...catch只能捕捉到同步执行代码块中的错误。题目是:以下代码有错吗?如果有错,应该如何改正?try{setTimeout(()=>{thrown......
  • 记一道攻防世界上的Reverse-gametime
    一、题目描述把文件下载下来,运行后发现是一个简单的小游戏,属于那种玩通关了就给flag的,自己先玩了一下,玩了一下大概游戏规则就是看到s就按空格,遇到x就按x,遇到m就按m,但是玩到后面速度非常快,如果你足够厉害,玩到后面应该是可以玩出来的。这里我们就要IDA进行静态分析,又是小......
  • 记一道TWCTF的misc-gif
    misc-gif:题目描述:附件下载下来后发现是一张.gif的动图解题方法:仔细观察发现这张动图里面有黑色的字母在闪烁,猜测它的flag信息可能就隐藏在里面:编写python脚本来将它逐帧分离:fromPILimportImageim=Image.open(r'D:\桌面/flag.gif')#读入一个GIF文件try:im.sav......
  • 记一道ISCTF2022中misc-LSB
    ISCTF-misc-LSB:题目描述:这是一道ISCTF2022上面misc里面一道图片隐写题,而且出题人还给了提示,hint:注意大小端问题题目附件下载下来是一张png的图片:第一步:将图片放进010_editor里面查看一下它的16进制:在数据底部发现了一个zip的压缩包,而且压缩包里面有个flags.txt的文档,然后......
  • 很有意思的一次周赛,虽然被打爆了,呜呜,动了四题,只ac一道板子
    第三次周赛题解A.前缀和观察题cao分奇偶注意观察---奇数()只有第一个和第二个会是奇数后面全是前面累乘2if(x%2!=0)x要么是第一个要么是第二个(无区别)因为1,2元素大小相等剩下元素a[n]=pow(2,n-2)*x;else不是奇数化为奇数llq=x;//保存一下结果,后面要特判whil......
  • 前段时间面试Java碰到的一道有意思的题目
    看题前一段时间面试碰见一道题目,感觉挺有意思,特意记录了下来。大概内容就是有一个全局变量i,然后在main方法中有两个嵌套for循环,分别循环100次,然后循环中,开启新线程对变量i执行i++的操作。我对其简单做了一下修改。一起来看下这道题目,不运行,用肉眼的看的话,你觉得是多少?给你1min思......