AtCoder Beginner Contest 163 solution

前言

我對官方的spj或是其他原因導致的第一題的IE有一點不滿------浪費了我十幾分鍾.

這次E,F比賽時又沒做出來,做DP不太成熟啦~

AA

樣例已經給你一個較精確的值了.

#include<cstdio>
using namespace std;
int main() {
	double n; scanf("%lf",&n);
	printf("%.5lf",n*6.28318530717958623200); 
	return 0;
}


BB

int n,m,s;

int main() {
	qr(n); qr(m);
	for(int i=1,x;i<=m;i++)
		qr(x),s+=x;
	if(n<s) puts("-1");
	else pr2(n-s);
	return 0;
}

CC

int n,d[N];

int main() {
	qr(n);
	for(int i=2,x;i<=n;i++)
		qr(x),d[x]++;
	for(int i=1;i<=n;i++) pr2(d[i]);
	return 0;
}

DD

讀者自推不難.

ll n,m,s[N],ans;

int main() {
	qr(n); qr(m); n++;
	for(int i=1;i<=n;i++) {
		s[i]=(s[i-1]+i)%mod;
		if(i>=m) (ans+=i*(n+1)-2*s[i]+1)%=mod;
	}
	pr2(ans);
	return 0;
}

EE

設第ii個數最終去到pip_i.

ipi=max(ipi,pii)\because |i-p_i|=\max(i-p_i,p_i-i).

ifipi=ipi,ai,pi\therefore if |i-p_i|=i-p_i 意味着向左走更優,可以發現a_i更大,p_i應該更小

由此貪心思路可以得到一個區間DP的方法

#include<cstdio>
#include<cstring>
#include<algorithm>
#define mk make_pair
using namespace std;
typedef long long ll;
const int N=2010;

int n;
pair<ll,ll> a[N];
ll f[N][N];
//f[i][j]表示前j-i+1個數選[i,j] 

int main() {
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		ll x; scanf("%lld",&x);
		a[i]=mk(x,i);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++) f[i][i]=a[1].first*abs(a[1].second-i);
	for(int k=2;k<=n;k++) {
		int x=a[k].first,y=a[k].second;
		for(int i=1,j=k;j<=n;i++,j++) 
			f[i][j]=max(f[i][j-1]+x*llabs(y-j),f[i+1][j]+x*llabs(y-i));
	}
	printf("%lld\n",f[1][n]); return 0;
}
	

FF

又是樹形DP.

對於一個沒有顏色cc的大小爲n的連通塊,顯然有n(n+1)/2n*(n+1)/2種路徑不含顏色cc.

由此發現求不含顏色cc的路徑數更方便.

對於一個顏色爲ccxx節點,此時求一下對不含顏色cc的路徑數的貢獻.

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-y4dLdFje-1587367175542)(C:\Program Files\Typora\image-20200420151709517.png)]

此時被圈出的點構成一個不含cc的最大連通塊.貢獻爲34/2=63*4/2=6

DP過程維護不被圈出的點的數量即可.

#include<map>
#include<set>
#include<queue>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lc (x<<1)
#define rc (x<<1|1)
#define gc getchar()//(p1==p2&&(p2=(p1=buf)+fread(buf,1,size,stdin),p1==p2)?EOF:*p1++)
#define mk make_pair
#define pi pair<int,int>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2e5+10,size=1<<20;

//char buf[size],*p1=buf,*p2=buf;
template<class o> void qr(o &x) {
	char c=gc; x=0; int f=1;
	while(!isdigit(c)){if(c=='-')f=-1; c=gc;}
	while(isdigit(c)) x=x*10+c-'0',c=gc;
	x*=f;
}
template<class o> void qw(o x) {
	if(x/10) qw(x/10);
	putchar(x%10+'0');
}
template<class o> void pr1(o x) {
	if(x<0)x=-x,putchar('-');
	qw(x); putchar(' ');
}
template<class o> void pr2(o x) {
	if(x<0)x=-x,putchar('-');
	qw(x); puts("");
}

int n,a[N],sz[N],cnt[N];
ll ans[N];
vector<int>e[N];
void add(int x,int y) {e[x].push_back(y);}

ll f(ll n) {return n*(n+1)/2;}

void dfs(int x,int F) {
	int c=a[x];
	ll tot=cnt[c],last;
	sz[x]=1;
	for(auto y:e[x]) if(y^F) {
		last=cnt[c];
		dfs(y,x);
		ans[c]+=f(sz[y]-(cnt[c]-last));
		sz[x]+=sz[y];
	}
	cnt[c]=tot+sz[x];
}

int main() {
	qr(n);
	for(int i=1;i<=n;i++) qr(a[i]);
	for(int i=1,x,y;i<n;i++) 
		qr(x),qr(y),add(x,y),add(y,x);
	dfs(1,0); ll t=f(n);
	for(int i=1;i<=n;i++) pr2(t-(ans[i]+f(n-cnt[i])));
	return 0;
}


int main() {
qr(n);
for(int i=1;i<=n;i++) qr(a[i]);
for(int i=1,x,y;i<n;i++)
qr(x),qr(y),add(x,y),add(y,x);
dfs(1,0); ll t=f(n);
for(int i=1;i<=n;i++) pr2(t-(ans[i]+f(n-cnt[i])));
return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章