bzoj2441 [中山市选2011]小W的问题(debug中)
2441: [中山市选2011]小W的问题
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 487 Solved: 186
[Submit][Status][Discuss]
Description
有一天,小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”形的个数,也就是满足上面条件的五元点组个数。你能帮助他吗?
。
Input
第一行包含一个整数N,表示点的个数。
下面N行每行两个整数,第i+1行为(xi, yi),表示第i个点的坐标。
Output
仅包含一行,为“W”形个数模1 000 000 007的值。
Sample Input
1 10
2 1
3 5
4 6
5 1
6 10
Sample Output
HINT
对于100%的数据满足N ≤ 200 000,0 ≤ xi ≤ 10^9,0 ≤ yi ≤ 10^9
Source
开始做这道题的时候还是正中午,现在......
这题真的是烦,如果横纵坐标不相等,还好点,现在相等了,直接gg.
两个思路,一是统计下面几种图形的数量:


,容斥一下就好了.我写了横纵坐标不相等的代码,但是一旦横纵坐标相等就gg.
另外的思路是借鉴的网上其他题解的.
结果两份代码都没debug成功QAQ,省选前我会回来填坑的.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const ll maxn = ,mod = ,inf = ; struct node
{
ll x,y,x2,id;
}e[maxn]; int n;
ll ans1[maxn],ans2[maxn],b[maxn],sum[maxn << ],L[maxn << ],R[maxn << ],tag[maxn << ],ans,tot; bool cmp(node a,node b)
{
return a.y < b.y;
} bool cmp2(node a,node b)
{
return a.x < b.x;
} void pushup(int o)
{
sum[o] = sum[o * ] + sum[o * + ];
sum[o] %= mod;
} void build(int o,int l,int r)
{
L[o] = l,R[o] = r;
sum[o] = tag[o] = ;
if (l == r)
return;
int mid = (l + r) >> ;
build(o * ,l,mid);
build(o * + ,mid + ,r);
pushup(o);
} void pushdown(int o)
{
if (tag[o])
{
tag[o * ] += tag[o];
tag[o * ] %= mod;
tag[o * + ] += tag[o];
tag[o * + ] %= mod;
sum[o * ] += tag[o] * (R[o * ] - L[o * ] + ) % mod;
sum[o * + ] += tag[o] * (R[o * + ] - L[o * + ] + ) % mod;
tag[o] = ;
}
} void update(int o,int l,int r,int x,int y,int v)
{
if (x > y)
return;
if (x <= l && r <= y)
{
sum[o] += (r - l + ) * 1LL * v % mod;
sum[o] %= mod;
tag[o] += v;
tag[o] %= mod;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (x <= mid)
update(o * ,l,mid,x,y,v);
if (y > mid)
update(o * + ,mid + ,r,x,y,v);
pushup(o);
} void update2(int o,int l,int r,int pos,int v)
{
if (l == r)
{
//sum[o] += v;
//sum[o] %= mod;
//tag[o] += v;
//tag[o] %= mod;
sum[o] = v;
return;
}
pushdown(o);
int mid = (l + r) >> ;
if (pos <= mid)
update2(o * ,l,mid,pos,v);
else
update2(o * + ,mid + ,r,pos,v);
pushup(o);
} ll query(int o,int l,int r,int x,int y)
{
if (x > y)
return ;
if (x <= l && r <= y)
return sum[o];
pushdown(o);
ll res = ;
int mid = (l + r) >> ;
if (x <= mid)
res += query(o * ,l,mid,x,y);
res %= mod;
if (y > mid)
res += query(o * + ,mid + ,r,x,y);
res %= mod;
return res;
} void solve1()
{
build(,,n);
for (int i = ; i <= n; i++)
{
int j = i;
while (j < n && e[i].y == e[j + ].y)
j++;
for (int k = i; k <= j; k++)
update(,,n,e[k].x2,n,-);
for (int k = i; k <= j; k++)
ans1[e[k].id] = query(,,n,,e[k].x - );
for (int k = i; k <= j; k++)
update2(,,n,e[k].id,e[k].x - );
i = j;
}
} void solve2()
{
build(,,n);
for (int i = ; i <= n; i++)
{
int j = i;
while (j < n && e[i].y == e[j + ].y)
j++;
for (int k = i; k <= j; k++)
update(,,n,,e[k].x - ,-);
for (int k = i; k <= j; k++)
ans2[e[k].id] = query(,,n,e[k].x2,n);
for (int k = i; k <= j; k++)
update2(,,n,e[k].id,n - e[k].x2 + );
i = j;
}
} int main()
{
scanf("%d",&n);
for (int i = ; i <= n; i++)
{
scanf("%lld%lld",&e[i].x,&e[i].y);
b[++tot] = e[i].x;
}
b[++tot] = inf;
sort(b + ,b + + tot);
sort(e + ,e + + n,cmp2);
for (int i = ; i <= n; i++)
{
e[i].x2 = upper_bound(b + ,b + + tot,e[i].x) - b;
e[i].x = lower_bound(b + ,b + + tot,e[i].x) - b;
e[i].id = i;
}
sort(e + ,e + + n,cmp);
solve1();
sort(e + ,e + + n,cmp);
solve2();
/*
for (int i = 1; i <= n; i++)
{
printf("%lld %lld\n",ans1[i],ans2[i]);
ans += ans1[i] * ans2[i] % mod;
ans %= mod;
}
*/
printf("%lld\n",ans); return ;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; typedef long long ll; const ll maxn = ,mod = ,inf = ; struct node
{
ll x,y,x2,id;
}e[maxn]; ll n;
ll ans1[maxn],ans2[maxn],b[maxn],sum[maxn << ],L[maxn << ],R[maxn << ],tag[maxn << ],ans,tot; bool cmp(node a,node b)
{
return a.y < b.y;
} bool cmp2(node a,node b)
{
return a.x < b.x;
} void pushup(ll o)
{
sum[o] = sum[o * ] + sum[o * + ];
sum[o] %= mod;
} void build(ll o,ll l,ll r)
{
L[o] = l,R[o] = r;
sum[o] = tag[o] = ;
if (l == r)
return;
ll mid = (l + r) >> ;
build(o * ,l,mid);
build(o * + ,mid + ,r);
pushup(o);
} void pushdown(ll o)
{
if (tag[o])
{
tag[o * ] += tag[o];
tag[o * ] %= mod;
tag[o * + ] += tag[o];
tag[o * + ] %= mod;
sum[o * ] += tag[o] * (R[o * ] - L[o * ] + ) % mod;
sum[o * + ] += tag[o] * (R[o * + ] - L[o * + ] + ) % mod;
tag[o] = ;
}
} void update(ll o,ll l,ll r,ll x,ll y,ll v)
{
if (x > y)
return;
if (x <= l && r <= y)
{
sum[o] += (r - l + ) * 1LL * v % mod;
sum[o] %= mod;
tag[o] += v;
tag[o] %= mod;
return;
}
pushdown(o);
ll mid = (l + r) >> ;
if (x <= mid)
update(o * ,l,mid,x,y,v);
if (y > mid)
update(o * + ,mid + ,r,x,y,v);
pushup(o);
} void update2(ll o,ll l,ll r,ll pos,ll v)
{
if (l == r)
{
sum[o] = v;
return;
}
pushdown(o);
ll mid = (l + r) >> ;
if (pos <= mid)
update2(o * ,l,mid,pos,v);
else
update2(o * + ,mid + ,r,pos,v);
pushup(o);
} ll query(ll o,ll l,ll r,ll x,ll y)
{
if (x > y)
return ;
if (x <= l && r <= y)
return sum[o];
pushdown(o);
ll res = ;
ll mid = (l + r) >> ;
if (x <= mid)
res += query(o * ,l,mid,x,y);
res %= mod;
if (y > mid)
res += query(o * + ,mid + ,r,x,y);
res %= mod;
return res;
} void solve1()
{
build(,,n);
for (ll i = ; i <= n; i++)
{
ll j = i;
while (j < n && e[i].y == e[j + ].y)
j++;
for (ll k = i; k <= j; k++)
update(,,n,e[k].x2,n,-);
for (ll k = i; k <= j; k++)
ans1[e[k].id] = query(,,n,,e[k].x - );
for (ll k = i; k <= j; k++)
update2(,,n,e[k].id,e[k].x - );
i = j;
}
} void solve2()
{
build(,,n);
for (ll i = ; i <= n; i++)
{
ll j = i;
while (j < n && e[i].y == e[j + ].y)
j++;
for (ll k = i; k <= j; k++)
update(,,n,,e[k].x - ,-);
for (ll k = i; k <= j; k++)
ans2[e[k].id] = query(,,n,e[k].x2,n);
for (ll k = i; k <= j; k++)
update2(,,n,e[k].id,n - e[k].x2 + );
i = j;
}
} int main()
{
scanf("%d",&n);
for (ll i = ; i <= n; i++)
{
scanf("%lld%lld",&e[i].x,&e[i].y);
b[++tot] = e[i].x;
}
b[++tot] = inf;
sort(b + ,b + + tot);
sort(e + ,e + + n,cmp2);
for (ll i = ; i <= n; i++)
{
e[i].x2 = upper_bound(b + ,b + + tot,e[i].x) - b;
e[i].x = lower_bound(b + ,b + + tot,e[i].x) - b;
e[i].id = i;
}
sort(e + ,e + + n,cmp);
solve1();
sort(e + ,e + + n,cmp);
solve2();
for (ll i = ; i <= n; i++)
{
ans += ans1[i] * ans2[i] % mod;
ans %= mod;
} printf("%lld\n",ans); return ;
}
bzoj2441 [中山市选2011]小W的问题(debug中)的更多相关文章
- 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"出来.具 ...
- bzoj2441【中山市选】小W的问题
题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...
- 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)-……个符合题意的(容斥原理), 容斥系数就是莫比乌斯函数μ(预处理)... ----------------- ...
- BZOJ 2440 [中山市选2011]完全平方数 (二分 + 莫比乌斯函数)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4805 Solved: 2325[Submit][Sta ...
- 【BZOJ 2440】 2440: [中山市选2011]完全平方数 (二分+容斥原理+莫比乌斯函数)
2440: [中山市选2011]完全平方数 Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数 ...
- BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4920 Solved: 2389[Submit][Sta ...
随机推荐
- Docker自学纪实(六)搭建docker私有仓库
docker的镜像仓库分两种:一种是从官方公有仓库拉取:还有就是自己搭建私有仓库.官方的镜像仓库是面对整个应用市场的:私有仓库一般用于公司内部,就是公司项目自身所需的镜像.搭建私有仓库有什么好处?私有 ...
- 【c学习-6】
void myFunction4(){ //根据用户字段和密码字段判定是否允许登录 //定义原密码和用户字段 char user[10]={"liupeng"};//设置用户名字段 ...
- yii2 url 美化参数
所谓的url参数美化就是将冗长的字符串 进行正则替换 yii2 框架的url参数美化完成需要完成两个阶段 第一个阶段分apache和nginx 两种的配置 apache :1.1 必须开启rewrit ...
- linux poll用法
相对于select来说,poll 也是在指定时间内论询一定数量的文件描述符,来测试其中是否有就绪的,不过,poll 提供了一个易用的方法,来实现 i/o 复用. 声明如下: #include < ...
- 十三、MySQL之IDE工具介绍及数据备份
一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 # ...
- div嵌套img高度不相同
div中嵌套img,如果div里嵌套一个img元素且div的高度是由img的高度来撑开,那么div的高度总会比img的高度多3px. 可以明显看到div实际高度高出img高度3px.为了解决此问题,我 ...
- 5. css定位 居中
1.准备工作 (1)添加背景图片 background: url('images/grass.png') (2)背景图片格式 background-size:contain; #完全限制在方框 #co ...
- django中间件CsrfViewMiddleware源码分析,探究csrf实现
Django Documentation csrf保护基于以下: 1. 一个CSRF cookie 基于一个随机生成的值,其他网站无法得到.此cookie由CsrfViewMiddleware产生.它 ...
- pycharm的使用二
一.pycharm设置参数 设置传入程序的参数:Alt+shift+F10 → Edit Configurations → 选中所需要进行设置参数的脚本 → Script parameters:输入设 ...
- (A)eclipse搭建springboot项目入门
网上许多资料都是用idea的,但是我个人用eclipse习惯了,所以就在eclipse里面自己尝试着写了一个hello. 然而项目建好后却迟迟不能访问!!!网上搜了许多资料都不靠谱! 虽然最后能看到h ...