codeforces补题计划——#572(div2)

2 篇文章 0 订阅

神奇的div2场

不打真的亏了

A.白给的

如果1和0个数相同就把第一字符单独输出

#include<bits/stdc++.h>
using namespace std;

const int maxn=100+5; 
int n;
int a,b;
string x;

int main()
{
	cin>>n;
	cin>>x;
	for(int i=1;i<=n;i++)
	{
		if(x[i-1]=='1') a++;
		if(x[i-1]=='0') b++;
	}
	if(a!=b)
	{
		cout<<1<<endl;
		cout<<x<<endl;
	}
	else
	{
		cout<<2<<endl;
		cout<<x[0]<<" ";
		for(int i=1;i<n;i++)
		{
			cout<<x[i];
		}
	}
	return 0;
}

B.白给

排序,按照顺序摆放,a[i+1]肯定比a[i]大所以,两边的和必然大于中间的数字

对于最大的数字,判断其是否小于次小与第三小数字之和,如果小于把最后一个数字与倒数第二个数字换位置就可以了

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int n;
int a[maxn];

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(a+1,a+1+n);
	if(a[n]>=a[n-1]+a[n-2]) 
	{
		cout<<"NO"<<endl;
	}
	else
	{
		cout<<"YES"<<endl; 
		for(int i=1;i<=n-2;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<a[n]<<" "<<a[n-1];
	}
	return 0;
}

C.emmm

因为每个位置上只有0-9所以前缀和,然后对10求除法就可以了

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int n,m,x,y;
int a[maxn],s[maxn];
int main()
{
	cin>>n;
	s[0]=0;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		s[i]=a[i]+s[i-1];
	}
	cin>>m;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		cout<<(s[y]-s[x-1])/10<<endl;
	}
	return 0;
}

D1.

看了好久没看懂题,真的应该多学学嘤语了

如果某个节点有的度为2就不可以满足条件

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
int n,x,y;
int a[maxn];
int main()
{
	cin>>n;
	for(int i=1;i<=n-1;i++)
	{
		scanf("%d%d",&x,&y);
		a[x]++;
		a[y]++;
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i]==2)
		{
			cout<<"NO"<<endl;
			return 0;
		}
	}
	cout<<"YES"<<endl; 
	return 0;
}

E.

不太懂为啥的卡了很久

貌似数组开的有点问题的样子

对于那个同余方程左右两边都乘一个(ai-aj)

然就变成ai四次方-k*ai=aj四次方-k*aj(mod p)

然后就枚举就好了

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5;
long long n,p,k,x;
map<long long,long long> mp;
long long num,temp;
long long ans=0;
int main()
{
	ans=0;
	cin>>n>>p>>k;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&x);
		num=x%p;
		num=(((num*num)%p)*((num*num)%p))%p; 
		temp=(k*x)%p;
		num=(num-temp)%p;
		if(num<0) num=num+p;
		ans=ans+mp[num];
		mp[num]++;
	}
	cout<<ans<<endl;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值