【Luogu1393】動態逆序對(CDQ分治)

【Luogu1393】動態逆序對(CDQ分治)

題面

題目描述

對于給定的一段正整數序列,我們定義它的逆序對的個數為序列中ai>aj且i < j的有序對(i,j)的個數。你需要計算出一個序列的逆序對組數及其刪去其中的某個數的逆序對組數。

輸入輸出格式

輸入格式:

第一行,兩個數n,m,表示序列中有n個數,要刪去m個數

第二行n個數,表示給定的序列。

第三行m個數,第i個數di表示要刪去原序列中的第di個數。

輸出格式:

一行m+1個數。第一個數表示給定序列的逆序對組數,第i+1個數表示刪去第di個數后序列的逆序對組數(刪去的數不再恢復)

輸入輸出樣例

輸入樣例#1:

6 3
5 4 2 6 3 1
2 1 4

輸出樣例#1:

11 7 4 2

說明

對于20%的數據,n≤2500

對于另30%的數據,m=0

對于100%的數據,n≤40000,m≤n/2,且保證第二行n個數互不相同,第三行m個數互不相同

題解

之前不是說過要寫一遍CDQ分治嗎??
在這里說的
可是,當你把上面的代碼興高采烈的Copy到洛谷上之后
你就會直接WA了
因為,題目還是有點不同的(仔細讀題)
區別一:這題不是排列,要離散化
區別二:這題刪掉的不是數字,而是位置

好了回歸正題,講講CDQ分治怎么寫
首先,給所有刪掉的數編個號,就按照刪去的順序來吧
沒有刪掉的數就編個INF吧

那么,刪掉這個數之后,減少的逆序對對數是:
對于\(j\in[1,j]\)
\(t[i]<t[j]\),其中t是刪除的編號
并且
\(i<j,a[i]>a[j]\)
或者
\(i>j,a[i]<a[j]\)
所以,刪除的編號直接sort搞完
剩下的兩維CDQ分治

于是,發現這個玩意是一個三維偏序
所以之前寫過的樹狀數組套平衡樹當然也可以做啦
但是,CDQ分治還是要會嗷。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 50000
inline int read()
{int x=0,t=1;char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int n,m,S[MAX],a[MAX],b[MAX],c[MAX],d[MAX];
long long ans;
int lowbit(int x){return x&(-x);}
void Add(int x,int w){while(x<=n)c[x]+=w,x+=lowbit(x);}
int getsum(int x){int ret=0;while(x)ret+=c[x],x-=lowbit(x);return ret;}
struct Node
{int t,p,a;int s;
}t[MAX];
bool operator<(Node a,Node b){return a.t<b.t;}
bool cmp(Node a,Node b){return a.p<b.p;}
void CDQ(int l,int r)
{if(l==r)return;int mid=(l+r)>>1;CDQ(l,mid);CDQ(mid+1,r);sort(&t[l],&t[mid+1],cmp);sort(&t[mid+1],&t[r+1],cmp);int j=mid;for(int i=l;i<=mid;++i){while(j<r&&t[j+1].p<t[i].p)++j,Add(t[j].a,1);t[i].s+=getsum(n)-getsum(t[i].a);}for(int i=mid+1;i<=j;++i)Add(t[i].a,-1);j=r+1;for(int i=mid;i>=l;--i){while(j>mid+1&&t[j-1].p>t[i].p)--j,Add(t[j].a,1);t[i].s+=getsum(t[i].a-1);}for(int i=r;i>=j;--i)Add(t[i].a,-1);
}
int main()
{n=read();m=read();for(int i=1;i<=n;++i)S[i]=a[i]=read();sort(&S[1],&S[n+1]);for(int i=1;i<=n;++i)b[a[i]=lower_bound(&S[1],&S[n+1],a[i])-S]=i;for(int i=n;i;i--)ans+=getsum(a[i]),Add(a[i],1);for(int i=1;i<=n;++i)t[i].t=n+1,t[i].p=i,t[i].a=a[i];for(int i=1;i<=m;++i){d[i]=read();t[d[i]].t=i;}sort(&t[1],&t[n+1]);memset(c,0,sizeof(c));CDQ(1,n);for(int i=1;i<=n;++i)c[t[i].p]=t[i].s;printf("%lld ",ans);for(int i=1;i<=m;++i)printf("%lld ",ans=ans-c[d[i]]);return 0;
}

轉載于:https://www.cnblogs.com/cjyyb/p/8127824.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390461.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390461.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390461.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS底層原理探究-Runloop

Runloop 1. 概述 一般來說&#xff0c;一個線程只能執行一個任務&#xff0c;執行完就會退出&#xff0c;如果我們需要一種機制&#xff0c;讓線程能隨時處理時間但并不退出&#xff0c;那么 RunLoop 就是這樣的一個機制。Runloop是事件接收和分發機制的一個實現。 RunLoop實際…

p2020開發_2020年最佳開發者社區

p2020開發If you want to grow as a developer, I cant over-emphasize the benefits of joining a developer community. There are many advantages, from peer-programming to sharing knowledge, mentorship, sharing support, sharing tools, code reviews, answering que…

leetcode 1838. 最高頻元素的頻數

元素的 頻數 是該元素在一個數組中出現的次數。 給你一個整數數組 nums 和一個整數 k 。在一步操作中&#xff0c;你可以選擇 nums 的一個下標&#xff0c;并將該下標對應元素的值增加 1 。 執行最多 k 次操作后&#xff0c;返回數組中最高頻元素的 最大可能頻數 。 示例 1&…

Deepin系統手動安裝oracle jdk8詳細教程

Deepin系統手動安裝oracle jdk8詳細教程 oracle官網下載jdk壓縮包&#xff0c;使用 sudo tar -zxf jdk***解壓文件&#xff0c;我放在在了home/diy/java/jdk路徑下。 jdk文件路徑&#xff1a;/home/diy/java/jdk/jdk1.8.0_152 JDK環境變量配置 修改配置文件 sudo vi /etc/profi…

Spark 鍵值對RDD操作

https://www.cnblogs.com/yongjian/p/6425772.html 概述 鍵值對RDD是Spark操作中最常用的RDD&#xff0c;它是很多程序的構成要素&#xff0c;因為他們提供了并行操作各個鍵或跨界點重新進行數據分組的操作接口。 創建 Spark中有許多中創建鍵值對RDD的方式&#xff0c;其中包括…

無服務器架構_如何開始使用無服務器架構

無服務器架構Traditionally, when you wanted to build a web app or API, you’d usually have to spend significant time and effort managing servers and ensuring your app scales up to handle large request volumes. Serverless is a cloud computing model which let…

WPF中的動畫——(一)基本概念

原文:WPF中的動畫——&#xff08;一&#xff09;基本概念WPF的一個特點就是支持動畫&#xff0c;我們可以非常容易的實現漂亮大方的界面。首先&#xff0c;我們來復習一下動畫的基本概念。計算機中的動畫一般是定格動畫&#xff0c;也稱之為逐幀動畫&#xff0c;它通過每幀不同…

cloud 異步遠程調用_異步遠程工作的意外好處-以及如何擁抱它們

cloud 異步遠程調用In this article, Ill discuss the positive aspects of being a little out of sync with your team.在本文中&#xff0c;我將討論與您的團隊有點不同步的積極方面。 So you’ve started working from home.因此&#xff0c;您已經開始在家工作。 There …

linux 問題一 apt-get install 被 lock

問題&#xff1a; sudo apt-get install vim E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable)E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? 解決&#xff1a; sudo rm /var/cac…

工信部高級軟件工程師_作為新軟件工程師的信

工信部高級軟件工程師Dear Self, 親愛的自我&#xff0c; You just graduated and you are ready to start your career in the IT field. I cannot spoil anything, but I assure you it will be an interesting ride. 您剛剛畢業&#xff0c;就可以開始在IT領域的職業了。 我…

Python高級網絡編程系列之基礎篇

一、Socket簡介 1、不同電腦上的進程如何通信&#xff1f; 進程間通信的首要問題是如何找到目標進程&#xff0c;也就是操作系統是如何唯一標識一個進程的&#xff01; 在一臺電腦上是只通過進程號PID&#xff0c;但在網絡中是行不通的&#xff0c;因為每臺電腦的IP可能都是不一…

多線程編程和單線程編程_生活與編程的平行線程

多線程編程和單線程編程I’m convinced our deepest desire is, by paying the cost of time, to be shown a glimmer of some fundamental truth about the universe. To hear it whisper its lessons and point towards its purpose.我堅信&#xff0c;我們最深切的愿望是通過…

劍指 Offer 67. 把字符串轉換成整數

寫一個函數 StrToInt&#xff0c;實現把字符串轉換成整數這個功能。不能使用 atoi 或者其他類似的庫函數。 首先&#xff0c;該函數會根據需要丟棄無用的開頭空格字符&#xff0c;直到尋找到第一個非空格的字符為止。 當我們尋找到的第一個非空字符為正或者負號時&#xff0c…

搭建MSSM框架(Maven+Spring+Spring MVC+MyBatis)

https://github.com/easonjim/ssm-framework 先欠著&#xff0c;后續再進行講解&#xff1a; 一、Spring內核集成 二、Spring MVC集成 三、MyBatis集成 四、代碼生成工具集成 >如有問題&#xff0c;請聯系我&#xff1a;easonjim#163.com&#xff0c;或者下方發表評論。<…

4.RabbitMQ Linux安裝

這里使用的Linux是CentOS6.2 將/etc/yum.repo.d/目錄下的所有repo文件刪除 先下載epel源 # wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo 修改epel-erlang.repo文件&#xff0c;如下圖 添加CentOS 的下載源…

freecodecamp_如何對freeCodeCamp文章提供反饋

freecodecampWe at the freeCodeCamp editorial team do our best to ensure articles are as accurate as they can be.我們的freeCodeCamp編輯團隊竭盡所能&#xff0c;以確保文章盡可能準確。 Still, we occasionally miss factual inaccuracies, non-functioning code exa…

如何對接oracle 建立pdb

Oracle數據庫的結構是一個數據庫實例下有許多用戶&#xff0c;每一個用戶有自己的表空間&#xff0c;即每一個用戶相當于MySQL中的一個數據庫。不久前下了oracle 12c的數據庫&#xff0c;安裝之后建user時才知道oracle12c 有一個很大的變動就是引入了pdb可插入數據庫&#xff0…

二、數據庫設計與操作

一、 數據庫設計仿QQ數據庫一共包括5張數據表&#xff0c;每張數據表結構如下&#xff1a;1、 tb_User&#xff08;用戶信息表&#xff09;這張表主要用來存儲用戶的好友關系與信息字段名數據類型是否Null值默認值綁定描述IDint否用戶賬號PwdVarchar(50)否用戶密碼Frie…

hdu 過山車_從機械工程師到軟件開發人員–我的編碼過山車

hdu 過山車There arent many people out there who grew up dreaming of writing code. I definitely didnt. I wanted to design cars. But somehow I ended up building software.很少有人夢見編寫代碼。 我絕對沒有。 我想設計汽車。 但是我最終以某種方式開發了軟件。 I u…

mysql 兩列互換

mysql 如果想互換兩列的值&#xff0c;直接寫 update 表 set col1col2&#xff0c;col2col1 這樣的后果就是兩列都是 col2 的值 注意這和sql server 是不同的&#xff0c; 如果想實現上述功能&#xff0c;添加一個自增列作為標識&#xff08;必須的&#xff09;&#xff0c; u…