#include<iostream> #include<cstring> #include<cstdlib> #include<vector> #include<cstdio> #include<cmath> #include<algorithm> #define lowbit(x) ((x)&-(x)) using namespace std; const int maxn=1e6 + 10; typedef long long lint; int T, n, N, M, a[maxn<<1], b[maxn<<1], s[maxn<<1]; struct line { int x1, y1, x2, y2, d; line(int xx1=0, int yy1=0, int xx2=0, int yy2=0) { x1=xx1, y1=yy1, x2=xx2, y2=yy2; } void read() { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); if(x1>x2) swap(x1, x2); if(y1>y2) swap(y1, y2); a[++N]=x1, a[++N]=x2, b[++M]=y1, b[++M]=y2; return ; } void hash() { x1=lower_bound(a+1, a+1+N, x1)-a, x2=lower_bound(a+1, a+1+N, x2)-a; y1=lower_bound(b+1, b+1+M, y1)-b, y2=lower_bound(b+1, b+1+M, y2)-b; return ; } }seg[maxn]; struct node { int d, idx; node(int dd=0, int idxx=0) { d=dd, idx=idxx; } bool operator <(const node&t)const { return d<t.d; } }; vector<node> vct[maxn]; void Add(int x, int val) { for(int i=x; i<=N; i+=lowbit(i)) s[i]+=val; return ; } int Query(int x, int ans=0) { for(int i=x; i; i-=lowbit(i)) ans+=s[i]; return ans; } void Clear() { for(int i=0; i<=M; i++) vct[i].clear(); memset(s, 0, sizeof s); N=M=0; return ; } int main() { scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=1; i<=n; i++) seg[i].read(); sort(a+1, a+1+N); sort(b+1, b+1+M); N=unique(a+1, a+1+N)-a-1; M=unique(b+1, b+1+M)-b-1; for(int i=1; i<=n; i++) seg[i].hash(); for(int i=1; i<=n; i++) { if(seg[i].y1==seg[i].y2) vct[seg[i].y1].push_back(node(1, i)); else vct[seg[i].y1].push_back(node(0, i)), vct[seg[i].y2].push_back(node(2, i)); } lint ans=0; for(int i=1; i<=M; i++) { sort(vct[i].begin(), vct[i].end()); for(int j=0, len=vct[i].size(); j<len; j++) { if(vct[i][j].d==0) Add(seg[vct[i][j].idx].x1, 1); else if(vct[i][j].d==2) Add(seg[vct[i][j].idx].x1, -1); else ans+=Query(seg[vct[i][j].idx].x2)-Query(seg[vct[i][j].idx].x1-1); } } cout<<ans<<endl; Clear(); } return 0; }
|