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 ...
随机推荐
- iOS APP之间到跳转,以及热门应用,手机自带到应用跳转
应用之间的跳转 在第一个APP中,做如下操作:1.在info.plist文件中的"信息属性列表"下添加一项:"URL类型"; 2.点开"URL类型&q ...
- php按照中文首字母排序
1> 网络上很多php的工具类可以将汉字转为拼音: 2> 将拼音进行排序即可 另一种则是类似mysql转码方式: 1 foreach ($array as $key=>$value) ...
- CSS 的优先级机制[总结]
样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...
- shell的含义
shell:壳,是操作linux最直接的方式,通过shell中输入命令和linux系统进行交互. shell是一个小盒子,每一个有独立的命名空间,登录后的操作就是一个shell(有可能是bash,zs ...
- javascript中name,value等属于保留字
前几天在练习js代码的时候,碰到了一个坑,这是让人醉了. html代码如下: <div> <div> <!--输入 123456--> <lable>请 ...
- vue的挖坑和爬坑之vuex的简单入门
首先vuex的中文文档https://vuex.vuejs.org/zh-cn/ 首先vuex是什么,官方解释是 Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应 ...
- Python的locals()函数
Python的locals()函数会以dict类型返回当前位置的全部局部变量. 示例代码: def func(): arg_a, arg_b = 'a', 'b' def func_a(): pass ...
- Hibernate学习笔记(1)---hibernate快速上手与准备工作
持久层介绍 持久化:将内存中的数据保存在磁盘等存储设备中. 持久化对象:指已经存储在数据库护着磁盘的业务对象 经典的软件应用体系结构(三层结构) 在三层结构中,由于业务逻辑除了负责业务逻辑以外,还要负 ...
- Hive Getting Started补充
配置管理概述 Hive从<install-dir>/conf/hive-default.xml中读取它的默认配置 Hive配置目录的位置可以通过设置HIVE_CONF_DIR环境变量的值来 ...
- 深入理解ES6之—块级绑定
var声明与变量提升 使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部).这就是所谓的变量提升. 块级声明 块级声 ...