Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么会超时呀,难道用了list慢了,我也是树状数组做的呀/* * ===================================================================================== * * Filename: 3321.cpp * * Description: * * Version: 1.0 * Created: 2008-8-15 13:20:06 * Revision: none * Compiler: gcc * * Author: Chen Kai (remlostime), remlostime@yahoo.com.cn * Company: Shanghai University * * ===================================================================================== */ #include <iostream> #include <list> using namespace std; list<int> node[100001]; int childNum[100001]; // include itself int c[100001]; int cSize = 0; bool canUse[100001]; bool full[100001]; int index2c[100001]; int n; inline int sum(int index); void dfs(int index); inline int lowbit(int x); inline void add(int index, int delta); int main() { memset(canUse, true, sizeof(canUse)); scanf("%d", &n); int a, b; for(int i = 0; i < n - 1; i++) { scanf("%d%d", &a, &b); node[a].push_back(b); node[b].push_back(a); canUse[a] = canUse[b] = false; } memset(canUse, true, sizeof(canUse)); canUse[1] = false; dfs(1); /* for(int i = 1; i <= n; i++) cout << index2c[i] << ' '; cout << endl; for(int i = 1; i <= n; i++) cout << childNum[i] << ' '; cout << endl; */ int m; scanf("%d\n", &m); char op; int index; memset(full, true, sizeof(full)); memset(c, 0, sizeof(c)); for(int i = 1; i <= n; i++) add(i, 1); for(int i = 0; i < m; i++) { scanf("%c%d\n", &op, &index); if (op == 'Q') { int index1 = index2c[index]; int index2 = index2c[index] - childNum[index]; printf("%d\n", sum(index1) - sum(index2)); } else { int index1 = index2c[index]; full[index] = !full[index]; if (full[index]) add(index1, 1); else add(index1, -1); } } return 0; } void dfs(int index) { childNum[index] = 1; for(list<int>::iterator iter = node[index].begin(); iter != node[index].end(); iter++) if (canUse[*iter]) { canUse[*iter] = false; dfs(*iter); childNum[index] += childNum[*iter]; } index2c[index] = ++cSize; } inline int lowbit(int x) { return x & (-x); } inline void add(int index, int delta) { while (index <= n) { c[index] += delta; index += lowbit(index); } } inline int sum(int index) { int ret = 0; while (index) { ret += c[index]; index -= lowbit(index); } return ret; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator