Cod sursa(job #22974)

Utilizator Spike7d5Spike7d5 Spike7d5 Data 27 februarie 2007 21:22:51
Problema Asmax Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#define N 16005
#define M 32005

int x[M], y[M], a[M], b[M];
int n, i, j, v[N], t[N], s[N], ps[N], pe[N], c[N], cs, cd;

void sort(int l, int r);

int main () {
freopen ("asmax.in", "r", stdin);
freopen ("asmax.out", "w", stdout);

scanf ("%d%d", &n, &i);
v[0]=0; for (i=1;i<=n;i++) scanf ("%d", &v[i]);

for (i=0;i<2*(n-1);i+=2) { scanf ("%d%d", &x[i], &y[i]); x[i+1]=y[i]; y[i+1]=x[i]; }
x[2*(n-1)]=y[2*(n-1)]=n+1;
sort (0, 2*(n-1));

ps[0]=ps[1]=0; pe[0]=0;
for (i=1;x[i]<n;i++) if (x[i]!=x[i+1]) { pe[x[i]]=i; ps[x[i+1]]=i+1; }
pe[n]=i;

cs=cd=0;
c[0]=1;
t[0]=t[1]=1;
while (cs<=cd) {
  for (i=ps[c[cs]];i<=pe[c[cs]];i++)
    if (t[y[i]]==0) {
      t[y[i]]=x[i];
      cd++;
      c[cd]=y[i]; }
  cs++; }

for (i=n-1;i>0;i--) {
  s[c[i]]+=v[c[i]];
  if (s[c[i]]>0)
    s[t[c[i]]]+=s[c[i]]; }
s[1]+=v[1];

cs=s[1];
for (i=2;i<=n;i++) if (cs<s[i]) cs=s[i];
printf ("%d\n", cs);

return 0;
}

void sort(int l, int r) {
int c, i, j, k;
if (l==r) return;
c=(l+r)/2;
sort(l, c);
sort(c+1, r);

i=l; j=c+1; k=l;
while (i<=c && j<=r)
  if (x[i]<x[j]) {
    b[k]=y[i];
    a[k++]=x[i++]; }
  else {
    b[k]=y[j];
    a[k++]=x[j++]; }

while (i<=c) { b[k]=y[i]; a[k++]=x[i++]; }
while (j<=r) { b[k]=y[j]; a[k++]=x[j++]; }

for (k=l; k<=r; k++) { x[k]=a[k]; y[k]=b[k]; } }