萌新第一次写三维偏序,按老师的代码写的,求助
查看原帖
萌新第一次写三维偏序,按老师的代码写的,求助
336603
出言不逊王子楼主2020/6/21 20:18

如题。

二维偏序在未来的学校OJ上过了,然后按照老师的说法加上了我写的树状数组和老师给的去重代码(被我魔改过)。

代码:

#include<bits/stdc++.h>
#define ns "-1"
#define fs(i,x,y,z) for(ll i=x;i<=y;i+=z)
#define ft(i,x,y,z) for(ll i=x;i>=y;i+=z)
#define ll long long
#define ull unsigned long long
#define db double
#define ms(a,b) memset(a,b,sizeof(a))
using namespace std;
const int rw[]={-1,0,1,0,-1,1,-1,1},cl[]={0,1,0,-1,-1,1,1,-1};
const int N=100001,inf=0x3f3f3f3f;
const int daynum[]={114514,31,28,31,30,31,30,31,31,30,31,30,31};
const db E=2.718281828459,pi=acos(-1.0),eps=0.0000000001;
inline ll read(){
	ll date=0,w=1;char c=0;
	while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
	while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
	return date*w;
}
struct node{
	ll x,y,z,l,num;
}a[N],b[N];
ll n,s[N],c[4*N],k;
inline ll lowbit(ll k){
	return k&(-k);
}
ll gets(ll r){//l=1
	ll res=0;
	for(ll i=r;i;i-=lowbit(i)) res+=c[i];
	return res;
}
void upd(ll v,ll r){
	for(ll i=v;i<=k;i+=lowbit(i)) c[i]+=r;
}
void sl(ll l,ll r){
	//puts("in");
	if(l>=r) return;
	ll md=(l+r)/2;
	//puts("qaq");
	sl(l,md);
	//puts("qwq");
	sl(1+md,r);
	for(ll i=l,j=md+1,k=l;k<=r;k++){
		//puts("qwsqwq");
		if(j>r||i<=md&&a[i].y<=a[j].y){
			upd(a[i].z,a[i].num);
			b[k]=a[i];
			i++;
		}else{
			s[a[j].l]=gets(a[j].z);
			b[k]=a[j];
			j++;
		}
	}
	fs(i,l,md,1) upd(a[i].z,-a[i].num);
	fs(i,l,r,1) a[i]=b[i];//puts("out");
	return;
}
bool cmp(node x,node y){
	if(x.x!=y.x) return x.x<y.x;
	else if(x.y!=y.y) return x.y<y.y;
	else return x.z<y.z;
}
int main(){
	n=read(),k=read();
	fs(i,1,n,1) a[i].x=read(),a[i].y=read(),a[i].z=read(),a[i].l=i;
	sort(a+1,a+n+1,cmp);
	int m=0;
    fs(i,1,n,1){
        if(i>1&&a[i].x==a[i-1].x&&a[i].y==a[i-1].y) b[m].num++;
        else b[++m]=a[i],b[m].num=1;
    }
	sl(1,n);
	fs(i,1,n,1) printf("%lld\n",s[i]);
	return 0;
}

没过样例,全部输出00

感觉是去重和cdq写冲突了,但不知道哪里冲突了。

第一次写到神connect求助的题好激动啊

2020/6/21 20:18
加载中...