题目描述

有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点。他发现通过这些整点能够画出很多个“W”出来。具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5),如果满足:

·x1 < x2 < x3 < x4 < x5

·y1 > y3 > y2

·y5 > y3 > y4

则称它们构成一个“W”形。

现在,小W想统计“W”形的个数,也就是满足上面条件的五元点组个数。你能帮助他吗?


输入格式

    第一行包含一个整数N,表示点的个数。

下面N行每行两个整数,第i+1行为(xi, yi),表示第i个点的坐标。


输出格式

仅包含一行,为“W”形个数模1 000 000 007的值。


  • 题解

    • 题目中的"W"是左右对称的,并且由于左右两边都x轴严格所以互不影响
    • 那么对每个三号点统计出左"V"和右"V"相乘即可得到答案;
    • 下面的诉述均在三号点确定的情况下;
    • 考虑统计左"V",即满足条件①的对数:
    • $①:x_{1} < x_{2} < x_{3},y_{2} < y_{3} < y_{1}$
    • 采用容斥,首先按x坐标做扫描线,可以用两个树状数组统计出条件②:
    • $②:x_{1} < x_{2} < x_{3},y_{1} > y_{2}且y_{2} < y_{3}$
    • ②包含①,和①对比需要再统计条件③:
    • $③:x_{1} < x_{2} < x_{3},y_{2} < y_{1} <= y_{3}$
    • 统计在$x_{3}$严格左边,不严格的下边的点数$num$,$C_{num}^{2}$ 可表示条件④:
      $④:x_{1} <= x_{2} < x_{3},y_{1},y_{2}<= y_{3}$
    • 用一个树状数组去掉$x$轴的等号进一步统计⑤:
    • $⑤:x_{1} < x_{2} < x_{3},y_{1},y_{2} <= y_{3}$
    • 同理用两个树状数组统计⑥:
    • $⑥:x_{1} < x_{2} < x_{3},y_{1} <= y_{2} <= y_{3}$
    • 用⑥减去⑤得到③,用②减去③得到①;
    • 写得比较复杂,建议画图思考,想清楚再写代码不然很容易重构TAT.........
  •  #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    const int N=,mod=1e9+;
    int n,sub[N],tot,t1[N],t2[N],t3[N],t[N],L[N],R[N];
    ll c1[N],c2[N],c3[N];
    struct P{
    int x,y,id;
    P(int _x=,int _y=):x(_x),y(_y){};
    }p[N];
    bool cmp1(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x<b.x;}
    bool cmp2(const P&a,const P&b){return a.x==b.x?a.y<b.y:a.x>b.x;}
    char gc(){
    static char*p1,*p2,s[];
    if(p1==p2)p2=(p1=s)+fread(s,,,stdin);
    return(p1==p2)?EOF:*p1++;
    }
    int rd(){
    int x=; char c=gc();
    while(c<''||c>'')c=gc();
    while(c>=''&&c<='')x=x*+c-'',c=gc();
    return x;
    }
    void init(){memset(c1,,sizeof(c1));memset(c2,,sizeof(c2));memset(c3,,sizeof(c3));}
    void add1(int x,int y){for(;x<=tot;x+=x&-x)c1[x]+=y;}
    int que1(int x){ll re=;for(;x;x-=x&-x)re+=c1[x];return re%mod;}
    void add2(int x,int y){for(;x<=tot;x+=x&-x)c2[x]+=y;}
    int que2(int x){ll re=;for(;x;x-=x&-x)re+=c2[x];return re%mod;}
    void add3(int x,int y){for(;x<=tot;x+=x&-x)c3[x]+=y;}
    int que3(int x){ll re=;for(;x;x-=x&-x)re+=c3[x];return re%mod;}
    void upd(int&x,int y){x+=y;if(x>=mod)x-=mod;}
    void solve(){
    for(int i=,j=;i<=n;i=j){
    for(j=i;j<=n&&p[j].x==p[i].x;++j){
    t1[j]=que1(p[j].y);
    t2[j]=i--t1[j];
    t3[j]=j-i;
    t[j]=mod-1ll*t1[j]*(t1[j]-)/%mod;
    if(t[j]==mod)t[j]=;
    }
    for(int k=i;k<j;++k)add1(p[k].y,);
    }
    memset(c1,,sizeof(c1));
    for(int i=,j=;i<=n;i=j){
    for(j=i;j<=n&&p[j].x==p[i].x;++j){
    upd(t[j],que1(p[j].y));
    upd(t[j],que2(p[j].y-));
    upd(t[j],que3(p[j].y));
    }
    for(int k=i;k<j;++k){
    add1(p[k].y,t1[k]);
    add2(p[k].y,t2[k]);
    add3(p[k].y,t3[k]);
    }
    }
    }
    int main(){
    #ifndef ONLINE_JUDGE
    freopen("bzoj2441.in","r",stdin);
    freopen("bzoj2441.out","w",stdout);
    #endif
    n=rd();for(int i=;i<=n;++i)p[i].x=rd(),p[i].y=sub[++tot]=rd(),p[i].id=i;
    sort(sub+,sub+tot+);
    tot=unique(sub+,sub+tot+)-sub-;
    for(int i=;i<=n;++i)p[i].y=lower_bound(sub+,sub+tot+,p[i].y)-sub;
    sort(p+,p+n+,cmp1);
    solve();
    for(int i=;i<=n;++i)L[p[i].id]=t[i];
    for(int i=;i<=n>>;++i)swap(p[i],p[n-i+]);
    init();
    sort(p+,p+n+,cmp2);
    solve();
    for(int i=;i<=n;++i)R[p[i].id]=t[i];
    ll ans=;for(int i=;i<=n;++i)ans=(ans+1ll*L[i]*R[i]%mod)%mod;
    // for(int i=1;i<=n;++i)printf("%d %d\n",L[i],R[i]);
    cout<<ans<<endl;
    return ;
    }

    bzoj2441

