纠结了许久,题目都看了半天,还是看了别人的题意才似懂非懂,最后看了别人的代码才AC了。
ACcode:
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
const int size=16000;
vector<int> vis[(size>>1)+10];
int tre[size<<2];
int mark[(size>>1)+10];
struct Point
{
int y1,y2,x;
}data[size>>1];
bool cmp(Point a1,Point a2) { return a1.x<a2.x; }
void query(int rt,int l,int r,int L,int R,int id)
{
if (tre[rt]!=-1)
{
if (mark[tre[rt]]!=id)
{
vis[tre[rt]].push_back(id);
mark[tre[rt]]=id;
}
return ;
}
if (l==r) return ;
int mid=(l+r)>>1;
if (L<=mid) query(rt<<1,l,mid,L,R,id);
if (R>mid) query(rt<<1|1,mid+1,r,L,R,id);
}
void pushdown(int rt)
{
if (tre[rt]!=-1)
{
tre[rt<<1]=tre[rt<<1|1]=tre[rt];
tre[rt]=-1;
return ;
}
}
void update(int rt,int l,int r,int L,int R,int id)
{
if (L<=l&&r<=R)
{
tre[rt]=id;
return ;
}
pushdown(rt);
int mid=(l+r)>>1;
if (L<=mid) update(rt<<1,l,mid,L,R,id);
if (R>mid) update(rt<<1|1,mid+1,r,L,R,id);
}
int main()
{
int ncase,n,i,j,k,s,t,q,cnt;
scanf("%d",&ncase);
while (ncase--)
{
scanf("%d",&n);
memset(tre,-1,sizeof(tre));
memset(mark,-1,sizeof(mark));
for (i=0;i<n;i++)
{
scanf("%d %d %d",&data[i].y1,&data[i].y2,&data[i].x);
data[i].y1<<=1,data[i].y2<<=1;
vis[i].clear();
}
sort(data,data+n,cmp);
for (i=0;i<n;i++)
{
query(1,0,size,data[i].y1,data[i].y2,i);
update(1,0,size,data[i].y1,data[i].y2,i);
}
for (cnt=i=0;i<n;i++)
{
for (j=0;j<vis[i].size();j++)
{
s=vis[i][j];
for (k=j+1;k<vis[i].size();k++)
{
t=vis[i][k];
for (q=0;q<vis[s].size();q++)
if (vis[s][q]==t) cnt++;
}
}
}
printf("%d\n",cnt);
}
return 0;
}