poj_3067 树状数组
題目大意
????左右兩個豎排,左邊豎排有N個點,從上到下依次標(biāo)記為1,2,...N; 右邊豎排有M個點,從上到下依次標(biāo)記為1,2....M。現(xiàn)在從K條直線分別連接左邊一個點和右邊一個點,求這K條直線的交點個數(shù)(左右豎排上的點不算做交點)。?
????給出N,M,K,以及K條線的起點和終點。
題目分析
????求兩兩交點的問題最好固定順序,如i和i之前的交點,這樣便于統(tǒng)計而不重復(fù)不遺漏。在將K條線按照左邊點從小到大的順序進行排序,左邊點相同按照右邊點從小到大排序之后,按照順序分析當(dāng)前線和它之前的線的交點個數(shù):?
????當(dāng)前線k的左邊點序號為 xa, 右邊點序號為 ya, 則對于當(dāng)前線k之前的那些線1--k-1,他們左邊點的序號肯定小于等于xa, 這些線(1--k-1)中右邊點序號大于 ya的那些線會和當(dāng)前線k有一個交點。因此對于當(dāng)前線k,統(tǒng)計之前1---k-1線的右邊點在 [ya + 1--M]中的個數(shù),形成了一個區(qū)間統(tǒng)計問題。?
????考慮右邊點1,2....M 各對應(yīng)一個統(tǒng)計變量 count[i], 每次分析線k,都將線k的右邊點ya 對應(yīng)的count[ya] ++。 這樣,每次都統(tǒng)計 [t, M]區(qū)間內(nèi) count[i]的和。 使用樹狀數(shù)組來實現(xiàn)。
實現(xiàn)(c++)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<string.h>
using namespace std;
#define MAX_CITY_NUM 1002struct Highway{int east_city;int west_city;Highway(int e, int w):east_city(e), west_city(w){}
};
vector<Highway> gHws;
int gC[MAX_CITY_NUM];
int gLowbit[MAX_CITY_NUM];bool Cmp(const Highway& h1, const Highway& h2){if (h1.east_city == h2.east_city)return h1.west_city < h2.west_city;return h1.east_city < h2.east_city;
}void InitLowbit(int n){for (int i = 1; i <= n; i++){gLowbit[i] = i&(-i);}
}
void InitSequence(int n){memset(gC, 0, sizeof(gC));
}void Update(int k, int n, int add){while (k <= n){gC[k] += add;k += gLowbit[k];}
}int Query(int k){int result = 0;while (k > 0){result += gC[k];k -= gLowbit[k];}return result;
}int main(){int cas, N, M, K, e_city, w_city;scanf("%d", &cas);InitLowbit(1001);for (int c = 1; c <= cas; c++){scanf("%d %d %d", &N, &M, &K);gHws.clear();InitSequence(M);for (int i = 1; i <= K; i++){scanf("%d %d", &e_city, &w_city);gHws.push_back(Highway(e_city, w_city));}sort(gHws.begin(), gHws.end(), Cmp);long long int crossing = 0;for (int i = 0; i < K; i++){crossing += (Query(M) - Query(gHws[i].west_city));Update(gHws[i].west_city, M, 1);}printf("Test case %d: %lld\n", c, crossing);}return 0;
}
?
轉(zhuǎn)載于:https://www.cnblogs.com/gtarcoder/p/4794694.html
總結(jié)
以上是生活随笔為你收集整理的poj_3067 树状数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: int与string转换
- 下一篇: 我苹果手机壳摔坏了,换一下多少钱?