题意:日本东海岸有n个城市,西海岸有m个城市,现在要修建k条高铁连接东海岸的城市u和西海岸的城市v。问这k条高铁总共有多少个交点。 思路:树状数组。(本人未理解,装载供以后学习) 代码: #include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int MAX = 1009; typedef long long ll; ll arr[MAX]; int n,m,k; struct way { int e,w; }w[MAX*MAX]; int lowbit(int k) { return k&(-k); } void modify(int num) { while(num <= m) { arr[num] += 1; num += lowbit(num); } } ll sum(int num) { ll ans = 0; while(num > 0) { ans += arr[num]; num -= lowbit(num); } return ans; } int cmp(way a, way b) { if(a.e == b.e) return a.w > b.w; return a.e > b.e; } int main(void) { int test; int c=0; scanf("%d",&test); while(test--) { memset(arr,0,sizeof(arr)); scanf("%d%d%d",&n,&m,&k); int i; for(i=0; i<k; i++) scanf("%d%d",&w[i].e,&w[i].w); sort(w,w+k,cmp); ll ans = 0; for(i=0; i<k; i++) { ans += sum(w[i].w-1); modify(w[i].w); } printf("Test case %d: %lld/n",++c,ans); } return 0; }