Acwing第 54 场周赛完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing第 54 场周赛完结相关的知识,希望对你有一定的参考价值。

最近很忙,周赛一般都是随便打的。
T2wa了好久,做完T2就吃饭去了。


短暂的高光。。。

目录

4428. 字符串【签到】

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
map<char,int>mp;
int main(void)

    cin>>n>>s;
    for(int i=0;i<s.size();i++)
     
        s[i]=tolower(s[i]);
        if(s[i]>='a'&&s[i]<='z') mp[s[i]]++;
    
    if(mp.size()==26) puts("YES");
    else puts("NO");
    return 0;

4429. 无线网络【思维 / 二分】


正解是O(nlogn),我一看想到了O(n*n log n) 的做法。最后卡了一个特殊的值,卡了好久才发现。
我的想法是处理出各个点到这两个站点的距离,枚举一个站点的半径,二分另一个站点的半径。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long int LL;
LL n,xx1,yy1,xx2,yy2;
LL x[N],y[N],len1[N],len2[N];
LL get(LL x,LL y,LL xx,LL yy)

	return (x-xx)*(x-xx)+(y-yy)*(y-yy);

bool check(LL s1,LL s2)

	for(int i=1;i<=n;i++)
		if(s1<len1[i]&&s2<len2[i]) return false;
	return true;

int main(void)

	cin>>n>>xx1>>yy1>>xx2>>yy2;
	LL maxv=-1e9;
	for(int i=1;i<=n;i++)
	
		cin>>x[i]>>y[i];
		len1[i]=get(xx1,yy1,x[i],y[i]);
		len2[i]=get(xx2,yy2,x[i],y[i]);
		maxv=max(maxv,len2[i]);
	
	LL ans=1e18;
	for(int i=0;i<=n;i++)
	
		LL l=0,r=maxv;
		while(l<r)
		
			LL mid=(l+r)/2;
			if(check(len1[i],mid)) r=mid;
			else l=mid+1;
		
		ans=min(ans,len1[i]+l);
	
	cout<<ans;
	return 0;

你会发现一个点的半径确定了,那个另一个点的半径就是没有覆盖的点到这个点的最大距离。
O(n*n)的做法。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
typedef long long int LL;
LL n,xx1,yy1,xx2,yy2;
LL x[N],y[N],len1[N],len2[N];
LL get(LL x,LL y,LL xx,LL yy)

	return (x-xx)*(x-xx)+(y-yy)*(y-yy);

int main(void)

	cin>>n>>xx1>>yy1>>xx2>>yy2;
	for(int i=1;i<=n;i++)
	
		cin>>x[i]>>y[i];
		len1[i]=get(xx1,yy1,x[i],y[i]);
		len2[i]=get(xx2,yy2,x[i],y[i]);
	
	LL ans=1e18;
	for(int i=0;i<=n;i++)
	
		LL temp=0;
		for(int j=1;j<=n;j++) if(len1[i]<len1[j]) temp=max(temp,len2[j]);
		ans=min(ans,len1[i]+temp);
	
	cout<<ans;
	return 0;

可以排序后进一步的优化,线性的处理参考y总的做法。这里懒的写了。

4430. 括号序列【思维】


通过分析不难发现有两种情况:

  • 一种是左括号的数量多余右括号2个。
  • 一种是右括号的数量多余左括号2个。

我们只讨论右括号的数量多余左括号2个这种情况,另一种情况直接做镜像一样处理即可。

#include<bits/stdc++.h> 
using namespace std;
int n,l,r;
string s;
int main(void)

	cin>>n>>s;
	for(int i=0;i<s.size();i++)
		if(s[i]=='(') l++;
		else r++;
	if(abs(l-r)!=2) puts("0");
	else
	
		if(l>r)
		
		 	reverse(s.begin(),s.end());
		 	for(int i=0;i<s.size();i++) 
			 	if(s[i]=='(') s[i]=')';
			 	else s[i]='(';
		
		int index=0,ans=0;
		l=0,r=0;
		for(int i=0;i<s.size();i++)
		
			if(s[i]=='(') l++,index++;
			else r++,index--;
			if(index<0)//说明右括号多余左括号
			
				ans=r;
				index=i+1;
				l++,r--;
				break;
			
		
		for(int i=index;i<s.size();i++)//判断翻转后的剩余的是否合法。
		
			if(s[i]=='(') l++;
			else r++;
			if(r>l) ans=0;
		
		cout<<ans;
	
	return 0;

以上是关于Acwing第 54 场周赛完结的主要内容,如果未能解决你的问题,请参考以下文章

Acwing第 53 场周赛完结

Acwing第 31 场周赛完结

Acwing第 36 场周赛完结

Acwing第 56 场周赛完结

Acwing第 32 场周赛完结

Acwing第 59 场周赛完结