做回菜鳥,老老實實重新學起:資料結構;
求k大值及左右和模版:
#define n 123456
int sorted[n]=; //對原集合中元素排序後的值
int val[20][n]=; //val記錄第k層當前位置的值
int num[20][n]=; //記錄元素所在區間當前位置前的元素進入到左子樹的個數
int lnum, rnum; //詢問區間裡面k-th數左側和右側的數的個數
long long sum[20][n]=; //記錄比當前元素小的元素的和
long long lsum, rsum; //詢問區間裡面k-th數左側數之和與右側數之和
void build(int l, int r, int d)
else
if (val[d][i] > sorted[mid]) else if (val[d][i] < sorted[mid])
val[d+1][rp++] = val[d][i];
else else val[d+1][rp++] = val[d][i];}}
build(l, mid, d+1);
build(mid+1, r, d+1);
}int query(int a, int b, int k, int l, int r, int d)
else
if (s >= k)
else
}bool cmp(int a,int b)
void solve(int n,int m)
; for(int i=1;i<=n;i++)
printf("\n");
sort(sorted+1,sorted+1+n,cmp);
build(1,n,0);
int x,y,k,res;
while(m--)
}
題目參考:
poj 2104 k-th number
題意:求區間內k小值;
思路:直接劃分樹,求第k小值;
code:
#define n 123456
int sorted[n]=;
int val[20][n]=;
int num[20][n]=;
int lnum, rnum;
long long sum[20][n]=;
long long lsum, rsum;
void build(int l, int r, int d)
else
if (val[d][i] < sorted[mid]) else if (val[d][i] > sorted[mid])
val[d+1][rp++] = val[d][i];
else else val[d+1][rp++] = val[d][i];}}
build(l, mid, d+1);
build(mid+1, r, d+1);
}int query(int a, int b, int k, int l, int r, int d) else
if (s >= k) else
}bool cmp(int a,int b)
;int val[20][n]=;
int num[20][n]=;
int lnum, rnum;
long long sum[20][n]=;
long long lsum, rsum;
void build(int l, int r, int d)
else
if (val[d][i] < sorted[mid]) else if (val[d][i] > sorted[mid])
val[d+1][rp++] = val[d][i];
else else val[d+1][rp++] = val[d][i];}}
build(l, mid, d+1);
build(mid+1, r, d+1);
}int query(int a, int b, int k, int l, int r, int d)
else
if (s >= k)
else
}bool cmp(int a,int b)
printf("\n");
}int main()
return 0;
}
菜鳥系列 字典樹
做回菜鳥,老老實實重新學起 動態模版 動態鍊錶實現 define maxn 26 struct node node root 字典樹建立 void createtrie char str else 查詢 int findtrie char str return p v 返回以此為字首的串的數量 釋放...
菜鳥系列 最小生成樹
菜鳥就要老老實實重新學起 prim 遍歷所有點,找到最近的點加入樹中,更新距離陣列dist 鄰接矩陣存圖。模版 define n 1010 bool vis n int g n n dist n int prim int n return res 鄰接表存圖,公升序排列所有邊,並查集維護點集合,遍歷...
整數劃分系列
描述 將正整數n表示成一系列正整數之和 n n1 n2 nk,其中n1 n2 nk 1,k 1。正整數n的這種表示稱為正整數n的劃分。求正整數n的不 同劃分個數。例如正整數6有如下11種不同的劃分 6 5 1 4 2,4 1 1 3 3,3 2 1,3 1 1 1 2 2 2,2 2 1 1,2 1...