题目链接:POJ 3067 Japan
Japan
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 32076 | Accepted: 8620 |
Description
Input
Output
Test case (case number): (number of crossings)
Sample Input
1 3 4 4 1 4 2 3 3 2 3 1
Sample Output
Test case 1: 5
Source
1 #include <map> 2 #include <set> 3 #include <vector> 4 #include <cstdio> 5 #include <cstring> 6 #include <iostream> 7 #include <algorithm> 8 #define ll long long int 9 #define INF 0x3f3f3f3f 10 using namespace std; 11 12 const int MAXN = 1002; 13 int N, M, K; 14 int c[MAXN*MAXN]; 15 16 struct node 17 { 18 int x, y; 19 }num[MAXN*MAXN]; 20 21 bool cmp(struct node a, struct node b) 22 { 23 if(a.x == b.x) 24 return a.y <= b.y; 25 return a.x < b.x; 26 } 27 28 int lowbit(int x) 29 { 30 return x&(-x); 31 } 32 33 void add(int i, int value) 34 { 35 while(i <= M) 36 { 37 c[i]+=value; 38 i+=lowbit(i); 39 } 40 } 41 42 ll sum(int i) 43 { 44 ll res = 0; 45 while(i > 0) 46 { 47 res+=(ll)c[i]; 48 i-=lowbit(i); 49 } 50 return res; 51 } 52 53 int main() 54 { 55 int T_case = 0; 56 int t = 0; 57 scanf("%d", &T_case); 58 while(T_case--) 59 { 60 t++; 61 scanf("%d%d%d", &N, &M, &K); 62 memset(c, 0, sizeof(c)); 63 for(int i = 1; i <= K; i++) 64 { 65 scanf("%d%d", &num[i].x, &num[i].y); 66 } 67 sort(num+1, num+K+1, cmp); 68 ll ans = 0; 69 for(int i = 1; i <= K; i++) 70 { 71 add(num[i].y, 1); 72 ans+=(i-sum(num[i].y)); 73 } 74 printf("Test case %d: %lld\n", t, ans); 75 } 76 return 0; 77 }
2131



被折叠的 条评论
为什么被折叠?



