bzoj2441【中山市选】小W的问题
题目描述
有一天,小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的问题的更多相关文章
- bzoj2441 [中山市选2011]小W的问题(debug中)
2441: [中山市选2011]小W的问题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 487 Solved: 186[Submit][Statu ...
- BZOJ2441: [中山市选2011]小W的问题
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2441 首先要注意到x1>x3且x5>x3(要是没有这个设定就是树状数组水题了.. ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- bzoj 2441 [中山市选2011]小W的问题
bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具 ...
- BZOJ2464: 中山市选[2009]小明的游戏
2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 280 Solved: 124[Submit][Statu ...
- 最短路【bzoj2464】: 中山市选[2009]小明的游戏
2464: 中山市选[2009]小明的游戏 Description 小明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步 ...
- bzoj2464: 中山市选[2009]小明的游戏(最短路)
2464: 中山市选[2009]小明的游戏 题目:传送门 题解: 最短路的裸题... 代码: #include<cstdio> #include<cstring> #inclu ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
- BZOJ 2440: [中山市选2011]完全平方数( 二分答案 + 容斥原理 + 莫比乌斯函数 )
先二分答案m,<=m的有m-∑(m/pi*pi)+∑(m/pi*pi*pj*pj)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...
随机推荐
- 【python 2.7】获取外部参数
import sys res_0 = sys.argv[0] res_1 = sys.argv[1] res_2 = sys.argv[2] print res_0 print res_1 print ...
- hadoop之定制自己的sort过程
Key排序 1. 继承WritableComparator 在hadoop之Shuffle和Sort中,可以看到mapper的输出文件spill文件需要在内存中排序,并且在输入reducer之前,不同 ...
- mysql更新表数据时报错 You can't specify target table 'RES_CATALOG_CLASSIFY' for update in FROM clause
You can't specify target table for update in FROM clause含义:不能在同一表中查询的数据作为同一表的更新数据. 将sql语句 UPDATE RES ...
- servlet基础学习总结
Servlet的任务 1. 读取客户端发送的显示的数据,包括HTML表单和一些客户端程序的表单 2. 读取客户端发送的隐式的数据,包括cookies.媒体类型等 3. 处理数据并产生结果 4. ...
- Daily Scrumming* 2015.11.2(Day 14)
一.今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 实现前后端整合 继续实现前后端整合 杨墨犁 修改好首页 开始实现社团页 付帅 测试api 继续测试并完 ...
- C# 打包
开发环境:VS2010+SQL Server 2008 操作系统:win7_32bit 旗舰版 开发语言:C# 项目名称:学生寄宿管理系统 下面开始介绍:如何给windows应用程序打包? 第一步: ...
- Http的响应结构
Http响应结构有三部分组成: Http头部(Http Header):它们包含了更多关于响应的信息.比如:头部可以指定认为响应过期的过期日期,或者是指定用来给用户安全的传输实体内容的编码格式.如何在 ...
- VR论文调研
IEEE VR 2018 1.Avatars and Virtual Humans--人物和虚拟人物 2.Augmented Reality--增强现实 3.Body and Mind--人体和思想( ...
- IPV6的链路本地地址和站点本地地址的不同
转帖 中关村 http://ask.zol.com.cn/x/2230274.html IPV6涉及到一个概念,link-local address, 中文叫“链路本地地址”,它的前缀是FE80::/ ...
- 如何选择mysql存储引擎
一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...