我怀疑那个k是用来定界限用的
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 struct edge{ 6 int x,y,z,ans,cnt; 7 } a[200050]; 8 int n,i,k,num,t; 9 int tr[200050],f[200050]; 10 int read(){ 11 int sum=0; 12 char c=getchar(); 13 while (c<'0'||c>'9') c=getchar(); 14 while (c>='0'&&c<='9') { 15 sum=sum*10+c-'0'; 16 c=getchar(); 17 } 18 return sum; 19 } 20 bool cmp2(edge a,edge b) { 21 if (a.y==b.y) return a.z<b.z; 22 else return a.y<b.y; 23 } 24 bool cmp1(edge a,edge b) { 25 if (a.x==b.x) return cmp2(a,b); 26 else return a.x<b.x; 27 } 28 void add(int x,int y){ 29 while (y<=t) { 30 tr[y]+=x; 31 y=y+(y&(-y)); 32 } 33 } 34 int query(int y){ 35 int s=0; 36 while (y>0) { 37 s+=tr[y]; 38 y=y-(y&(-y)); 39 } 40 return s; 41 } 42 void cdq(int l,int r) { 43 if (l==r) return; 44 int mid=(l+r)>>1; 45 cdq(l,mid); cdq(mid+1,r); 46 sort(a+l,a+mid+1,cmp2); 47 sort(a+mid+1,a+r+1,cmp2); 48 int l1,t,i; 49 l1=l; 50 for (i=mid+1;i<=r;i++){ 51 while (a[i].y>=a[l1].y&&l1<=mid) { 52 add(a[l1].cnt,a[l1].z); 53 l1++; 54 } 55 a[i].ans+=query(a[i].z); 56 } 57 // if (l1==mid) l1++; 58 for (i=l;i<=l1-1;i++) 59 add(-a[i].cnt,a[i].z); 60 } 61 int main(){ 62 // freopen("1.in","r",stdin); 63 // freopen("1.out","w",stdout); 64 n=read(); t=read(); 65 for (i=1;i<=n;i++) { 66 a[i].x=read();a[i].y=read();a[i].z=read();} 67 sort(a+1,a+n+1,cmp1); 68 for (i=1;i<=n;) { 69 k=i+1; 70 while (a[i].x==a[k].x&&a[i].y==a[k].y&&a[i].z==a[k].z&&k<=n) k++; 71 num++; 72 a[num]=a[i]; 73 a[num].cnt=k-i; 74 i=k; 75 } 76 cdq(1,num); 77 for (i=1;i<=num;i++) { 78 f[a[i].ans+a[i].cnt-1]+=a[i].cnt; 79 } 80 for (i=0;i<=n-1;i++) 81 printf("%d\n",f[i]); 82 }