前言
我對官方的spj或是其他原因導致的第一題的IE有一點不滿------浪費了我十幾分鍾.
這次E,F比賽時又沒做出來,做DP不太成熟啦~
樣例已經給你一個較精確的值了.
#include<cstdio>
using namespace std;
int main() {
double n; scanf("%lf",&n);
printf("%.5lf",n*6.28318530717958623200);
return 0;
}
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;
}
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;
}
讀者自推不難.
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;
}
設第個數最終去到.
.
由此貪心思路可以得到一個區間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;
}
又是樹形DP.
對於一個沒有顏色的大小爲n的連通塊,顯然有種路徑不含顏色.
由此發現求不含顏色的路徑數更方便.
對於一個顏色爲的節點,此時求一下對不含顏色的路徑數的貢獻.
此時被圈出的點構成一個不含的最大連通塊.貢獻爲
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;
}