UPC5725小奇画画【贪心or瞎搞】

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;
}

猜你喜欢

转载自blog.csdn.net/Pandapan1997/article/details/81256234