2008 ACM-ICPC CERC

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=324

比赛就过了4题:A,B,C,G,这场比赛的难度比之前的好像要大很多,发挥的也不好。


A题:找规律,当3k+7为质数时取值为1,其余取值为0

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxn 10000000
int pri[maxn+5];
int a[maxn+5];
int b[1000005];
void getprime()
{
	for (int i=2;i<=maxn;i++)
	{
		if (pri[i]==0) pri[++pri[0]]=i;
		for (int j=1;j<=pri[0] && pri[j]<=maxn/i;j++)
		{
			pri[pri[j]*i]=1;
			if (i%pri[j]==0) break;
		}
	}
	for (int i=1;i<=pri[0];i++)
	{
		a[pri[i]]=1;
	}
}

int main()
{
	getprime();
	int n,i,x;
	b[1]=0;
	for(i=2;i<=1000000;i++)
	if(a[3*i+7]==1)b[i]=b[i-1]+1;
	else b[i]=b[i-1];
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		printf("%d\n",b[x]);
	}
	return 0;
}


B题:预处理一下,然后查找就可以了

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int a[1000005];
struct st
{
	int id;
	int data;
}b[1000005];
int t,n,d;

struct st2
{
	int len;
	int num;
};
vector<st2> v;

bool cmp(st a,st b)
{
	if (a.data==b.data) return a.id<b.id;
	else return a.data<b.data;
}

int main()
{
	scanf("%d",&t);
	while (t--)
	{
		v.clear();
		scanf("%d%d",&n,&d);
		for (int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			b[i].data=a[i];
			b[i].id=i;
		}
		a[0]=-1;
		a[n+1]=-1;
		sort(b+1,b+n+1,cmp);
		st2 x;
		x.len=0;
		x.num=2;
		v.push_back(x);
		for (int i=1;i<=n;i++)
		{
			vector<int> vv;
			vv.push_back(b[i].id);
			while (i<n && b[i].data==b[i+1].data)
			{
				i++;
				vv.push_back(b[i].id);
			}
			x.len=b[i].data;
			x.num=v[v.size()-1].num;
			for (auto p:vv)
			{
				if (a[p-1]>a[p]) x.num++;
				if (a[p-1]<a[p]) x.num--;
				if (a[p+1]>a[p]) x.num++;
				if (a[p+1]<a[p]) x.num--;
			}
			v.push_back(x);
		}
		int j=0;
		for (int i=1;i<=d;i++)
		{
			int x;
			scanf("%d",&x);
			while (j<(int)v.size()-1 && v[j+1].len<=x) j++;
			printf("%d",v[j].num/2);
			if (i!=d) printf(" ");
		}
		printf("\n");
	}
	return 0;
}


C题:强行推导,一开始认为只要a|c,b|d或a|d,b|c即可,后来发现当lcm(a,b)|c的时候有可能也可以,把这一类特殊情况考虑了即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
int t;
ll x,y,a,b;

int judge(ll a,ll b,ll x,ll y)
{
	if (x%a==0 && y%b==0) return 1;
	else if (y%a==0 && x%b==0) return 1;
	else return 0;
}

ll extend_gcd(ll a,ll b,ll &x,ll &y)
{
	if (a==0 && b==0) return -1;
	if (b==0) {x=1;y=0;return a;}
	ll d=extend_gcd(b,a%b,y,x);
	y-=a/b*x;
	return d;
}

int f(ll xx,ll a,ll b)
{
	if (xx%__gcd(a,b)!=0) return 0;
	ll g=__gcd(a,b);
	xx/=g;
	a/=g;
	b/=g;
	extend_gcd(a,b,x,y);
	x*=xx;
	y*=xx;
	if (x<0)
	{
		ll k=abs(x)/b+1;
		x+=b*k;
		y-=a*k;
		if (x>=0 && y>=0) return 1;
	}
	else
	{
		ll k=abs(y)/a+1;
		x-=b*k;
		y+=a*k;
		if (x>=0 && y>=0) return 1;
	}
	return 0;
}

int main()
{
	scanf("%d",&t);
	while (t--)
	{
		scanf("%lld%lld%lld%lld",&a,&b,&x,&y);
		int can=0;
		if (judge(a,b,x,y)) can=1;
		else
		{
			if (x%(a*b/__gcd(a,b))==0 && f(y,a,b)) can=1;
			if (y%(a*b/__gcd(a,b))==0 && f(x,a,b)) can=1;
		}
		if (can==1) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}


G题:

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

const int maxx = 500050;
int a[maxx];
int b[maxx];
int c[maxx];
int n;

int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		scanf("%d",&n);
		for(int i = 1; i <= n; i++)
		{
			scanf("%d",&a[i]);
		}
		int cnt = 0;
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		for(int i = 1; i <= n; i++)
		{
			b[a[i]] = ++cnt;
		}
	//	for(int i = 1; i <= n; i++)
	//	printf("%d ",b[i]);
	//	cout<<endl;
		for(int i = 1,k = a[i]; i <= n; i++)
		{
			if(i == 1)
			{
				c[a[i]] = 0;
			}
			else
			{
				if(b[a[i-1]+1] < b[a[i]+1])
				{
					c[a[i]] = c[a[i-1]];
				}
				else c[a[i]] = c[a[i-1]] + 1;
			}
		}
		int fk = 1;
		for(int i = 1; i <= n; i++)
		{
			if(c[i] >= 26)
			{
				fk = 0;
				printf("-1\n");
				break;
			}
		}
		if(fk)
		{
			for(int i = 1; i <= n; i++)
			{
				printf("%c",c[i]+'a');
			}
			cout<<endl;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/njupt_lyy/article/details/81023536