传送门

数据结构优化计数菜题。

题意简述:给nnn个点问有多少个www型。

www型的定义:

由5个不同的点组成,满足x1&lt;x2&lt;x3&lt;x4&lt;x5,x3&gt;x1&gt;x2,x3&gt;x5&gt;x4x_1&lt;x_2&lt;x_3&lt;x_4&lt;x_5,x_3&gt;x_1&gt;x_2,x_3&gt;x_5&gt;x_4x1​<x2​<x3​<x4​<x5​,x3​>x1​>x2​,x3​>x5​>x4​


思路:

本蒟蒻的思路很奇葩。

我们把www拆成两个vvv,把vvv按照大小排序之后就只用统计形如213213213和312312312的种类数并累加贡献到222位置上,最后乘法原理。

考虑统计这个东西。

显然1,21,21,2在以333为原点的坐标系的同一象限,于是可以按照yyy拍个序,从下往上加点,对于每个点维护再未插入的点中在该点左/右上方的点有多少个,然后对于一个点的答案就是它左/右下方所有点维护的贡献之和。

第一个东西可以用bitbitbit,然后第二个贡献之和可以上权值线段树。

代码:

#include<bits/stdc++.h>
#define fi first
#define se second
#define ri register int
using namespace std;
inline int read(){
    int ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
const int mod=1e9+7,N=2e5+5;
typedef long long ll;
int n,f[N][2],ans=0,stk[N],top,mp[N],sig=0;
struct Pot{int x,y;}a[N];
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
inline bool cmp(const Pot&a,const Pot&b){return a.y==b.y?a.x<b.x:a.y<b.y;}
struct Fenwick_Tree{
    int bit[N];
    inline int lowbit(const int&x){return x&-x;}
    inline void update(int x,int v){for(ri i=x;i<=sig;i+=lowbit(i))bit[i]=add(bit[i],v);}
    inline int query(int x){int ret=0;for(ri i=x;i;i^=lowbit(i))ret=add(ret,bit[i]);return ret;}
    inline void clear(){
        fill(bit+1,bit+sig+1,0);
        for(ri i=1,pos;i<=n;++i){
            pos=lower_bound(mp+1,mp+sig+1,a[i].x)-mp;
            update(pos,1);
        }
    }
}Bit;
struct segment_tree{
    #define lc (p<<1)
    #define rc (p<<1|1)
    #define mid (l+r>>1)
    int sum[N<<2],num[N<<2],tag[N<<2];
    inline void pushup(int p){num[p]=num[lc]+num[rc],sum[p]=sum[lc]+sum[rc];}
    inline void pushnow(int p,int v){if(!num[p])return;sum[p]+=num[p]*v,tag[p]+=v;}
    inline void pushdown(int p){if(tag[p])pushnow(lc,tag[p]),pushnow(rc,tag[p]),tag[p]=0;}
    inline void update(int p,int l,int r,int ql,int qr,int v){
        if(ql>r||qr<l||!num[p])return;
        if(ql<=l&&r<=qr)return pushnow(p,v);
        pushdown(p);
        if(qr<=mid)update(lc,l,mid,ql,qr,v);
        else if(ql>mid)update(rc,mid+1,r,ql,qr,v);
        else update(lc,l,mid,ql,mid,v),update(rc,mid+1,r,mid+1,qr,v);
        pushup(p);
    }
    inline void modify(int p,int l,int r,int k,int v){
        if(l==r){sum[p]+=v,++num[p];return;}
        pushdown(p),k<=mid?modify(lc,l,mid,k,v):modify(rc,mid+1,r,k,v),pushup(p);
    }
    inline int query(int p,int l,int r,int ql,int qr){
        if(ql>r||qr<l||!num[p]||!sum[p])return 0;
        if(ql<=l&&r<=qr)return sum[p];
        pushdown(p);
        if(qr<=mid)return query(lc,l,mid,ql,qr);
        if(ql>mid)return query(rc,mid+1,r,ql,qr);
        return query(lc,l,mid,ql,mid)+query(rc,mid+1,r,mid+1,qr);
    }
    inline void clear(){memset(tag,0,sizeof(tag)),memset(sum,0,sizeof(sum)),memset(num,0,sizeof(num));}
}T;
inline void change1(){
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        T.update(1,1,sig,pos+1,sig,-1),Bit.update(pos,-1);
    }
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        f[p][0]=T.query(1,1,sig,1,pos-1);
    }
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        T.modify(1,1,sig,pos,Bit.query(pos-1));
    }
}
inline void change2(){
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        T.update(1,1,sig,1,pos-1,-1),Bit.update(pos,-1);
    }
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        f[p][1]=T.query(1,1,sig,pos+1,sig);
    }
    for(ri i=1,p,pos;i<=top;++i){
        pos=lower_bound(mp+1,mp+sig+1,a[p=stk[i]].x)-mp;
        T.modify(1,1,sig,pos,Bit.query(sig)-Bit.query(pos));
    }
}
inline void solve1(){
    T.clear(),Bit.clear();
    for(ri i=1;i<=n;++i){
        stk[top=1]=i;
        while(i<n&&a[i].y==a[i+1].y)++i,stk[++top]=i;
        change1();
    }
}
inline void solve2(){
    T.clear(),Bit.clear();
    for(ri i=1;i<=n;++i){
        stk[top=1]=i;
        while(i<n&&a[i].y==a[i+1].y)++i,stk[++top]=i;
        change2();
    }
}
int main(){
    n=read();
    for(ri i=1;i<=n;++i)mp[++sig]=a[i].x=read(),a[i].y=read();
    sort(a+1,a+n+1,cmp);
    sort(mp+1,mp+sig+1),sig=unique(mp+1,mp+sig+1)-mp-1;
    solve1(),solve2();
    for(ri i=1;i<=n;++i)ans=add(ans,mul(f[i][0],f[i][1]));
    cout<<ans;
    return 0;
}

