这次上海邀请赛差一点就能拿到牌子了,好可惜。。。。。
Game回来写了下,刚开始把重链写成了最大权子树,无限WA,然后一直在调。。。。。
发现我一旦提交上去错了就始终在找程序BUG,从来没想过是不是思路哪里错掉了。。。。其实这种交上去WA之后应该先去找思路上的错误,而不是怀疑题目有陷阱什么的。。。
#include<stdio.h> #include<string.h> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<math.h> using namespace std; #define out(x) cout<<#x<<": "<<x<<endl const double eps(1e-8); const int maxn=100100; const long long inf=-1u>>1; typedef long long ll; struct Edge{ int v,next; }edge[maxn<<1]; int n,tot,k,cnt; int head[maxn]; ll a[maxn],sum[maxn],p[maxn],num[maxn]; ll ans; void addedge(int u,int v){ edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } void dfs1(int u){ int post=edge[head[u]].v; sum[u]=a[u]; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; dfs1(v); if(sum[v]>sum[post]) post=v; //sum[u]+=sum[v]; } if(head[u]!=-1) sum[u]+=sum[post]; } void dfs2(int u){ int post=edge[head[u]].v; if(num[u]==0){ p[cnt++]=a[u]; } else{ for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; if(sum[v]>=sum[post]) { post=v; } } a[post]+=a[u]; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].v; dfs2(v); } } } void init() { memset(head,-1,sizeof(head)); memset(num,0,sizeof(num)); memset(p,0,sizeof(p)); memset(sum,0,sizeof(sum)); scanf("%d%d",&n,&k); tot=0; cnt=0; int u,v; for(int i=1;i<=n;i++) scanf("%lld",&a[i]); for(int i=2;i<=n;i++) { scanf("%d%d",&u,&v); num[u]++; addedge(u,v); } } void work() { dfs1(1); dfs2(1); sort(p,p+cnt); ans=0; for(int i=1;i<=k&&cnt-i>=0;i++){ ans+=p[cnt-i]; } //printf("%lld\n",ans); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif int t,cas=1; scanf("%d",&t); while(t--){ init(); work(); printf("Case #%d: %lld\n",cas++,ans); } return 0; }
friends:
这道题知道结论了就好简单。。。。
先单独考虑一门语言的情况,假设其有k种可能,则两门语言的时候则是k*k种语言,依次类推。。。。
像这种数学题其实都应该先从简单的数据去想,只有先找到简单数据的做法,再试着根据简单的数据推至复杂的数据,或者从简单的数据里找规律
高精度加快速幂一下。。
#include<stdio.h> #include<string.h> #include<vector> #include<list> #include<deque> #include<queue> #include<stack> #include<map> #include<set> #include<bitset> #include<algorithm> #include<math.h> using namespace std; #define out(x) cout<<#x<<": "<<x<<endl const double eps(1e-8); const int maxn=10100; const long long inf=-1u>>1; typedef long long ll; int n; struct BigInt{ const static int mod=10000; const static int DLEN=4; int a[6000],len; BigInt(){ memset(a,0,sizeof(a)); len=1; } BigInt(int v){ memset(a,0,sizeof(a)); len=0; do{ a[len++]=v%mod; v/=mod; }while(v); } BigInt operator +(BigInt &b){ BigInt res; res.len=max(len,b.len); for(int i=0;i<=res.len;i++) res.a[i]=0; for(int i=0;i<res.len;i++){ res.a[i]+=((i<len)?a[i]:0)+((i<b.len)?b.a[i]:0); res.a[i+1]+=res.a[i]/mod; res.a[i]%=mod; } if(res.a[res.len]>0) res.len++; return res; } BigInt operator *(BigInt b){ BigInt res; for(int i=0;i<len;i++){ int up=0; for(int j=0;j<b.len;j++){ int tmp; tmp=a[i]*b.a[j]+res.a[i+j]+up; up=tmp/mod; res.a[i+j]=tmp%mod; } if(up!=0){ res.a[i+b.len]=up; } } res.len=len+b.len; while(res.a[res.len-1]==0&&res.len>1) res.len--; return res; } void output(){ printf("%d",a[len-1]); for(int i=len-2;i>=0;i--){ printf("%04d",a[i]); } printf("\n"); } }; void init() { scanf("%d",&n); } int main() { #ifndef ONLINE_JUDGE //freopen("in.txt","r",stdin); #endif int t,cas=1; scanf("%d",&t); while(t--){ init(); BigInt ans=BigInt(1),b=BigInt(32); while(n){ if(n&1) ans=ans*b; b=b*b; n>>=1; } printf("Case #%d: ",cas++); ans.output(); } return 0; }
时间: 2024-09-30 19:16:06