Codeforces 1091 Good Bye 2018

占个坑先,希望不要掉的太惨了吧,不要掉到上一次之前的rating

upt:flag竟然没到,开心。

A - New Year and the Christmas Ornament

好像没什么可说的。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;

typedef long long ll;
const int Maxn=210000;

int main() {
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if(a+1<=b&&a+2<=c) {
		printf("%d",3*a+3);
	}
	else if(b<=a+1&&b+1<=c) {
		printf("%d",3*b);
	}
	else if(c<=a+2&&c<=b+1) {
		printf("%d",3*c-3);
	}
	return 0;
}

B - New Year and the Treasure Geolocation

有一个显然的结论,x的最小值加的一定是最大的x变化量,y同理。因为数据保证有解那么直接找即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;

typedef long long ll;
const int Maxn=210000;

int n,x[Maxn],y[Maxn],a[Maxn],b[Maxn];

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&x[i],&y[i]);
	sort(x+1,x+n+1),sort(y+1,y+n+1);
	for(int i=1;i<=n;i++)
		scanf("%d%d",&a[i],&b[i]);
	sort(a+1,a+n+1),sort(b+1,b+n+1);
	printf("%d %d
",x[1]+a[n],y[1]+b[n]);
	return 0;
}

C - New Year and the Sphere Transmission

考虑两个数产生的答案不同当且仅当他们与n的gcd不同,那么就枚举n的约数,然后计算即可,具体参考代码。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;

typedef long long ll;
const int Maxn=210000;

int n,num;
ll x[Maxn];

void work(int n,int k) {
	ll d=n/k;
	x[++num]=n*(d-1)/2+d;
}

int main() {
	scanf("%d",&n);
	for(int i=1;i*i<=n;i++)
		if(n%i==0) {
			work(n,i);
			work(n,n/i);
		}
	sort(x+1,x+num+1);
	for(int i=1;i<=num;i++) if(x[i]!=x[i-1]) printf("%I64d ",x[i]);
	return 0;
}

D - New Year and the Permutation Concatenation

瞎猜了一波规律就过了,具体也说不清楚。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cmath>
#include<cctype>
using namespace std;

typedef long long ll;
const int Maxn=2100000;
const int mod=998244353;

int n;
ll jc[Maxn],ans;

ll powp(ll a,ll b) {
	ll ans=1;
	while(b) {
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
}

ll C(int x,int y) {
	return jc[x]*powp(jc[y],mod-2)%mod*powp(jc[x-y],mod-2)%mod;
}

int main() {
	scanf("%d",&n);
	jc[0]=1;
	for(int i=1;i<=n;i++)
		jc[i]=jc[i-1]*i%mod;
	for(int i=0;i<=n;i++) ans=(ans+C(n,i)*(jc[i]-1)%mod*jc[n-i]%mod)%mod;
	ans=(ans+1)%mod;
	printf("%I64d
",ans);
	return 0;
}

E - New Year and the Acquaintance Estimation

这个就是根据题目里面的链接,根据里面的一个结论,设第(i)个点的度数为(d_i),将所有的点的度数排起来,即(d_1ge d_2 ge cdots ge d_n),那么这个图合法当且仅当对于所有的(1le k le n),满足(sum_{i=1}^kd_ile kcdot (k-1)+sum_{i=k+1}^nmin(d_i,k)),具体证明请参考题目里面的维基百科连接。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const int Maxn=2100000;

int n,d[Maxn],bj[Maxn],ans[Maxn],num;
ll pre[Maxn];

int main() {
	scanf("%d",&n);
	for(int i=0;i<n;i++)
		scanf("%d",&d[i]);
	sort(d,d+n);
	for(int i=1;i<=n;i++) pre[i]=pre[i-1]+d[i-1];
	int j=0;
	for(int k=1;k<=n;k++) {
		ll l=pre[n]-pre[n-k],r=(ll)k*(k-1);
		while(j<n&&d[j]<k) j++;
		r+=pre[min(j,n-k)]+1ll*max(0,n-k-j)*k;
		ll now=d[n-k],diff=l-r;
		if(diff<=k&&diff<=now) {
			bj[max(diff,0ll)]++;
			bj[now+1]--;
		}
		l-=d[n-k],r+=min(d[n-k],k);
		diff=r-l;
		if(diff>=now+1) {
			bj[now+1]++;
			bj[min(diff+1,(ll)n+1)]--;
		}
	}
	j=0;
	for(int i=0;i<=n;i++) {
		j+=bj[i];
		if(j==n&&(pre[n]+i&1)==0) ans[++num]=i;
	}
	if(num==0) puts("-1");
	else for(int i=1;i<=num;i++) printf("%d ",ans[i]);
	return 0;
}

F - New Year and the Mallard Expedition

这个就是贪心,首先每次走的距离都是半米的倍数,而且在岩浆上一定要用体力,如果体力不够的话就必须往回走,那么在水上走一定要比在地上走要优。

然后剩余的体力一定要在地上用,如果地上剩下了再在水上用,这样二分一下在地上能用多少,然后计算答案。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const int Maxn=110000;

int n;
ll l[Maxn],a[Maxn],ans;
char s[Maxn];

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%I64d",&l[i]);
	scanf("%s",s+1);
	for(int i=1;i<=n;i++) l[i]<<=1;
	ll w=0,g=0,st=1,flag=5;
	for(int i=1;i<=n;i++) {
		if(s[i]=='G') g+=l[i],ans+=5*l[i];
		if(s[i]=='W') w+=l[i],flag=3,ans+=3*l[i];
		if(s[i]=='L') {
			ans+=l[i];
			ll re=l[i],sxz=min(re,w);
			re-=sxz,w-=sxz;sxz=min(re,g);
			re-=sxz,g-=sxz;
			if(re) ans+=re*flag;
		}
		if(!g&&!w) st=i+1;
	}
	ll las=(g+w)/2;
	if(las) {
		ll lc=0,rc=0,mid,res=0;
		for(int i=st;i<=n;i++) if(s[i]=='G') rc+=l[i];
		rc=min(rc,las);
		while(lc<=rc) {
			mid=lc+rc>>1;ll re=mid;
			for(int i=n;i>=st;i--)
				if(s[i]=='G') {
					a[i]=min(re,l[i]);
					re-=a[i];
				}
			ll now=0;
			for(int i=st;i<=n;i++) {
				if(s[i]=='G') now+=l[i]-2*a[i];
				if(s[i]=='W') now+=l[i];
				if(s[i]=='L') now-=l[i];
				if(now<0) {
					rc=mid-1;
					goto orznh;
				}
			}
			lc=mid+1;res=mid;
			orznh:;
		}
		ans-=res*4+(las-res)*2;
	}
	ans>>=1;printf("%I64d
",ans);
	return 0;
}

原文地址:https://www.cnblogs.com/shanxieng/p/10201229.html