#include<cstdio>
#include<vector>
#include<algorithm>
#define NODEBUG
using namespace std;
vector<vector<int> > K;
vector<vector<int> > P;
int main() {
int k, a1;
scanf("%d %d",&k,&a1);
K.resize(k);
P.resize(500001);
for(int i=0;i<a1;++i)
K[0].push_back(0);
for(int i=2;i<=k;++i) {
int n,a;
scanf("%d",&n);
for(int j=0;j<n;++j) {
scanf("%d",&a);
K[i-1].push_back(a);
}
}
/*for(int i=0;i<K.size();++i){
printf("%d\n",K[i].size());
}*/
vector<int> lisc(500001,1);
vector<int> w(500001,0);
vector<int> wlast(500001,0);
int zapas=0;
int ilesplast=0;
for(int d=k;d>0;d--) {
#ifdef DEBUG
printf("dzien %d\n",d);
#endif
int ilesp=K[d-1].size();
/*kopiujemy uczestnikow z nastepnego dnia */
if(d<k) {
copy(w.begin(),w.begin()+ilesplast,wlast.begin());
fill(w.begin(),w.begin()+ilesp,0);
for(int sp=0;sp<ilesplast;++sp){
if(K[d][sp])
w[K[d][sp]-1]+=wlast[sp];
}
}
/* populujemy liscie korzystając z zapasu */
for(int i=0;i<ilesp;++i) {
if(lisc[i]) {
w[i]=1;
if(zapas>0)
zapas--;
}
}
/* w powinniśmy mieć zapisane */
#ifdef DEBUG
for(int i=0;i<ilesp;++i){
printf(" t%d %d %d poprz: %d\n",i,lisc[i],w[i],K[d-1][i]);
}
#endif
/* teraz te co nie maja poprzednika trzeba skonkludować*/
for(int i=0;i<ilesp;++i) {
if(K[d-1][i]==0) {
zapas+=w[i];
}
}
#ifdef DEBUG
printf("zapas: %d\n",zapas);
#endif
/* teraz obliczamy liscie do nastepnego kroku */
if(d>1) {
int ilespn=K[d-2].size();
fill(lisc.begin(),lisc.begin()+ilespn,1);
for(int sp=0;sp<ilesp;++sp)
if(K[d-1][sp]>0)
lisc[K[d-1][sp]-1]=0;
}
ilesplast=ilesp;
}
printf("%d\n",zapas);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include<cstdio> #include<vector> #include<algorithm> #define NODEBUG using namespace std; vector<vector<int> > K; vector<vector<int> > P; int main() { int k, a1; scanf("%d %d",&k,&a1); K.resize(k); P.resize(500001); for(int i=0;i<a1;++i) K[0].push_back(0); for(int i=2;i<=k;++i) { int n,a; scanf("%d",&n); for(int j=0;j<n;++j) { scanf("%d",&a); K[i-1].push_back(a); } } /*for(int i=0;i<K.size();++i){ printf("%d\n",K[i].size()); }*/ vector<int> lisc(500001,1); vector<int> w(500001,0); vector<int> wlast(500001,0); int zapas=0; int ilesplast=0; for(int d=k;d>0;d--) { #ifdef DEBUG printf("dzien %d\n",d); #endif int ilesp=K[d-1].size(); /*kopiujemy uczestnikow z nastepnego dnia */ if(d<k) { copy(w.begin(),w.begin()+ilesplast,wlast.begin()); fill(w.begin(),w.begin()+ilesp,0); for(int sp=0;sp<ilesplast;++sp){ if(K[d][sp]) w[K[d][sp]-1]+=wlast[sp]; } } /* populujemy liscie korzystając z zapasu */ for(int i=0;i<ilesp;++i) { if(lisc[i]) { w[i]=1; if(zapas>0) zapas--; } } /* w powinniśmy mieć zapisane */ #ifdef DEBUG for(int i=0;i<ilesp;++i){ printf(" t%d %d %d poprz: %d\n",i,lisc[i],w[i],K[d-1][i]); } #endif /* teraz te co nie maja poprzednika trzeba skonkludować*/ for(int i=0;i<ilesp;++i) { if(K[d-1][i]==0) { zapas+=w[i]; } } #ifdef DEBUG printf("zapas: %d\n",zapas); #endif /* teraz obliczamy liscie do nastepnego kroku */ if(d>1) { int ilespn=K[d-2].size(); fill(lisc.begin(),lisc.begin()+ilespn,1); for(int sp=0;sp<ilesp;++sp) if(K[d-1][sp]>0) lisc[K[d-1][sp]-1]=0; } ilesplast=ilesp; } printf("%d\n",zapas); return 0; } |
English