采摘苹果
Description
一天小g遇到了一棵神奇的蘋果樹,樹上有n個蘋果并將這n個蘋果按1-n標號,每個蘋果都會向下落,單位時間將完成一次掉落。現在規定只有當蘋果掉到1時才能采摘,除了1位置,其他位置的蘋果每一次將落到對應的pi上,直至掉落至1位置。現在規定同一時間,同一位置有偶數個蘋果時,它們消失不見,如果是奇數則剩下一個。保證最后所有的蘋果都會落到1位置上,問最后小g將收獲多少個蘋果。
?
Input
第一行一個整數n(2 <= n <= 100000),表示蘋果的個數;
第二行為n-1個整數pi (1 <= pi < i)。
Output
?輸出一個整數,表示S的最大值。
?
Sample Input
3 1 1 5 1 2 2 2 18 1 1 1 4 4 3 2 2 2 10 8 9 9 9 10 10 4Sample Output
1 3 4HINT
?
小g剛開始拿到1位置上的蘋果,然后2位置上的蘋果落到1上,3、4、5位置的蘋果落在2位置上。最后小g將得到這個兩個蘋果,總共3個蘋果。
題解:
通過分析我們其實可以發現只要考慮到1位置的步數就可以了。
#include<bits/stdc++.h> using namespace std; #define N 100005 int n,res=0,tmp; int p[N],t[N],s[N],c[N]; int main() {freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);while(~scanf("%d",&n)){res = 0;memset(p,0,sizeof(p));memset(t,0,sizeof(t));memset(s,0,sizeof(s));memset(c,0,sizeof(c));for(int i=2;i<=n;i++)scanf("%d",&p[i]);for(int i=1;i<=n;i++)tmp=c[p[i]]+1,s[tmp]++,c[i]=tmp;for(int i=1;i<=n;i++)if(s[i]&1)res++;cout<<res<<endl;} }?
總結