5725: 小奇画画
时间限制: 1 Sec 内存限制: 128 MB
提交: 433 解决: 74
[提交] [状态] [讨论版] [命题人:admin]
题目描述
红莲清泪两行欲吐半点却无
如初是你杳然若绯雾还在水榭畔画楼处
是谁衣白衫如初谁红裳如故
——《忆红莲》
小奇想画几朵红莲,可惜它刚开始学画画,只能从画圆开始。小奇画了n个圆,它们的圆心都在x轴上,且两两不相交(可以相切)。现在小奇想知道,它画的圆把画纸分割成了多少块?(假设画纸无限大)
输入
第一行包括1个整数n。
接下来n行,每行两个整数x,r,表示小奇画了圆心在(x,0),半径为r的一个圆。
输出
输出一个整数表示答案。
样例输入
扫描二维码关注公众号,回复:
2628029 查看本文章
4
7 5
-9 11 11 9
0 20
样例输出
6
提示
对于 100%数据,1<=n<=300000,-10^9<=x<=10^9,1<=r<=10^9。
思路是个好东西,没搞这个题也没去思考具体解法,队友搞得DFS过了但复杂度有些高数据再多点就卡了可能,可以用map标记一下每次的左右距离是否出现过(前提按照左边从小到大排序),然后扫一遍如果左边出现过并且右边也出现过并且在扫下一个的r出现过并且其l也出现过那么就要+2因为被分割为上下两个部分了其他情况直接+1即可。
DFS
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define FIN freopen("D://code//in.txt", "r", stdin)
#define ppr(i,x,n) for(int i = x;i <= n;i++)
#define rpp(i,n,x) for(int i = n;i >= x;i--)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 3e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
inline int read() {//读入挂
int ret = 0, c, f = 1;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -1, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
if(f < 0) ret = -ret;
return ret;
}
struct node
{
ll l,r;
}p[maxn];
map<ll,int>mmp;
vector<ll>df[maxn*2];
bool cmp(node a,node b)
{
return a.l == b.l ? a.r > b.r : a.l < b.r;
}
ll ans,flag;
void dfs(ll l,ll r)
{
ll m = mmp[l];
ll n = df[m].size()-1;
// cout<<df[mmp[l]].size()<<endl;
ppr(i,0,n)
{
// cout<<df[mmp[l]][i]<<endl;
if(df[m][i] == r)
flag++;
else if(df[m][i] < r)
dfs(df[m][i],r);
}
}
int main()
{
IO;
ll n,x,r0;
ll k = 1;
ans = 1;
cin >> n;
ppr(i,1,n)
{
cin>>x>>r0;p[i].l=x-r0;p[i].r=x+r0;
if(mmp[p[i].l] == 0)
mmp[p[i].l] = k++;
if(mmp[p[i].r] == 0)
mmp[p[i].r] = k++;
df[mmp[p[i].l]].push_back(p[i].r);
// cout<<mmp[p[i].l]<<endl;
}
ppr(i,1,n)
{
flag = 0;
dfs(p[i].l,p[i].r);
ans += (flag >= 2?2 : 1);
}
cout<<ans<<endl;
//sort(p+1,p+1+n,cmp);
return 0;
}
贪心
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define IO ios::sync_with_stdio(false),cin.tie(0)
#define FIN freopen("D://code//in.txt", "r", stdin)
#define ppr(i,x,n) for(int i = x;i <= n;i++)
#define rpp(i,n,x) for(int i = n;i >= x;i--)
const double eps = 1e-8;
const int mod = 1e9 + 7;
const int maxn = 3e5 + 7;
const double pi = acos(-1);
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
inline int read() {//读入挂
int ret = 0, c, f = 1;
for(c = getchar(); !(isdigit(c) || c == '-'); c = getchar());
if(c == '-') f = -1, c = getchar();
for(; isdigit(c); c = getchar()) ret = ret * 10 + c - '0';
if(f < 0) ret = -ret;
return ret;
}
struct node
{
ll l,r;
}p[maxn];
bool cmp(node a,node b)
{
return a.l == b.l ? a.r > b.r : a.l < b.l;
}
map <ll , int> mmp;
int main()
{
IO;
ll n,x,r0;
ll ans = 2;
cin >> n;
ppr(i,1,n){cin >> x >>r0;p[i].l = (x - r0);p[i].r = (x + r0);}
sort(p+1,p+1+n,cmp);
mmp[p[1].l] = 1;
mmp[p[1].r] = 1;
ppr(i,2,n)
{
if(p[i].l == p[i-1].l && p[i].r == p[i-1].r)
continue;
else if(p[i].l == p[i-1].l)
{
ans += 1;
mmp[p[i].r] = 1;
mmp[p[i].l] = 1;
}
else
{
if(mmp[p[i].l] == 1)
{
if(mmp[p[i].r] == 1 && mmp[p[i-1].l] == 1)
{
ans += 2;
}
else
{
ans += 1;
mmp[p[i].r] = 1;
}
}
else
{
ans += 1;
mmp[p[i].r] = 1;
}
}
}
cout<<ans<<endl;
return 0;
}