yukicoder 743 - Segments on a Polygon
問題
m頂点の凸多角形があり、各頂点には0〜m-1の番号が割り振られている
ここに2つの頂点同士を結ぶような線分をn個追加する
追加した線分同士の交点の数を求めよ
1 <= n <= 10^5
3 <= m <= 2*10^5
解法
任意のiでa[i] < b[i]となるようにswapし、線分たちをa[i]の昇順にソートすると、i本目の線分がj(<i)本目の線分と交わるのは
a[i] < b[j] < b[i]
を満たすときになる
BITで↑を満たすようなjの個数を求めていけばいい
ll n, m, x, y, res; pair<int,int> p[100100]; BIT<int,20> b; signed main() { cin >> n >> m; rep(i,n) { cin >> x >> y; if (x>y) swap(x,y); p[i] = {x,y}; } sort(p,p+n); rep(i,n) { res += b.sum(p[i].second) - b.sum(p[i].first); b.add(p[i].second, 1); } cout << res << endl; }