Codeforces Round #487 (Div. 2)

C. A Mist of Florescence

大致题意: 给出四个正整数\(a,b,c,d <= 100\)你需要在行数,列数分别不超过50的矩阵中填入'A'或'B'或'C'或'D'使得这四种字母构成的连通块个数分别为a,b,c,d

思路: 开始想了半天,后来发现\(a,b,c,d >=1\),我就想到先把每个字母铺一大块,然后在不破坏这一大块的连通性的前提下把一个个其他字母放入其中。我采取四个字母分别放12,13,13,12行,50列。然后随便搞一搞就行了。

#include<bits/stdc++.h>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define op operator
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
template<typename Q>
void inin(Q &x)
{
	x=0;int f=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	x=f?-x:x;
}
int a[5];
char ans[55][55];
int main()
{
	re(i,1,4)inin(a[i]),a[i]--;
	re(i,1,12)re(j,1,50)ans[i][j]='A';
	re(i,1,11)re(j,2,50)
	{
		if(!a[2])break;
		if(ans[i-1][j]!='B'&&ans[i][j-1]!='B'&&ans[i-1][j-1]!='B')ans[i][j]='B',a[2]--;
	}
	
	
	re(i,13,25)re(j,1,50)ans[i][j]='B';
	re(i,14,24)re(j,2,50)
	{
		if(!a[1])break;
		if(ans[i-1][j]!='A'&&ans[i][j-1]!='A'&&ans[i-1][j-1]!='A')ans[i][j]='A',a[1]--;
	}
	
	
	re(i,26,38)re(j,1,50)ans[i][j]='C';
	re(i,27,37)re(j,2,50)
	{
		if(!a[4])break;
		if(ans[i-1][j]!='D'&&ans[i][j-1]!='D'&&ans[i-1][j-1]!='D')ans[i][j]='D',a[4]--;
	}
	
	
	re(i,39,50)re(j,1,50)ans[i][j]='D';
	re(i,40,50)re(j,2,50)
	{
		if(!a[3])break;
		if(ans[i-1][j]!='C'&&ans[i][j-1]!='C'&&ans[i-1][j-1]!='C')ans[i][j]='C',a[3]--;
	}
	printf("50 50\n");
	re(i,1,50)printf("%s\n",ans[i]+1);
	return 0;
}

D. A Shade of Moonlight

大致题意:x轴上,n个云,月亮在0,每个云初始覆盖\((xi,xi+l)\)\(l\)给定,每个云有个速度\(v\)=-1或1,实际速度\(V=v+w\)\(w\)是风力,求有多少个无需数对\((i,j)\)使\(|w|<w_max\)的情况下存在某一时刻使\(i,j\)两个云同时覆盖月亮

思路:首先,两片云恰好有一个交点的时候盖住云一定不会差,因为每过1s,就能多跑\(w_max>=1\)的距离,而离月亮的距离只会增加1。
其次,一个\(v_j=--1\)的云,只会与\(x_i<=x_j+l 且 v_i=1\)的云\(i\)更新答案,所以先排序,把\(v=1\)的云存在栈里。
然后对于两片云,我们能算出他们交点\(X=(x_i+x_j+l)/2\),和恰好相交所需时间\(t=|X|-x_i\),盖住月亮所需最小风力\(W=|X|/t\)
然后我们对于每个\(v=-1\)的云\(j\)在栈中寻找答案。
分情况讨论:
1、\(x_i+x_j+l>=0\) 随着\(x_i\)的增大1,交点向右移动0.5,交点远离月亮0.5,相交所需时间减少0.5,所以所需风力\(W=|X|/t\)不断增大,所以可以在这些\(x_i\)中二分。
2、\(x_i+x_j+l<0\)
2.1、\(x_i+l>=0\) \(|X|<=t\)\(W<=1\)所以一定能更新答案
2.2、\(x_i+l<0\) 随着\(x_i\)的增大1,交点向右移动0.5,交点靠近月亮0.5即\(|X|-=0.5\),相交所需时间减少0.5,且\(|X|>t\)所以所需风力\(W=|X|/t\)不断增大,佐伊可以在这些\(x_i\)中二分。

#include<bits/stdc++.h>
#define rre(i,r,l) for(int i=(r);i>=(l);i--)
#define re(i,l,r) for(int i=(l);i<=(r);i++)
#define Clear(a,b) memset(a,b,sizeof(a))
#define inout(x) printf("%d",(x))
#define douin(x) scanf("%lf",&x)
#define strin(x) scanf("%s",(x))
#define op operator
typedef unsigned long long ULL;
typedef const int cint;
typedef long long LL;
using namespace std;
template<typename Q>
void inin(Q &x)
{
	x=0;int f=0;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();}
	while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
	x=f?-x:x;
}
int n,ll,w;
struct yun
{
	int x,v,y;
	bool op < (const yun &rhs)const 
	{
		return y<rhs.y;
	}
}a[100010];
int sta[100010],top;
bool js(int x,int y)
{
	LL zhong=y+x+ll;
	LL t=abs((zhong-2LL*x));
	if(t==0)return 0;
	return abs(zhong)<t*w;
}
int main()
{
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	inin(n),inin(ll),inin(w);
	re(i,1,n)inin(a[i].x),inin(a[i].v),a[i].y=a[i].x+(a[i].v==-1?ll:0);
	sort(a+1,a+n+1);
	LL ans=0;
	re(i,1,n)
		if(a[i].v==1)sta[++top]=a[i].x;
	else 
	{
//		re(j,1,top)
//			if(js(sta[j],a[i].x))
//			{ans++;cout<<i<<" "<<j<<"\n";}
		if(!top)continue;
		int l=1,r=top,mid;
		if(sta[top]+a[i].x+ll<0)l=top+1;
		else 
		{
			while(l<r)
			{
				mid=(l+r)>>1;
				if(sta[mid]+a[i].x+ll<0)l=mid+1;
				else r=mid;
			}
		}
		int fen=l;
		l=1,r=fen-1;
		if(a[i].y>0)
		{
			ans+=r-l+1; 
//			if(l<=r)
//			{
//				if(!js(sta[r],a[i].x))l=r+1;
//				else 
//				{
//					while(l<r)
//					{
//						mid=(l+r)>>1;
//						if(!js(sta[mid],a[i].x))l=mid+1;
//						else r=mid-1;
//					}
//				}
//				ans+=fen-l;
//			}
		}
		else 
		{
			if(l<=r)
			{
				if(js(sta[r],a[i].x))l=r+1;
				else 
				{
					while(l<r)
					{
						mid=(l+r)>>1;
						if(js(sta[mid],a[i].x))l=mid+1;
						else r=mid;
					}
				}
				l--;
				ans+=l;
			}
		}
		l=fen,r=top;
		if(l>r)continue;
		if(js(sta[r],a[i].x))l=r+1;
		else 
		{
			while(l<r)
			{
				mid=(l+r)>>1;
				if(js(sta[mid],a[i].x))l=mid+1;
				else r=mid;
			}
		}
		l--;
		ans+=l-fen+1;
	}
	cout<<ans;
	return 0;
}

test_update

posted on 2018-06-13 20:40  No_CE_in_Vegetable  阅读(144)  评论(0编辑  收藏  举报

导航