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

6

1 10

2 1

3 5

4 6

5 1

6 10

Sample Output

3

HINT

对于100%的数据满足N ≤ 200 000,0 ≤ xi ≤ 10^9,0 ≤ yi ≤ 10^9

Source

Day2

开始做这道题的时候还是正中午,现在......

这题真的是烦,如果横纵坐标不相等,还好点,现在相等了,直接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中)的更多相关文章

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

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

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

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

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

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

  4. bzoj2441【中山市选】小W的问题

    题目描述 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个“W”出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), ( ...

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

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

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

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

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

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

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

    2440: [中山市选2011]完全平方数 Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数 ...

  9. BZOJ2440: [中山市选2011]完全平方数(莫比乌斯+容斥原理)

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

随机推荐

  1. Hutool Wiki For java

    发现一款不错的java工具类, http://www.hutool.cn/ Hutool的使用文档. 项目见 https://github.com/looly/hutool 以及 http://git ...

  2. linux上面安装svn步骤

    一.安装 使用yum,非常简单 yum install subversion 二.配置 2.1.创建仓库 我们这里在/home下建立一个名为svn的仓库(repository),以后所有代码都放在这个 ...

  3. mysql 自定义不规则排序

    mysql按id的指定顺序进行排序,以前解决过一次,后来忘了,记录一下 SELECT * FROM `table` WHERE id<6 order by field(id,3,5,1,2,4)

  4. python+scrapy环境搭建步骤描述

    Python3(3.5.4)搭建爬虫系统步骤描述: 1.下载python安装包,路径:https://www.python.org/downloads/windows/  选择3.5.4版本64位的安 ...

  5. 一个操作轻松截取长图,Win10上网截长图小技巧!

    截屏的方法有很多,但是有时候我们会遇到比电脑屏幕还大的图,比如网站上的长图.N条引用的评论...你要怎么截取呢?是不是最多只能截全屏?还是要做到第三方的截图软件呢? 下面介绍一种win10电脑自带的滚 ...

  6. stark组件(7):增加分页功能

    效果图: 分页部分代码: # 1.分页处理 all_count = self.model_class.objects.all().count() query_params = request.GET. ...

  7. DFS初级剪枝及心得

    关于DFS心得: 1.利用结构体,记录mark和题目要求的基本属性. 2.用到递归,使用递归时注意要设置出口,即符合要求时return,注意对递归的理解,对于不同情况可能要传递不同的参数,但出口都是一 ...

  8. 通过IIS共享文件夹来实现静态资源"本地分布式"部署

    以下以文件型数据库(如sqlite)为例 楼主话:以下内容,若有不专业处,大胆喷,虚心求教. 起因:要进行一个项目的分布式部署,而这个项目所涉及的其中一个数据库为sqlite(经测试,同为文件型数据库 ...

  9. 用for循环计算(1-3+5-7...99)的结果(两种方法)

    1) sum=0 count=1 for i in range(1,100,2): if count % 2==0: sum = sum - i else: sum = sum + i count = ...

  10. Eclipse Java 构建路径 ---Eclipse教程第13课

    Eclipse Java 构建路径 设置 Java 构建路径 Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包 项目相关的 jar 包及类文件 项目引用的的类库 我们可以通 ...