您的位置:首页 > 其它

2015上海邀请赛

2015-06-02 10:02 435 查看
这次上海邀请赛差一点就能拿到牌子了,好可惜。。。。。

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: