小奇画画(线段树+map)(水题)
5725: 小奇画画
时间限制: 1 Sec 内存限制: 128 MB
提交: 632 解决: 140
[提交] [状态] [讨论版] [命题人:admin]
题目描述
红莲清泪两行欲吐半点却无
如初是你杳然若绯雾还在水榭畔画楼处
是谁衣白衫如初谁红裳如故
——《忆红莲》
小奇想画几朵红莲,可惜它刚开始学画画,只能从画圆开始。小奇画了n个圆,它们的圆心都在x轴上,且两两不相交(可以相切)。现在小奇想知道,它画的圆把画纸分割成了多少块?(假设画纸无限大)
输入
第一行包括1个整数n。
接下来n行,每行两个整数x,r,表示小奇画了圆心在(x,0),半径为r的一个圆。
输出
输出一个整数表示答案。
样例输入
4 7 5 -9 11 11 9 0 20
样例输出
6
提示
对于 100%数据,1<=n<=300000,-10^9<=x<=10^9,1<=r<=10^9。
把圆切割出来的所有线段用点来代替,然后map一下,用线段树维护每个线段被覆盖的次数,更新的时候每次都+1,如果更新之前发现最小值为0,就是有的线段没有更新过,如果不为零,则所有线段都被圆覆盖过,区域被分成上下两个部分,所以要额外+1,就这样。
对了,好像是要用unordered_map不然会超时
#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <unordered_map>
#include <queue>
#include <algorithm>
#define ll long long
using namespace std;
int a[600005];
int c[600005*4];
int lazy[600005*4];
void pushup(int rt)
{c[rt]=min(c[rt*2],c[rt*2+1]);
}
void pushdown(int rt)
{if(lazy[rt]){c[rt*2]+=lazy[rt];c[rt*2+1]+=lazy[rt];lazy[rt*2]+=lazy[rt];lazy[rt*2+1]+=lazy[rt];lazy[rt]=0;pushup(rt);}
}
void update(int l,int r,int rt,int L,int R)
{if(L<=l&&r<=R){lazy[rt]++;c[rt]++;return;}pushdown(rt);int mid=(r+l)/2;if(L<=mid){update(l,mid,rt*2,L,R);}if(R>mid){update(mid+1,r,rt*2+1,L,R);}pushup(rt);
}
int query(int l,int r,int rt,int L,int R)
{if(L<=l&&r<=R){return c[rt];}pushdown(rt);int mid=(r+l)/2;int ans=99999999;if(L<=mid){ans=min(ans,query(l,mid,rt*2,L,R));}if(R>mid){ans=min(ans,query(mid+1,r,rt*2+1,L,R));}pushup(rt);return ans;
}
int n;
int ans;
typedef struct
{ll x,r;
}AC;
AC s[300005];
priority_queue<ll, vector<ll>, greater<ll> >q;
unordered_map<ll,int>mmp;
bool cmp(AC A,AC C)
{return A.r<C.r;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%lld %lld",&s[i].x,&s[i].r);q.push(s[i].x-s[i].r);q.push(s[i].x+s[i].r);}int tot=0;while(!q.empty()){if(mmp.count(q.top())==0){mmp[q.top()]=++tot;}q.pop();}sort(s+1,s+n+1,cmp);for(int i=1;i<=n;i++){//printf("query(%d %d)=%d\n",mmp[s[i].x-s[i].r],mmp[s[i].x+s[i].r],query(1,tot,1,mmp[s[i].x-s[i].r],mmp[s[i].x+s[i].r]));if(query(1,tot-1,1,mmp[s[i].x-s[i].r],mmp[s[i].x+s[i].r]-1)!=0){ans++;}update(1,tot-1,1,mmp[s[i].x-s[i].r],mmp[s[i].x+s[i].r]-1);ans++;}printf("%d\n",ans+1);return 0;
}
WA了七次,假装是水题
小奇画画(线段树+map)(水题)相关推荐
- 小清的线段树25题日志01 线段树下你和我 欢乐多又多
前言 难度大致会按排序来 就不写总结啦 嘻嘻 适合刚学线段树的人(和我一样 练手 /*if you can't see the repayWhy not just work step by stepr ...
- 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62485671 向大(hei)佬(e)势力学(di ...
- 热身小游戏(线段树,单修区修区查)
热身小游戏(线段树,单修区修区查) 链接:https://ac.nowcoder.com/acm/contest/37160/G 来源:牛客网 Alice 和 Bob 在玩热身小游戏,Alice 给出 ...
- 子段乘积(逆元费马小定理)+线段树做法
题解:一开始做这个题的时候想过尺取法,但是因为没有逆元的知识,不知道该如何不断删除左端元素.其实这题并不难想,设l,r为两端开始都置为1,当长度小于k的时候不断乘右端元素并取余,当长度等于k时删除左端 ...
- 中石油训练赛 - 小A盗墓(线段树+异或结论)
题目链接:点击查看 题目大意:给出n个数,以及m个操作,每个操作分为两种: 1 x y:将第x个数变为y 2 x y:判断闭区间[x,y]中的数能否在进行升序排序后构成一段连续且上升序列 题目分析:因 ...
- 吉首大学校赛B——干物妹小埋(线段树求最大递增子序列)
链接:https://ac.nowcoder.com/acm/contest/992/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536 ...
- 【洛谷 P2464】[SDOI2008]郁闷的小J(线段树)
题目链接 这题我很久之前用分块写过,没写出来.. 今天又看到了,于是下决心把这题做出来. 这次我用线段树写的,直接对每本书的编号Hash一下然后离散化然后各建一棵线段树,维护当前编号在某个位置有没有书 ...
- [CQOI 2006]线段树之简单题
Description 有一个n个元素的数组,每个元素初始均为0.有m条指令,要么让其中一段连续序列数字反转--0变1,1变0(操作1),要么询问某个元素的值(操作2).例如当n=20时,10条指令如 ...
- 2017西安交大ACM小学期数据结构 [线段树]
Problem B+ 发布时间: 2017年7月1日 02:08 最后更新: 2017年7月1日 02:10 时间限制: 1000ms 内存限制: 64M 描述 给定一个长度为n的序列a1 ...
最新文章
- html里字号rem,html中的em和rem到底该如何使用,自适应效果中如何确定文字大小/字号?...
- Android 线程管理
- 200 ssl服务器证书无效_服务器证书无效网站显示异常怎么办?
- 保定 机器人焊接加工厂_满城招聘|双休+五险+国企保定乐凯设备制造安装有限公司招聘满城1.6招聘信息...
- python操作memcahed
- C# 篇基础知识10——多线程
- python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)
- 盖茨透露自己曾犯下4000亿美元的错:给了安卓机会
- 用vim + xdebug 来追踪thinkphp的执行过程
- asp.net JSONHelper JSON帮助类
- oracle hibernate 自动创建表,自动创建表时,多了一张表hibernate_sequence,为什么?
- GBDT+LR算法解析及Python实现
- VS2013环境下GSL数学库的使用说明(亲测)
- 2022 年顶级网络安全专家最爱用的10大工具
- php调用pentaho,Pentaho数据源和查询
- 【LEDE】x86软路由之路-12-浅谈复杂网络环境中的AP优化
- 任务分配算法c语言程序,程序员算法基础——贪心算法
- thinkphp6教程笔记
- OpenCV-Python学习(9)—— OpenCV 通道的分离与合并(cv.split、cv.merge、cv.mixChannels、cv.inRange)
- Java数据库JDBC——prepareStatement的用法和解释