http://www.spoj.com/problems/MSE06H/
세그먼트 트리로 풀었다.
위 그림을 참고해서 풀었음. 다듬어서 다시 업로드 예정
#include <bits/stdc++.h>
using namespace std;
typedef long long lld;
int n;
lld t[2048+1];
void update(int p, lld val){
for(t[p += n] = val; p > 1; p>>=1) t[p>>1] = t[p] + t[p^1];
}
lld query(int l, int r){ // [l, r)
lld ret = 0;
for(l += n, r += n; l < r; l >>= 1, r >>= 1){
if(l&1) ret += t[l++];
if(r&1) ret += t[--r];
}
return ret;
}
int main(){
int T;
scanf("%d", &T);
for(int tc=1; tc<=T; ++tc){
memset(t, 0, sizeof(t));
int _n, _m, k, m;
scanf("%d %d %d", &_n, &_m, &k);
n = max(_n, _m);
m = min(_n, _m);
vector<int> a[m];
while(k--){
int s, e;
scanf("%d %d", &s, &e);
if(_n <= _m)
a[s-1].push_back(e-1);
else
a[e-1].push_back(s-1);
}
lld ret = 0;
for(int i=0; i<m; ++i){
sort(a[i].begin(), a[i].end());
for(int j=0; j<a[i].size(); ++j){
int x = a[i][j];
ret += query(x+1, n);
update(x, query(x, x+1)+1);
}
}
printf("Test case %d: %lld\n", tc, ret);
}
return 0;
}
댓글 없음:
댓글 쓰기