本题是否可以在扫描线中维护线段树(位置)套主席树(颜色)啊qwq
这样时空都是 nlog2n 的吧。
但我好像Wa#10了QWQ
能不能告诉我可行/hack (
#include<bits/stdc++.h>
using namespace std;
namespace acac
{
int tree[16000010],son[16000010][2],rt[800010];
int tot,n;
void pu(int u)
{
tree[u]=tree[son[u][0]]+tree[son[u][1]];
}
void c(int u,int l,int r,int w,int num)
{
if(l==r)
{
tree[u]+=num;
return ;
}
int mid=(l+r)>>1;
if(w<=mid)
{
if(!son[u][0])son[u][0]=++tot;
c(son[u][0],l,mid,w,num);
}
else
{
if(!son[u][1])son[u][1]=++tot;
c(son[u][1],mid+1,r,w,num);
}
pu(u);
}
void modify(int u,int l,int r,int L,int R,int k,int num)
{
if(L>R||L>r||l>R)return ;
if(L<=l&&R>=r)
{
if(!rt[u])rt[u]=++tot;
//cout<<l<<' '<<r<<' '<<rt[u]<<endl;
c(rt[u],1,n,k,num);
return ;
}
int mid=(l+r)>>1;
modify(2*u,l,mid,L,R,k,num);
modify(2*u+1,mid+1,r,L,R,k,num);
}
int re=0;
int qr(int u,int l,int r)
{
if(l==r)return tree[u]?l:0;
// cout<<tree[son[u][1]]<<endl;
int mid=(l+r)>>1;
if(tree[son[u][1]])return qr(son[u][1],mid+1,r);
return qr(son[u][0],l,mid);
}
int Ans[100010];
void qrery(int u,int l,int r,int L,int R,int re)
{
if(L>R||L>r||l>R)return ;
if(rt[u])re=max(re,qr(rt[u],1,n));
//cout<<l<<' '<<r<<' '<<re<<endl;
if(L<=l&&R>=r)
{
Ans[re]=1;
return ;
}
int mid=(l+r)>>1;
qrery(2*u,l,mid,L,R,re);
qrery(2*u+1,mid+1,r,L,R,re);
}
int ls[400010];
struct node
{
int x1,x2,y,num,op;
}A[200010],Z[200010];
map<int,int>mp;
bool cmp(node a,node b)
{
if(a.y==b.y)return a.num<b.num;
return a.y<b.y;
}
int main()
{
scanf("%d",&n);
//左下右上
int len=4*n;
for(int i=1;i<=n;i++)
{
scanf("%d%d%d%d",&A[i].x1,&A[i].y,&A[i].x2,&A[i+n].y);
ls[i]=A[i].x1;
ls[i+n]=A[i].x2;
ls[i+n*2]=A[i].x1-1;
ls[i+n*3]=A[i].x2-1;
A[i].op=A[i+n].op=i;
// if(i==139)cout<<A[i].x1<<' '<<A[i].x2<<endl;
A[i+n].x1=A[i].x1;
A[i+n].x2=A[i].x2;
A[i].num=1,A[i+n].num=-1;
}
sort(ls+1,ls+len+1);
int cnt=0;
ls[0]=-1e9-10;
for(int i=1;i<=len;i++)
{
if(ls[i]!=ls[i-1])cnt++;
mp[ls[i]]=cnt;
// cout<<cnt<<' ';
}
// cout<<endl;
sort(A+1,A+2*n+1,cmp);
for(int i=1;i<=n*2;i++)
{
int zw=0;
while(A[i+1].y==A[i].y)
{
modify(1,1,cnt,mp[A[i].x1],mp[A[i].x2],A[i].op,A[i].num);
Z[++zw].y=mp[A[i].x1];
Z[zw].num=mp[A[i].x2];
//
// cout<<Z[zw].y<<' '<<Z[zw].num<<endl;
i++;
}
modify(1,1,cnt,mp[A[i].x1],mp[A[i].x2],A[i].op,A[i].num);
Z[++zw].y=mp[A[i].x1];
Z[zw].num=mp[A[i].x2];
// cout<<Z[zw].y<<' '<<Z[zw].num<<endl;
sort(Z+1,Z+1+zw,cmp);
while(zw)
{
if(zw==1||Z[zw].y!=Z[zw-1].y||Z[zw].num!=Z[zw-1].num)qrery(1,1,cnt,Z[zw].y,Z[zw].num,0);
zw--;
}
// for(int i=1;i<=n;i++)
// {
// cout<<Ans[i]<<' ';
//
// }
// cout<<endl;
}
int ans=1;
for(int i=1;i<=n;i++)
{
// cout<<i<<": "<<Ans[i]<<'\n';
ans+=Ans[i];
}
cout<<ans;
return 0;
}
}
int main()
{
acac::main();
return 0;
}
/*
3
2 1 4 2
1 1 2 2
4 1 5 2
*/