E. Count The Rectangles 模拟

 

 

  

 

 

 

 

 

 

 

 题意:给定一些线  判断 一共有多少矩形

 

和之前那题cf u型 有点类似  枚举 与x轴平行的边  然后扫出与y轴平行的边(与这两条枚举边都相交) 把该边x放入树状数组  求贡献即可 该贡献为 枚举的两条边为矩形的上下底的矩形个数

 #include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s)
#define ll long long
#define see(x) (cerr<<(#x)<<'='<<(x)<<endl)
#define pb push_back
#define inf 0x3f3f3f3f
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1
typedef pair<int,int>pii;
//
const int N=1e5+5;
const int off=5002;
 
struct X
{
    int x,y1,y2;
};
struct Y
{
    int y,x1,x2;
};
bool cmpx(X a,X b){return a.y2<b.y2;}
bool cmpy(Y a,Y b){return a.y<b.y;}

int t[N];
void up(int x,int v){for(;x<=N;x+=x&-x)t[x]+=v; }
int qsum(int x){int ans=0;for(;x;x-=x&-x)ans+=t[x];return ans;}
 
int n,x1,x2,y1,y2;vector<X>x;vector<Y>y;
int main()
{
    RI(n);
    rep(i,1,n)
    {
        RII(x1,y1);RII(x2,y2);
        if(x1==x2)
        {
            if(y1>y2)swap(y1,y2);x.pb(X{x1+off,y1+off,y2+off});
        }
        else
        {
            if(x1>x2)swap(x1,x2);y.pb(Y{y1+off,x1+off,x2+off});
        }
    }
    sort(x.begin(),x.end(),cmpx);
    sort(y.begin(),y.end(),cmpy);
    ll ans=0;
    for(int i=0;i<y.size();++i)
    {
        int k=x.size()-1;CLR(t,0);
 
        for(int j=y.size()-1;y[j].y>y[i].y;--j)
        {
            while(k>=0&&x[k].y2>=y[j].y)
            {
                if(x[k].y1<=y[i].y)
                up(x[k].x,1);
                k--;
            }
            int l=max(y[i].x1,y[j].x1),r=min(y[i].x2,y[j].x2);
            if(l>=r)continue;
            int ret=qsum(r)-qsum(l-1);
            ans+=1ll*(ret-1)*ret/2;
        }
    }
    cout<<ans;
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/bxd123/p/11189929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值