HDU 5857 Median(找中位數)

2021-08-21 05:28:47 字數 1841 閱讀 7267

description

給出乙個長度為n的有序序列ai,m次查詢,每次查詢輸入兩個區間[l1,r1],[l2,r2],輸出將這兩個區間的數放在一起後的中位數

input

第一行一整數t表示用例組數,每組用例首先輸入兩整數n和m表示序列長度和查詢數,之後n個整數ai表示該序列,之後每次輸入四個整數l1,r1,l2,r2表示一次查詢

(t<=200,n,m<=100000,ai最多是32位int,l1<=r1,l2<=r2)

output

對於每次查詢,輸出將兩個區間中數放在一起後的中位數

sample input

1 4 2

1 2 3 4

1 2

2 4

1 1

2 2

sample output

2.0

1.5 

如果重疊,劃分成3 個區間,

l1->l2-1,l2->r1,r1+1->r2

或者l2->l1-1,l1->r2,r2+1->r1

分別對應

a1  a2   a3  a4  a5   a6

如果是奇數

if(a2-a1+1<=x/2)

if(a2-a1+1+(a4-a3+1)*2<=x/2)

mid=c[a6-(x/2)]

else

mid=c[a4-(x/2-(a6-a5+1))/2]

else

mid=c[a1+x/2];

如果是偶數,找x/2+1=mid2;x/2=mid1

if(a2-a1+1<=x/2-1)

if(a2-a1+1+(a4-a3+1)*2<=x/2-1)

mid1=c[a6-(x/2)];

else

mid1=c[a4-(x/2-(a6-a5+1))/2];

else

mid1=c[a1+x/2-1];

if(a2-a1+1<=x/2)

if(a2-a1+1+(a4-a3+1)*2<=x/2)

mid2=c[a6-(x/2-1)];

else

mid2=c[a4-(x/2-1-(a6-a5+1))/2];

else

mid2=c[a1+x/2];

不重疊如果是奇數

if(r1-l1+1<=x/2)

mid=c[r2-x/2];

else

mid=c[l1+x/2];

如果是偶數mid1,mid2

if(r1-l1+1<=x/2-1)

mid1=c[r2-x/2];

else

mid1=c[l1+x/2-1];

if(r1-l1+1<=x/2)

mid2=c[r2-x/2+1];

else

mid2=c[l1+x/2;]

不能寫memset,會超時,,,,,一直超時!

#include#include#includeusing namespace std;

#define maxn 100000

int c[maxn+10];

int b[maxn+10];

int d[10];

int main()

if(x%2==1)

else

}else

else

}printf("%.1lf\n",mid);}}

return 0;

}//ff

HDU 找新朋友

題目大概是小於n的數中有多少個與n互素的數。這裡可以用尤拉公式。函式的值 通式 x x 1 1 p1 1 1 p2 1 1 p3 1 1 p4 1 1 pn 其中p1,p2 pn為x的所有質因數,x是不為0的整數。1 1 唯一和1 互質的數 小於等於1 就是1本身 注意 每種質因數只乙個。比如12 ...

hdu 找新朋友

題目 problem description 新年快到了,豬頭幫協會 準備搞乙個聚會,已經知道現有會員n人,把會員從1到n編號,其中會長的號碼是n號,凡是和會長是老朋友的,那麼該會員的號碼肯定和n有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你程式設計序幫會長計算出來。inpu...

hdu 1286 找新朋友

problem description 新年快到了,豬頭幫協會 準備搞乙個聚會,已經知道現有會員n人,把會員從1到n編號,其中會長的號碼是n號,凡是和會長是老朋友的,那麼該會員的號碼肯定和n有大於1的公約數,否則都是新朋友,現在會長想知道究竟有幾個新朋友?請你程式設計序幫會長計算出來。input 第...