2019浙大校赛部分题解及代码

A

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

const int MAXN=100100;
int a[MAXN],b[MAXN],a1[MAXN],b1[MAXN],a2[MAXN],b2[MAXN];

int main()
{
	int T,i,j,p,q,ans,n,m,a1sum,a2sum,b1sum,b2sum;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		for(i=1;i<=n;i++)
			scanf("%d",&a[i]);
		for(i=1;i<=m;i++)
			scanf("%d",&b[i]);
		a1sum=a2sum=b1sum=b2sum=0;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&p);
			if(p)
				a1[a1sum++]=a[i];
			else
				a2[a2sum++]=a[i];
		}
		for(i=1;i<=m;i++)
		{
			scanf("%d",&q);
			if(q)
				b1[b1sum++]=b[i];
			else
				b2[b2sum++]=b[i];
		}
		sort(a1,a1+a1sum);
		sort(a2,a2+a2sum);
		sort(b1,b1+b1sum);
		sort(b2,b2+b2sum);
		ans=0;
		for(i=0,j=0;i<a1sum&&j<b2sum;)
		{
			if(a1[i]<b2[j])
			{
				ans++;
				i++;
				j++;
			}
			else
				j++;
		}
		for(i=0,j=0;i<b1sum&&j<a2sum;)
		{
			if(b1[i]<a2[j])
			{
				ans++;
				i++;
				j++;
			}
			else
				j++;
		}
		printf("%d\n",ans);
	}
}

B

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

string add(string s1,string s2)
{
	if(s1.length()<s2.length())
		swap(s1,s2);
	int i,j,x,lazy=0;
	for(i=s1.length()-1,j=s2.length()-1;j>=0;i--,j--)
	{
		x=lazy+s1[i]-'0'+s2[j]-'0';
		s1[i]=x%10+'0';
		lazy=x/10;
	}
	for(;i>=0&&lazy;i--)
	{
		x=lazy+s1[i]-'0';
		s1[i]=x%10+'0';
		lazy=x/10;
	} 
	if(lazy)
		return char(lazy+'0')+s1;
	else
		return s1;
}

void div2(string& s)
{
	int i,x,lazy=0;
	for(i=0;i<s.length();i++)
	{
		x=lazy*10+s[i]-'0';
		s[i]=x/2+'0';
		lazy=x%2;
	}
	if(s[0]=='0')
	{
		s=s.substr(1);
		if(s=="")
			s="0";
	}
}

int main()
{
	int T;
	string s,ans;
	cin>>T;
	while(T--)
	{
		cin>>s;
		ans="0";
		while(s!="0")
		{
			div2(s);
			ans=add(ans,s);
		}
		cout<<ans<<endl;
	}
}

C

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

const int MAXN=2020;
int mz[MAXN][MAXN],vis[MAXN][MAXN][3];
char s[250];

int function(int x,int y)
{
	return 81*mz[x][y]+27*mz[x-1][y]+9*mz[x+1][y]+3*mz[x][y-1]+mz[x][y+1];
}

int main()
{
	int T,n,m,a,b,i,j,id,ans;
	long long k;
	char ch;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&m);
		scanf("%d%d%lld",&a,&b,&k);
		scanf(" %s",&s);
		for(i=1;i<=n;i++)
			for(j=1;j<=m;j++)
			{
				scanf(" %c",&ch);
				mz[i][j]=ch-'0';
				vis[i][j][0]=vis[i][j][1]=vis[i][j][2]=-1;
			}
		ans=0;
		while(k--)
		{
			if(vis[a][b][mz[a][b]]==ans)
				break;
			vis[a][b][mz[a][b]]=ans;
			id=function(a,b);
			if(s[id]=='U')
			{
				if(mz[a-1][b]!=1)
					a--;
			}
			else if(s[id]=='D')
			{
				if(mz[a+1][b]!=1)
					a++;
			}
			else if(s[id]=='L')
			{
				if(mz[a][b-1]!=1)
					b--;
			}
			else if(s[id]=='R')
			{
				if(mz[a][b+1]!=1)
					b++;
			}
			else if(s[id]=='P')
			{
				if(mz[a][b]==2)
				{
					mz[a][b]=0;
					ans++;
				}
			}
		}
		printf("%d\n",ans);
	}
}//

D

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

int main()
{
	int c,u,d,l,r,i;
	char s[250];
	for(i=0;i<243;i++)
	{
		c=i/81%3;
		u=i/27%3;
		d=i/9%3;
		l=i/3%3;
		r=i/1%3;
		if(c==2)
			s[i]='P';
		else if(c==1)
			s[i]='I';
		else if(u==2)
			s[i]='U';
		else if(l==2)
			s[i]='L';
		else if(d==2)
			s[i]='D';
		else if(r==2)
			s[i]='R';
		else if(u==1&&d==0&&(l==0||l==1)&&r==0)
			s[i]='R';
		else if((u==0||u==1)&&d==0&&l==0&&r==1)
			s[i]='D';
		else if(u==0&&d==1&&l==0&&(r==0||r==1))
			s[i]='L';
		else if(u==0&&(d==0||d==1)&&l==1&&r==0)
			s[i]='U';
		else if(r==0)
			s[i]='R';
		else if(d==0)
			s[i]='D';
		else if(l==0)
			s[i]='L';
		else if(u==0)
			s[i]='U';
		else
			s[i]='R';
	}
	s[243]=0;
	printf("%s\n",s);
}//

E

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

const int MAXN=110;
long long a[MAXN],b[MAXN];

int main()
{
	int T,n,i;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		for(i=1;i<=n;i++)
			scanf("%lld",&b[i]);
		for(i=n;i>=1;i--)
		{
			if(b[i]<a[i])
				break;
			b[i-1]+=b[i]-a[i];
		}
		if(i<1)
			printf("Yes\n");
		else
			printf("No\n");
	} 
}

F

unsloved

G

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

const int MAXN=100100;
long long a[MAXN],b[MAXN];

int main()
{
	int T,n,k,i,asum,bsum;
	long long ans,x;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d%d",&n,&k);
		asum=bsum=0;
		for(i=1;i<=n;i++)
		{
			scanf("%lld",&x);
			if(x>=0)
				a[asum++]=x;
			else
				b[bsum++]=-x;
		}
		sort(a,a+asum);
		sort(b,b+bsum);
		ans=0;
		for(i=asum-1;i>=0;i-=k)
			ans+=a[i]*2;
		for(i=bsum-1;i>=0;i-=k)
			ans+=b[i]*2;
		ans-=max(a[asum-1],b[bsum-1]);
		printf("%lld\n",ans);
	}
}

H

unsloved

I

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

const long long mod=1e9+7;

const int MAXN=44;
vector<int> vec[MAXN];
int fa[MAXN];
long long w[MAXN],squsum[MAXN],sum[MAXN],num[MAXN],exc[MAXN];

long long powmod(long long x,long long p)
{
	long long ret=1;
	while(p)
	{
		if(p&1)
			ret=ret*x%mod;
		x=x*x%mod;
		p>>=1;
	}
	return ret;
}

long long inv(long long x)
{
	return powmod(x,mod-2);
}

int findfa(int x)
{
	return fa[x]==x?x:fa[x]=findfa(fa[x]);
}

void dfs(int setid,int id,long long status,long long total)
{
	if(id>=vec[setid].size())
	{
		squsum[setid]=(squsum[setid]+total*total%mod)%mod;
		sum[setid]=(sum[setid]+total)%mod;
		num[setid]++;
		return;
	}
	int x=vec[setid][id];
	dfs(setid,id+1,status,total);
	if(!(exc[x]&status))
		dfs(setid,id+1,status|(1ll<<x),total*w[x]%mod);
}

int main()
{
	int n,m,x,y,i;
	long long ans,squ_total,sum_total,num_total,ave;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&w[i]);
		w[i]%=mod;
		fa[i]=i;
	}
	while(m--)
	{
		scanf("%d%d",&x,&y);
		fa[findfa(x)]=findfa(y);
		exc[x]|=1ll<<y;
		exc[y]|=1ll<<x;
	}
	for(i=1;i<=n;i++)
	{
		vec[findfa(i)].push_back(i);
	}
	squ_total=1;
	sum_total=1;
	num_total=1;
	for(i=1;i<=n;i++)
	{
		if(!vec[i].size())
			continue;
		dfs(i,0,0,1);
		squ_total=squ_total*squsum[i]%mod;
		sum_total=sum_total*sum[i]%mod;
		num_total=num_total*num[i]%mod;
	}
	ave=sum_total*inv(num_total)%mod;
	ans=squ_total*inv(num_total)%mod-ave*ave%mod;
	ans=(ans%mod+mod)%mod;
	printf("%lld\n",ans);
}

J

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

int main()
{
	int T;
	long long n;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%lld",&n);
		if(n==1)
			printf("8 9\n");
		else
			printf("%lld %lld\n",2*n,3*n);
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值