bzoj2441【中山市选】小W的问题的更多相关文章

  1. bzoj2441 [中山市选2011]小W的问题(debug中)

    2441: [中山市选2011]小W的问题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 487  Solved: 186[Submit][Statu ...

  2. BZOJ2441: [中山市选2011]小W的问题

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2441 首先要注意到x1>x3且x5>x3(要是没有这个设定就是树状数组水题了.. ...

  3. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  4. bzoj 2441 [中山市选2011]小W的问题

    bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...

  5. BZOJ2464: 中山市选[2009]小明的游戏

    2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 280  Solved: 124[Submit][Statu ...

  6. 最短路【bzoj2464】: 中山市选[2009]小明的游戏

    2464: 中山市选[2009]小明的游戏 Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步 ...

  7. bzoj2464: 中山市选[2009]小明的游戏(最短路)

    2464: 中山市选[2009]小明的游戏 题目:传送门 题解: 最短路的裸题... 代码: #include<cstdio> #include<cstring> #inclu ...

  8. BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3028  Solved: 1460[Submit][Sta ...

  9. BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )

    先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...

随机推荐

  1. numastat命令详解

    基础命令学习目录 作者:[吴业亮]博客:http://blog.csdn.net/wylfengyujiancheng一.系统架构的演进从SMP到NUMA1.SMP(Symmetric Multi-P ...

  2. Python 标准库中的装饰器

    题目描述 1.简单举例 Python 标准库中的装饰器 2.说说你用过的 Python 标准库中的装饰器 1. 首先,我们比较熟悉,也是比较常用的 Python 标准库提供的装饰器有:property ...

  3. 投稿007期|令人震惊到发指的PyObject对象代码设计之美

    前言 最近在重温经典漫画<SlamDunk>的全国大赛篇,其中的一个情形可以很好的诠释虎躯一震这个状态——当樱木看到流川枫一次高难度投篮时内心的感受:“经过两万次射球练习后,樱木首次明白到 ...

  4. 20135316王剑桥 linux第四周课实验笔记

    第三章 程序的机器级表示 3.1历史观点 Intel处理器的换代:8086——80286——i386——i486——Pentium——PentiumPro——PentiumII——PentiumIII ...

  5. 【请仔细核对Git地址】关于代码量排名的说明

    1.截至2017年3月14日,1623班级代码统计情况如下: 2.代码量排名是基于码云的git地址统计的,请大家仔细核对以下个人地址,如有问题请及时联系我. 20162301 20162302 201 ...

  6. 第二阶段每日站立会议First Day

    昨天我进行了用户界面的修改,例如按钮的大小,位置,使界面看起来更美观.更简洁 今天准备安装在手机端进行界面效果测试以及进一步完善 遇到的问题:有些按钮由于在之前固定好的布局之中,所以没法移动其位置

  7. AWS EC2安装docker时的问题

    在AWS EC2的实例(Ubuntu)里面安装docker时,使用通常的安装步骤 :~$ sudo apt-get update :~$ sudo apt-get install docker 安装完 ...

  8. BUAA软工个人作业Week2-代码复审

    一. 代码复审Check List 1.概要部分 代码能符合需求和规格说明么? 对-c的测试: 可以看到程序不支持1000000的数独终局输出,读源码发现常量MaxCounts定义为了100000,导 ...

  9. 【第十周】四则运算GUI

    下载地址:http://pan.baidu.com/s/1hsc9HRm 这次比上次多了一个记录的功能,是用QT里面的qplaintextedit记录显示出做过的题目. 我是直接看的文档,发现窗体,搜 ...

  10. angular入门学习文档之一

    一.数据双向绑定 angular(下面统一简称ng)强大的地方莫过于它内置的数据双向绑定功能,下面我们通过一个简单的例子来演示ng强大的双向绑定数据的能力. 代码如下: 1.dom结构: 1.< ...