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 第...