如题。
二维偏序在未来的学校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;
}
没过样例,全部输出0。
感觉是去重和cdq写冲突了,但不知道哪里冲突了。
第一次写到神connect求助的题好激动啊