BZOJ 1818: [Cqoi2010]内部白点(树状数组)
解题思路
首先一定不可能有\(-1\)的情况,因为新产生的黑点不会造成任何贡献,它的各个方面都是不优的。那么只需要统计一遍答案,首先要将横坐标相同的两个点看成一条竖线,纵坐标相同的点看成一条横线,然后从下往上扫描,遇到竖线的下端点时,在树状数组里\(+1\),遇到竖线上端点时,\(-1\),然后遇到横线时就统计答案。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100005;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,a[N],ans,cnt,f[N],u;
struct Node{
int x,y;
}node[N];
struct Data{
int x,y,k,z;
friend bool operator<(const Data A,const Data B){
return A.y==B.y?A.k>B.k:A.y<B.y;
}
}data[N<<2];
inline bool cmp1(Node A,Node B){
return A.x==B.x?A.y<B.y:A.x<B.x;
}
inline bool cmp2(Node A,Node B){
return A.y==B.y?A.x<B.x:A.y<B.y;
}
inline void Insert(int x,int l,int r,int k){
if(!k) {data[++cnt].x=l; data[cnt].z=r; data[cnt].y=x;}
else {
data[++cnt].x=x; data[cnt].y=l; data[cnt].k=1;
data[++cnt].x=x; data[cnt].y=r; data[cnt].k=-1;
}
}
inline void build(){
sort(node+1,node+1+n,cmp1);
for(int i=2;i<=n;i++)
if(node[i].x==node[i-1].x)
Insert(node[i].x,node[i-1].y,node[i].y,1);
sort(node+1,node+1+n,cmp2);
for(int i=2;i<=n;i++)
if(node[i].y==node[i-1].y)
Insert(node[i].y,node[i-1].x,node[i].x,0);
}
inline void update(int x,int y){
for(;x<=u;x+=x&-x) f[x]+=y;
}
inline int query(int x){
int ret=0;
for(;x;x-=x&-x) ret+=f[x];
return ret;
}
inline void work(){
sort(data+1,data+1+cnt);
for(int i=1;i<=cnt;i++){
if(!data[i].k) ans+=query(data[i].z-1)-query(data[i].x);
else update(data[i].x,data[i].k);
}
}
int main(){
n=rd(); ans=n; int x,y;
for(int i=1;i<=n;i++){
x=rd(),y=rd(); a[i]=x;
node[i].x=x,node[i].y=y;
}
sort(a+1,a+1+n); u=unique(a+1,a+1+n)-a-1;
for(int i=1;i<=n;i++)
node[i].x=lower_bound(a+1,a+1+u,node[i].x)-a;
build(); work();
printf("%d\n",ans);
return 0;
}
BZOJ 1818: [Cqoi2010]内部白点(树状数组)的更多相关文章
- B1818 [Cqoi2010]内部白点 树状数组
这个题的想法很好想,就是进行排序之后直接检查每个点的上下左右是否有黑点就行.但是直接枚举显然不行,那怎么办呢?我们就用树状数组维护扫描线,把每排左右点看成一条线覆盖,然后从下往上扫,遇到下加一,遇到上 ...
- BZOJ 1818: [Cqoi2010]内部白点 扫描线+树状数组
问题转化为求每一个极长横线段与极长纵线段的交点个数. 这个东西用扫描线+树状数组维护一下就可以了. code: #include <cstdio> #include <algorit ...
- bzoj 1818: [Cqoi2010]内部白点
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...
- bzoj 1818 Cqoi2010 内部白点 扫描线
[Cqoi2010]内部白点 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1126 Solved: 530[Submit][Status][Disc ...
- BZOJ 1818: [Cqoi2010]内部白点 (BIT + 扫描线)
就是求多条线段的交点数,直接BIT+扫描线就行了. 注意不要算重最初存在的点. CODE #include<bits/stdc++.h> using namespace std; char ...
- 【BZOJ】1818: [Cqoi2010]内部白点(树状数组+离散+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=1818 这一题一开始我就看错了,bzoj的那个绝对值109简直坑人,应该是10^9,我直接写了个暴力. ...
- BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树
[题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...
- [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】
题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...
- BZOJ 2743: [HEOI2012]采花 [树状数组 | 主席树]
题意: 查询区间中出现次数$>2$的颜色个数 一眼主席树,区间中$l \le last[i] \le r$的个数减去$l \le last[last[i]] \le r$的个数,搞两颗主席树来做 ...
随机推荐
- python web自动化测试框架搭建(功能&接口)——接口公共方法
接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...
- mysql - 标识列
#标识列 /* 又称为自增长列 含义:可以不用手动插入值,系统提供默认的序列值 特点: 1.表示列必须和主键搭配吗?不一定,但是要求是一个key 2.一个表中只能有一个标识列! 3.标识列的类型有限制 ...
- hdu4352 XHXJ's LIS(数位dp)
题目传送门 XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- jsp:useBean的属性class值一直报错的问题
先附上代码: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...
- MyBatis 配置/注解 SQL CRUD 经典解决方案(2019.08.15持续更新)
本文旨在记录使用各位大神的经典解决方案. 2019.08.14 更新 Mybatis saveOrUpdate SelectKey非主键的使用 MyBatis实现SaveOrUpdate mybati ...
- 68.Palindromic Substrings(回文字符串的个数)
Level: Medium 题目描述: Given a string, your task is to count how many palindromic substrings in this ...
- Quartz实现数据库动态配置定时任务
项目实战 或许实现的方式跟之前的代码有点不一样的 1.定时任务的配置信息 @Configuration public class ScheduleConfigration { @Autowired p ...
- 实现combobox模糊查询的时候报错 InvalidArgument=“0”的值对于“index”无效
因为要对combobox实现模糊查询,因为系统实现的匹配只能从左到右进行匹配,所以利用两个list来进行模糊匹配,主要代码如下: List<string> listOnit = new L ...
- socket - Linux 套接字
总览 #include <sys/socket.h> mysocket = socket(int socket_family, int socket_type, int protocol) ...
- Linux知识-不断更新2
为了自己看的更清楚,也为了不断的总结,每次更新后都会另发一篇. 工作中遇到某一文件夹磁盘空间不够,当然每次都是清理日志,最后发现还是不太行,还不能扩容,只能先想办法迁移目录,避免此问题发生,但在这之前 ...