BZOJ2441: [中山市选2011]小W的问题
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2441
首先要注意到x1>x3且x5>x3(要是没有这个设定就是树状数组水题了。。
这题正反做两个V乘起来就是答案了。。
对y排序,每一个点找出在它左上方的点的个数记为sum,然后只要我们每次访问一个点的时候就把它对于在它右边的点的贡献全部删掉,那么询问一个点的答案就是在它左边所有点的sum之和了。
具体写起来比较烦。。
Orz http://blog.csdn.net/u012288458/article/details/48880559
按id开线段树,每个点维护两个域分别表示相同点中最左那个点的id和第一个比它大的点的id
首先这个算点的贡献,要这个点已经被计算过才可以减掉贡献,可以开一个变量来记录当前区间有多少个点已经被计算过。
然后减贡献的时候,可以让这个点右边的所有的点都减掉贡献。然后加上贡献的时候只要也加上左边所有点点数就可以了。
但是这样做的话要注意分开来做。毕竟贡献要全部减完才能来计算答案。。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define down(i,l,r) for (int i=l;i>=r;i--)
#define clr(x,y) memset(x,y,sizeof(x))
#define ll long long
#define low(i) (i&(-i))
#define maxn 200500
#define mm 1000000007
#define inf 2000000000
using namespace std;
struct node{int l,r,len; ll tag,sum;
}t[maxn*];
struct data{int x,x2,y,id;
}a[maxn];
ll c[maxn],f[maxn][];
int n,tot,b[maxn];
int read(){
int x=,f=; char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
return x*f;
}
bool cmp(data a,data b){
return a.x<b.x;
}
bool cmp2(data a,data b){
return a.y<b.y;
}
void up(int i){
if (t[i].l==t[i].r) return;
t[i].sum=;
t[i].len=t[i*].len+t[i*+].len;
if (t[i*].len) t[i].sum=(t[i].sum+t[i*].sum)%mm;
if (t[i*+].len) t[i].sum=(t[i].sum+t[i*+].sum)%mm;
}
void push(int i,ll val){
t[i].tag=(t[i].tag+val)%mm;
t[i].sum=(t[i].sum+1LL*val*t[i].len)%mm;
}
void Down(int i){
if (t[i].l==t[i].r) return;
if (t[i].tag){
push(i*,t[i].tag); push(i*+,t[i].tag);
t[i].tag=;
}
}
ll query(int i,int L,int R){
if (L>R) return ;
if (t[i].len==) return ;
int l=t[i].l,r=t[i].r,mid=(l+r)/;
Down(i);
if (L<=l&&r<=R) return t[i].sum;
if (R<=mid) return query(i*,L,R);
else if (L>mid) return query(i*+,L,R);
else return (query(i*,L,mid)+query(i*+,mid+,R))%mm;
}
void change(int i,int pos,ll val){
Down(i);
if (t[i].l==t[i].r) {t[i].len=; t[i].sum=(t[i].tag+val)%mm; return;}
int mid=(t[i].l+t[i].r)/;
if (pos<=mid) change(i*,pos,val);
else change(i*+,pos,val);
up(i);
}
void change2(int i,int L,int R,ll val){
if (L>R) return;
Down(i);
int l=t[i].l,r=t[i].r,mid=(l+r)/;
if (L<=l&&r<=R){
push(i,val); return;
}
if (R<=mid) change2(i*,L,R,val);
else if (L>mid) change2(i*+,L,R,val);
else change2(i*,L,mid,val),change2(i*+,mid+,R,val);
up(i);
}
void build(int i,int l,int r){
t[i].l=l; t[i].r=r;
t[i].sum=t[i].tag=t[i].len=;
if (l==r) return;
int mid=(l+r)/;
build(i*,l,mid); build(i*+,mid+,r);
} void solve(){
build(,,n);
sort(a+,a++n,cmp2);
rep(i,,n){
int j=i;
while (j<n&&a[i].y==a[j+].y) j++;
rep(k,i,j) change2(,a[k].x2,n,-);
rep(k,i,j) f[a[k].id][]=query(,,a[k].x-);
rep(k,i,j) change(,a[k].id,a[k].x-);
i=j;
}
}
void solve2(){
build(,,n);
sort(a+,a++n,cmp2);
rep(i,,n){
int j=i;
while (j<n&&a[i].y==a[j+].y) j++;
rep(k,i,j) change2(,,a[k].x-,-);
rep(k,i,j) f[a[k].id][]=query(,a[k].x2,n);
rep(k,i,j) change(,a[k].id,n-a[k].x2+);
i=j;
}
} int main(){
n=read();
rep(i,,n){
a[i].x=read(); a[i].y=read();
b[++tot]=a[i].x;
}
b[++tot]=inf;
sort(b+,b++tot);
sort(a+,a++n,cmp);
rep(i,,n) a[i].x2=upper_bound(b+,b++tot,a[i].x)-b,a[i].x=lower_bound(b+,b++tot,a[i].x)-b,a[i].id=i;
solve();
solve2();
ll ans=;
rep(i,,n) ans=(ans+f[i][]*f[i][]%mm)%mm;
printf("%lld\n",ans);
return ;
}
BZOJ2441: [中山市选2011]小W的问题的更多相关文章
- bzoj2441 [中山市选2011]小W的问题(debug中)
2441: [中山市选2011]小W的问题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 487 Solved: 186[Submit][Statu ...
- 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 ...
随机推荐
- ucore lab1 bootloader学习笔记
---恢复内容开始--- 开机流程回忆 以Intel 80386为例,计算机加电后,CPU从物理地址0xFFFFFFF0(由初始化的CS:EIP确定,此时CS和IP的值分别是0xF000和0xFFF0 ...
- Java SE 8 流库(三)
1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...
- ZooKeeper如何保证单一视图
由于ZooKeeper的数据模型简单且全部在内存中,ZooKeeper的速度非常快.它提供了一系列保证: • 顺序一致性 • 原子性 • 单一视图 • 可靠性 • 实时性 下面将结合源码(3.4.10 ...
- 记录python学习过程中的一些小心得
1.python中一切皆对象,内置数据结构也是对象.处理一个对象就是利用它带有的方法和属性,对该对象进行处理,一步步达到我们想要的结果. 2.编程时,先构思好我们处理的对象是什么,具有哪些属性和方法, ...
- js解析xml浏览器兼容性处理
/****************************************************************************** 说明:xml解析类 ********** ...
- leetcode — word-break
import java.util.Arrays; import java.util.HashSet; import java.util.Set; /** * Source : https://oj.l ...
- JS大小写字母转换
var a = "ABCd"; console.log(a.toLowerCase());//转换成小写 console.log(a.toUpperCase());//转换成大写
- Micropython教程之TPYBoardv102 DIY蓝牙智能小车实例
1.实验目的 1.学习在PC机系统中扩展简单I/O接口的方法. 2.进一步学习编制数据输出程序的设计方法. 3.学习蓝牙模块的接线方法及其工作原理. 4.学习L298N电机驱动板模块的接线方法. 5. ...
- angular4.0运行在微信端的坑坑洼洼
最近的一个项目,我用ng4操刀,踩了超多的坑: 坑1:项目build后,刷新后404错误: 解决方案:<angular4.0项目build发布后,刷新页面报错404> 坑2:微信分享: 运 ...
- CSS Content 属性
content 属性,用在after,before伪元素上,用于在选中的元素前后插入内容. 插入的内容多种多样, 纯文字 h1::after{ content:"h1后插入内容" ...