2019.01.21 bzoj2441: [中山市选2011]小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. bzoj 2441 [中山市选2011]小W的问题

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

  4. 2019.01.14 bzoj5343: [Ctsc2018]混合果汁(整体二分+权值线段树)

    传送门 整体二分好题. 题意简述:nnn种果汁,每种有三个属性:美味度,单位体积价格,购买体积上限. 现在有mmm个询问,每次问能否混合出总体积大于某个值,总价格小于某个值的果汁,如果能,求所有方案中 ...

  5. jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)

    传送门 题面 题解 不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解) 对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避 ...

  6. 2019年CCPC网络赛 HDU 6703 array【权值线段树】

    题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...

  7. 2019牛客训练赛第七场 C Governing sand 权值线段树+贪心

    Governing sand 题意 森林里有m种树木,每种树木有一定高度,并且砍掉他要消耗一定的代价,问消耗最少多少代价可以使得森林中最高的树木大于所有树的一半 分析 复杂度分析:n 1e5种树木,并 ...

  8. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  9. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

随机推荐

  1. Android使用VideoView播放本地视频及网络视频Demo

    1.xm文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:and ...

  2. Python+Selenium学习--下拉框处理

    场景 下拉框也是web 页面上非常常见的功能,webdriver 对于一般的下拉框处理起来也相当简单,要想定位下拉框中的内容,首先需要定位到下拉框:这样的二次定位 下拉框一般有以下两种方式: 鼠标移上 ...

  3. 对于装office 365时,visio不兼容的解决

    先将office 365装好,之后从这个网址下载visio安装即可,但是没有 激活码,需要自己激活: 网址:链接: https://pan.baidu.com/s/1OqONPuJ0eumrpts-X ...

  4. Nginx中超时时间配置(转)

    本文介绍 Nginx 的 超时(timeout)配置.分享给大家,具体如下: Nginx 处理的每个请求均有相应的超时设置.如果做好这些超时时间的限定,判定超时后资源被释放,用来处理其他的请求,以此提 ...

  5. 安装后没有IP

    修改  /etc/sysconfig/network-scripts/ifcfg-eth0 改为yes

  6. make ;makefile; cmake; qmake的区分

    1. make 是用来执行Makefile的.2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件.其基本语法是: 目标+依赖+命令,只有在目标文 ...

  7. html5的地理位置定位

    html5提供的地理位置定位使开发人员不用借助其他软件就能轻松实现位置查找,地图应用,导航等功能. 地理位置定位基本原理GPS, WIFI, IP, 手机信号基站 核心对象Geolocation是wi ...

  8. VS2013中Nuget程序包管理器控制台使用入门(二)-如何使用Nuget提供的帮助(原创)

    如何使用Nuget提供的帮助? 1.从get-help Nuget开始,键入“get-help NuGet”以查看所有可用的 NuGet 命令. 用法: PM> get-help Nuget 主 ...

  9. 解决织梦替换ueditor编辑器后栏目与单页无法保存内容

    织梦的默认编辑器是ckeditor,没有插入代码的功能,不够强大,就换成了百度的UEditor编辑器. 使用织梦DedeCMS百度整合UEditor编辑器时,碰到了栏目内容或者单页无法保存的问题,这个 ...

  10. android时间选择器(API13以上)

    public class UnloadCargoFragment extends Fragment implements OnClickListener { private View rootView ...