传送门

由于一个www不好统计,我们考虑拆成222个vvv来统计,也就是"312"和"213"这样的
把答案统计在"2"处,两边相乘就是答案

由于2种情况类似,只讨论"312"这样的
考虑对于每个点p(x1,y1)p(x_1,y_1)p(x1​,y1​)作为“2”
那么所有p的左下角的点q(x2,y2)q(x_2,y_2)q(x2​,y2​)都可以作为"1"
在点(x2,y1)(x_2,y_1)(x2​,y1​)左上角的点就都可以作为"3"

考虑把所有点按照yyy排序
从小到大计算
然后我们对于每个点维护一个值表示在这个点左上角有多少个所有未被计算的点
那么对于每个点答案就是左下角所有点的值之和了
每加一个点就会使右边所有点的值少1,又会新加一个点的值
考虑到按照yyy从小到大计算,可以直接上线段树(以xxx坐标为下标)
统计左上角有多少个点可以直接用树状数组维护

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){char ch=getchar();int res=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();return res*f;
}
const int N=200005;
const ll mod=1000000007;
int len,n,p[N];
struct point{int x,y;
}a[N];
inline bool comp(const point &a,const point &b){return a.y<b.y;
}
ll f[N][2],ans;
inline void add(ll &a,ll b){a=(a+b>=mod)?a+b-mod:a+b;
}
inline void mul(ll &a,ll b){a=(a*b>=mod)?a*b%mod:a*b;
}
struct Bit{ll tr[N];inline int lowbit(int x){return (x&(-x));}inline void update(int pos,ll k){for(;pos<=len;pos+=lowbit(pos))add(tr[pos],k);}inline int query(int pos,ll res=0){for(;pos;pos-=lowbit(pos))add(res,tr[pos]);return res;}inline void init(){memset(tr,0,sizeof(tr));for(int i=1;i<=n;i++){int pos=lower_bound(p+1,p+len+1,a[i].x)-p;update(pos,1);}}
}A;
struct Seg{#define lc (u<<1)#define rc ((u<<1)|1)#define mid ((l+r)>>1)ll siz[N<<2],tr[N<<2],tag[N<<2];inline void init(){memset(siz,0,sizeof(siz)),memset(tr,0,sizeof(tr)),memset(tag,0,sizeof(tag));}inline void pushup(int u){siz[u]=siz[lc]+siz[rc],tr[u]=tr[lc]+tr[rc];}inline void pushnow(int u,ll k){tr[u]+=k*siz[u],tag[u]+=k;}inline void pushdown(int u){if(!tag[u])return;pushnow(lc,tag[u]),pushnow(rc,tag[u]),tag[u]=0;}inline void update(int u,int l,int r,int st,int des){if(l>des||st>r)return;if(st<=l&&r<=des){pushnow(u,-1);return;}pushdown(u);if(st<=mid)update(lc,l,mid,st,des);if(mid<des)update(rc,mid+1,r,st,des);pushup(u);}inline void modify(int u,int l,int r,int pos,ll k){if(l==r){tr[u]+=k,siz[u]+=1;return;}pushdown(u);if(pos<=mid)modify(lc,l,mid,pos,k);else modify(rc,mid+1,r,pos,k);pushup(u);}inline ll query(int u,int l,int r,int st,int des){if(l>des||r<st)return 0;if(st<=l&&r<=des)return tr[u];pushdown(u);ll res=0;if(st<=mid)res+=query(lc,l,mid,st,des);if(mid<des)res+=query(rc,mid+1,r,st,des);return res;}
}B;
int stk[N],top;
inline void change1(){for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;B.update(1,1,len,pos+1,len),A.update(pos,-1);}for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;f[stk[i]][0]=B.query(1,1,len,1,pos-1);}for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;B.modify(1,1,len,pos,A.query(pos-1));}
}
inline void change2(){for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;B.update(1,1,len,1,pos-1),A.update(pos,-1);}for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;f[stk[i]][1]=B.query(1,1,len,pos+1,len);}for(int i=1;i<=top;i++){int pos=lower_bound(p+1,p+len+1,a[stk[i]].x)-p;B.modify(1,1,len,pos,A.query(len)-A.query(pos));}
}
int main(){n=read();for(int i=1;i<=n;i++){p[i]=a[i].x=read(),a[i].y=read();}sort(a+1,a+n+1,comp);sort(p+1,p+n+1),len=unique(p+1,p+n+1)-p-1;A.init(),B.init();for(int i=1;i<=n;i++){stk[top=1]=i;while(i<n&&a[i].y==a[i+1].y)i++,stk[++top]=i;change1();}A.init(),B.init();for(int i=1;i<=n;i++){stk[top=1]=i;while(i<n&&a[i].y==a[i+1].y)i++,stk[++top]=i;change2();}for(int i=1;i<=n;i++)mul(f[i][0],f[i][1]),add(ans,f[i][0]);cout<<ans<<'\n';
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/10366310.html

【BZOJ2441】【中山市选2011】小W的问题(树状数组+权值线段树)相关推荐

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

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

  2. 动态区间第k小:树状数组套权值线段树

    所谓树状数组套权值线段树,就是在树状树组上套权值线段树 (逃) 解析 如何解决静态区间第k小? 使用主席树就ok啦 辣么如何解决动态区间第k小嘞- 我们想想主席树为啥不能解决动态区间第k小 因为如果改 ...

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

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

  4. bzoj 2440: [中山市选2011]完全平方数(二分+莫比乌斯函数)

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 4018  Solved: 1952 [Submit][S ...

  5. [补档][中山市选2011]杀人游戏

    [中山市选2011]杀人游戏 题目 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识 ...

  6. bzoj 2464: 中山市选[2009]小明的游戏(BFS)

    2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 963  Solved: 394 [Submit][Sta ...

  7. 牛客练习赛34 - C little w and Segment Coverage(思维、树状数组)

    title: 牛客练习赛34 - C little w and Segment Coverage(思维.树状数组) date: 2018-12-15 16:36:55 tags: [树状数组,思维] ...

  8. Bzoj 4548: 小奇的糖果(双向链表+排序+树状数组)

    以下内容来自ShallWe's Blog 题目 4548: 小奇的糖果 Description 有\(N\)个彩色糖果在平面上.小奇想在平面上取一条水平的线段,并拾起它上方或下方的所有糖果.求出最多能 ...

  9. 干物妹小埋 树状数组

    链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 树状数组 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

最新文章

  1. json数据解析_ORACLE中Clob字段在不同数据库间自由地飞翔——SQL+JSON字段解析
  2. 实现点击下载文件的几种方法
  3. 【Android UI设计与开发】第06期:底部菜单栏(一)使用TabActivity实现底部菜单栏
  4. Java学习资料-SimpleFactory
  5. 【送书-小姐姐配音】低代码平台的核心价值与优势
  6. 特性和混入不是面向对象的
  7. jupyter notebook指定工作目录
  8. 当遇到用\来分隔字符串
  9. Iranian ChamPions Cup 水题
  10. K-L变换原理、图像压缩与人脸识别实战(附matlab代码)
  11. 解决 Refused to display in a frame because it set 'X-Frame-Options' to 'deny'.问题
  12. Windows MFC 工程应用开发与框架原理完全剖析教程(上)
  13. 抖音设备注册生成device_id与install_id hook分析记录
  14. 搭建一套直播平台需要多少钱
  15. 预训练模型 PLOME
  16. 使用luac加密lua文件
  17. oracle批量备份表的存储过程
  18. 华为鸿蒙系统概念图,华为Mate40Pro概念图:超高屏占比+鸿蒙系统 这才是真正的华为...
  19. 【ES6】阮一峰ES6学习之Promise(一)
  20. AWVS_扫描报告分析

热门文章

  1. 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”解决方法
  2. softmax回归的简洁实现-09-p5
  3. Fail to get tape drive(tsm) inventory
  4. php实现中间件6,THINKPHP6 实现中间件
  5. python使用ssh 中文_使用Python进行SSH的最简单方法是什么?
  6. iphone 开发安装环境
  7. 计算机与英语教学的论文开题报告,英语教学论文开题报告
  8. java基础知识的一些细节问题
  9. 财务报表五力、五性分析雷达图
  10. Java多线程(七)——线程中断