莫名其妙re了,本机过了,IDE也过了
查看原帖
莫名其妙re了,本机过了,IDE也过了
167279
Danno0v0楼主2022/10/9 15:41

#include<bits/stdc++.h>
#define lowbit(x) x&(-x) 
using namespace std;
struct node
{
	int x,y,z,cnt;
}nodes[1000001],nodes_[1000001];
int cnt,n_,n,k,tree[1000001],Ans[1000001],ans[1000001];
stack<pair<int,int> >sta;
int change(int x,int b)
{
	for(;b<=k;b+=lowbit(b))
		tree[b]+=x;
}
int query(int b)
{
	int ans=0;
	for(;b;b-=lowbit(b))
		ans+=tree[b];
	return ans;	
} 
bool cmp1(node a,node b)
{
	if(a.x!=b.x) return a.x<b.x;
	if(a.y!=b.y) return a.y<b.y;
	return a.z<b.z;
}
bool cmp2(node a,node b)
{
	if(a.y!=b.y) return a.y<b.y;
	return a.z<b.z;
}
void solve(int l,int r)
{
	if(l>=r) return;
	int m=(l+r)>>1;
	solve(l,m);
	solve(m+1,r);
	sort(nodes+l,nodes+m+1,cmp2);
	sort(nodes+m+1,nodes+r+1,cmp2);
	int i=l,j=m+1;	
	while(i<=m&&j<=r)
	{
		if(nodes[i].y<=nodes[j].y)
			change(nodes[i].cnt,nodes[i].z),sta.push({nodes[i].cnt,nodes[i].z}),i++;
		else
			Ans[j]+=query(nodes[j].z),j++;
	}
	while(j<=r)
		Ans[j]+=query(nodes[j].z),j++;
	while(!sta.empty())
	{
		change(-sta.top().first,sta.top().second);
		sta.pop();
	}
}
int main()
{
	int x_=-1,y_=-1,z_=-1;
	cin>>n_>>k;
	for(int i=1;i<=n_;i++)
		cin>>nodes_[i].x>>nodes_[i].y>>nodes_[i].z;
	sort(nodes_+1,nodes_+1+n_,cmp1);
	for(int i=1;i<=n_;i++)
	{
		if(x_!=nodes_[i].x||y_!=nodes_[i].y||z_!=nodes_[i].z)
			x_=nodes_[i].x,y_=nodes_[i].y,z_=nodes_[i].z,nodes[++n]=nodes_[i];
		nodes[n].cnt++;
	}
	solve(1,n);
	for(int i=1;i<=n;i++)
		ans[Ans[i]+nodes[i].cnt-1]+=nodes[i].cnt;
	for(int i=0;i<n_;i++)
		cout<<ans[i]<<endl;
} 
/*
8 7
1 2 3
1 2 3
2 3 4
2 3 4
2 3 4
7 6 5
4 2 5
8 4 2

*/
2022/10/9 15:41
加载中...