亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

POJ - 2299 Ultra-QuickSort解題報告

2019-11-08 03:25:03
字體:
來源:轉載
供稿:網友
題目大意:給你一串數(500,000),問你給他們按大小排序至少需要調換幾次(只能相鄰的調換)。思路:下面引入概念:對于一組數n,有n*(n-1)/2對組合,現在,定義如果a[i]>a[j]&&i<j,那么數a[i]和a[j]的位置相反?,F在設這一組數中,有s對數的位置相反了。那么s=b[1]+b[2]+...+b[n](b[i]表示a[i]前面有b[i]個數和他的位置相反了)。現在證明:要想使數組a[]變成從小到大排列,那么至少需要調換s次相鄰的數,并且只需要調換s次,就能成功。1.對于a[i]>a[i+1],那么我只要調換a[i]和a[i+1],b[]數組值改變的只有b[i+1]--;即s--;也就是說,s的值只有進行一次合適的調換之后,才能減少一個,不可能通過一次調換減少2個及以上。由此得知,至少要調換s次相鄰的數,s的值才能變成0,此時才可能是從小到大的順序。另外也可以換一種想法理解這個事,現在我假設存在一串從小到大的數列,那么我顯然可以通過調換若干次相鄰兩個數的位置,使其變成任意順序的數列,那么,在這個過程中,每次調換a[i]和a[i+1]只會使得b[i+1]++,即s++;(當然這還是最理想的狀況,有可能調換之后s--也說不定。) 我現在尋求的是,通過最少的調換次數使得s最快的增加的方法,那么,也只可能是一次調換,s增加1。這也就是說,我不可能通過少于s次的相鄰數調換,使得一個從小到大的數列,變成逆序對數的和為s的數列。那我至少也要把這s次調換倒著做一遍,才可以把任意序列的數組變成標準順序。2.假設任意相鄰的兩個數調換都不能使s變小,那么一定是對于任意的i,都有a[i]>=a[i+1]。這也就是說,a[]數組已經排序完成。所以,得證,不可能出現數組還沒有排序好卻所有的相鄰的數交換都不能使s減少的情況這也就說明了,s次調換每一次都可以使得s--,即s次調換一定可以恢復標準順序。綜上,問題就變成了求一串數的逆序和(記從小到大為標準序)關于時間復雜度的分析:要是求出每個數a[i]的b[i],那么,那么,那么,一般的思路就是對于每個數,查找他前面的數有多少個比他小的。然后記錄在b[]數組中,但是這樣保守估計500,000*(500,000-1)/2肯定是超時了。一般數據規模500,000的話,應該就是O(n)的復雜度了,況且這道題還是多組數據輸入。O(nlogn)也可以接受。關于樹狀數組:這個樹狀數組求逆序對數看了好半天才看明白。

首先先說一下什么是樹狀數組吧,我理解的應該就是線段樹的變形(也可能線段樹是樹狀數組的變形,只不過我先知道的線段數)。其實大概就是把數合組,首先兩個合成一組。然后再四個合成一大組,八個合成更大一組,以此類推。然后合成的組可以代替該組的最大標號數據。如圖:

然后就是用樹狀數組求逆序對數了,首先先是建好空的如上圖的樹狀數組(c數組的值都為0,但是樹狀數組的大小已經知道了)。然后一個一個的按照順序添加數(加入j就是把a[j]賦值成1),在這個過程中,每一個瞬間c[i]都表示當前時刻i組(以第i號數為尾的最大組)有多少個數在數組里了。每添加一個a[i],都會改變若干個c[]數組的值,同時可以確定s[i](該數組在數i前面有多少個比i還小的數),確定方法,比如:s[6]=c[6]+c[4];s[8]=c[7]+c[6]+c[4];此時也就確定了該數組在第j個數i之前有多少個比它大的數j-s[i]。

總結:這么存這個數的好處就是,有規律的把一串數分成幾個合適大小的組,這樣既不會使得層數太高(比如c[i]表示前i個數怎么怎么樣就是太高了),也可以很方便的訪問幾個連續的數的總結果。

 

另外關于離散化(我覺得就是把一堆數密集化啊@_@)的問題,我覺得還是用結構體比較方便啊~

 

關于為什么要是歸并排序而不是冒泡排序:

冒泡排序超時啊,這不是廢話嗎,但是,假如不超時,那么,冒泡排序過程中調換的次數是不是就是最少的相鄰調換次數。每次調換都可以使s--,顯然得出的次數就是逆序對數。那為什么冒泡排序比歸并排序慢呢,簡單一想,肯定是因為做了太多的并不需要交換位置的判斷。

#include<iostream>#include<stdio.h>#include<algorithm>#include<string.h>#define N 500000+500using namespace std;int n;int b[N]={0};//離散化之后的數 bool a[N]={0};//標記數i是否已經在數組里面了 int c[N]={0};//樹狀數組的那個值唄~ int s[N]={0};//數i前面有s[i]個數比它大//int m[N]={0};//數i前面有m[i]個數比它小 struct shu{	int v;	int ord;}d[N]={0};bool cmp1(shu a,shu b){	if(a.v<b.v)return 1;	else return 0;}void init()//預處理,輸入并離散化處理 {	for(int i=1;i<=n;i++)//輸入n個數(1-n) 	{		scanf("%d",&d[i].v);		d[i].ord=i;	}	sort(d+1,d+n+1,cmp1);	for(int i=1;i<=n;i++)	{		b[d[i].ord]=i;	}}void ceshi1(){	for(int i=1;i<=n;i++)	{		cout<<b[i]<<" ";	}	cout<<endl;}void add(int x)//把x加入到數狀數組中 {	a[x]=1;	int t=x;	while(t<=n)	{		c[t]++;		t+=(t&(-t));	}}int out(int x)//把數x之前(包括x)的所有a都加在一起(即合適的c加到一起) {	int s=0;	while(x>0)	{		s+=c[x];		x=x-(x&(-x));	}		return s;}void sol(){	for(int i=1;i<=n;i++)	{		add(b[i]);//把b數組第i個數加入到數組中		s[i]=i-out(b[i]);	}}int main(){	while(cin>>n)	{		if(n==0)break;		memset(a,0,sizeof(a));		memset(c,0,sizeof(c));		init();		//ceshi1();		long long int sum=0;		sol();		for(int i=1;i<=n;i++)		{			sum+=s[i];		}		PRintf("%lld/n",sum);	}}

注:最后關于樹狀數組訪問時和插入一個數據后,如何尋找需要的節點的問題,會找時間證明。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产老师黑色丝袜高跟鞋| www.日韩视频| 精品亚洲永久免费精品| 欧美日韩国产第一页| 国产精品av网站| 亚洲国产欧美一区二区三区同亚洲| 最好看的2019年中文视频| 中文字幕视频在线免费欧美日韩综合在线看| 欧美性受xxxx白人性爽| 欧美电影在线观看| 国产日韩在线亚洲字幕中文| 好吊成人免视频| 97人人做人人爱| 成人中文字幕在线观看| 欧美视频精品一区| 精品国产网站地址| 亚洲 日韩 国产第一| 亚洲欧美日韩精品久久| 91精品久久久久久久久久另类| 91久久国产精品| 亚洲精品狠狠操| 少妇av一区二区三区| 亚洲一区二区三区四区视频| 全色精品综合影院| 亚洲自拍偷拍第一页| 亚洲福利视频久久| 91九色国产社区在线观看| 久久天堂av综合合色| 亚洲美女性生活视频| 日韩激情av在线免费观看| 久久夜色精品国产欧美乱| 亚洲女人天堂成人av在线| 久久久电影免费观看完整版| 91久久精品美女高潮| 欧美一区二区三区免费视| 日韩电影中文 亚洲精品乱码| 亚洲精品国产精品国自产观看浪潮| 久久高清视频免费| 97国产成人精品视频| 欧美激情在线播放| 九九热这里只有精品6| 另类少妇人与禽zozz0性伦| 日韩av中文字幕在线| 国产91九色视频| 美女999久久久精品视频| 欧美一二三视频| 久久av中文字幕| 一本色道久久综合亚洲精品小说| 6080yy精品一区二区三区| 欧美黑人巨大xxx极品| 草民午夜欧美限制a级福利片| 久久躁狠狠躁夜夜爽| 色阁综合伊人av| 日本一本a高清免费不卡| 色偷偷噜噜噜亚洲男人| 日韩一区二区三区国产| 中文字幕国产亚洲| 亚洲天堂av高清| 亚洲精品欧美日韩| 欧美激情欧美激情在线五月| 7m第一福利500精品视频| 国产精品第1页| 欧美日韩免费网站| 久久精品国产欧美激情| 日韩一区在线视频| 亚洲理论电影网| 97福利一区二区| 性色av香蕉一区二区| 亚洲 日韩 国产第一| 国产女人18毛片水18精品| 精品亚洲aⅴ在线观看| 中国人与牲禽动交精品| 韩日精品中文字幕| 亚洲欧洲国产精品| 亚洲成人精品视频在线观看| 欧美成人亚洲成人日韩成人| 亚洲伊人成综合成人网| 国产精品女主播视频| 中文字幕亚洲国产| 日韩欧美aⅴ综合网站发布| 国产欧美一区二区三区在线| 久久999免费视频| 色青青草原桃花久久综合| 国产视频丨精品|在线观看| 成人网在线观看| 一本一本久久a久久精品牛牛影视| 欧美成人一二三| 国产精品美女无圣光视频| 伊人一区二区三区久久精品| 国产精品视频免费观看www| 日韩国产高清视频在线| 亚洲精品一区在线观看香蕉| 69久久夜色精品国产69乱青草| 久久精品国产2020观看福利| 日本成人精品在线| 亚洲天堂男人天堂| 亚洲午夜av久久乱码| 久久精品视频导航| 黄色成人在线播放| 日韩中文在线观看| 欧美成人中文字幕| 精品网站999www| 欧美在线日韩在线| 欧美精品在线看| 亚洲精品视频久久| 一区三区二区视频| 91成品人片a无限观看| 久久久久久亚洲精品中文字幕| 国产精品2018| 精品一区二区三区四区| 成人免费在线视频网站| 亚洲视频777| 国产精品一区二区三| 日韩久久免费视频| 久久综合五月天| 日韩久久免费电影| 亚洲精品国产欧美| 最新国产成人av网站网址麻豆| 亚洲女同精品视频| 日韩在线播放视频| 成人精品视频在线| 欧美第一黄网免费网站| 久久久久久久999| 亚洲精品国产精品自产a区红杏吧| 亚洲美女久久久| 日本精品久久久| 欧美高清videos高潮hd| 国产噜噜噜噜噜久久久久久久久| 日日骚av一区| 91亚洲国产精品| 久久天天躁狠狠躁夜夜av| 久久久久99精品久久久久| 26uuu亚洲国产精品| 欧美激情精品久久久久久免费印度| 精品久久久久久中文字幕大豆网| 欧美肥老妇视频| 国产精品成人久久久久| 久久精品国产免费观看| 国产精品一区专区欧美日韩| 国产精品久久网| 久久伊人免费视频| 成人免费观看49www在线观看| 亚洲国产精品网站| 在线观看成人黄色| 97视频在线观看免费| 91亚洲精品在线观看| 欧美成人午夜视频| 国产亚洲免费的视频看| 午夜免费日韩视频| 91性高湖久久久久久久久_久久99| 亚洲国产精品久久久| 中文字幕在线看视频国产欧美| 97色在线观看免费视频| 欧美高清在线视频观看不卡| 最新国产精品亚洲| 亚洲欧美日韩一区二区三区在线| 日本免费久久高清视频| 久久韩国免费视频| 国产一区二区三区在线| 国产精品小说在线| 日韩一级裸体免费视频| 亚洲国产成人爱av在线播放| 国产福利精品av综合导导航| 久久综合免费视频影院|