POJ3321 dfs序+树状数组

来源:互联网 发布:java 迭代器 for循环 编辑:程序博客网 时间:2024/05/16 13:51

题意:给一棵n个节点的树,每个节点开始有一个苹果,m次操作

1.将某个结点的苹果数异或 1
2.查询一棵子树内的苹果数

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new Task().solve() ;}}class Task {InputReader in = new InputReader(System.in);PrintWriter out = new PrintWriter(System.out);List<Integer>[] adj  ;int[] left , right ;int dfn ;void dfs(int u){left[u] = ++dfn ;for(int v : adj[u]){if(left[v] == -1) dfs(v) ;}right[u] = dfn ;}int n ;int[] val ;void add(int id , int c){for(; id <= n ; id += Integer.lowestOneBit(id)) val[id] += c ;}int sum(int id){int res = 0 ;for(; id >= 1 ; id -= Integer.lowestOneBit(id)) res += val[id] ;return res ;}void solve(){    n = in.nextInt() ; adj = new List[n+1] ;left = new int[n+1] ;right = new int[n+1] ;boolean[] hasApple = new boolean[n+1] ; for(int i = 1 ; i <= n ; i++){adj[i] = new ArrayList<Integer>() ;hasApple[i] = true ;}for(int i = 1 ; i < n ; i++){int u = in.nextInt() ;int v = in.nextInt() ;adj[u].add(v) ;adj[v].add(u) ;}Arrays.fill(left , -1) ;dfn = 0 ;dfs(1) ;val = new int[n+1] ;Arrays.fill(val , 0) ;for(int i = 1 ; i <= n ; i++) add(i , 1) ;int m = in.nextInt() ; while(m-- > 0){if("Q".equals(in.next())){int v = in.nextInt() ;out.println(sum(right[v]) - sum(left[v]-1)) ;}else{int v = in.nextInt() ;add(left[v] , hasApple[v] ? -1 : 1) ;hasApple[v] = !hasApple[v] ;}}out.flush() ;}}class InputReader {public BufferedReader reader;public StringTokenizer tokenizer;public InputReader(InputStream stream) {reader = new BufferedReader(new InputStreamReader(stream), 32768);tokenizer = new StringTokenizer("");}private void eat(String s) {tokenizer = new StringTokenizer(s);}public String nextLine() {try {return reader.readLine();} catch (Exception e) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String s = nextLine();if (s == null)return false;eat(s);}return true;}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}public double nextDouble() {return Double.parseDouble(next());}public BigInteger nextBigInteger() {return new BigInteger(next());}}




0 0
原创粉丝点击