| ||||||||||
| 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 | |||||||||
模拟树结构,不知道为什么,总是TLE……#include "stdio.h"
#define M 110004
struct line {
int a, b, next;
} all[M * 2];
struct fork {
int r, num, t;
} fo[M];
int a[M], u;
void make(int x) {
int i;
fo[x].t = 1;
fo[x].num = 1;
for (i = a[x]; i != -1; i = all[i].next) {
if(all[i].b!=fo[x].r)
{
fo[all[i].b].r = x;
make(all[i].b);
}
}
fo[fo[x].r].num += fo[x].num;
}
void in(int x, int c) {
//fo[x].t+=c;
fo[x].num += c;
if (fo[x].r != 0)
in(fo[x].r, c);
}
int main() {
int i, m, n, x, y;
char ss[5];
while (scanf("%d", &n) > 0)
//scanf("%d",&n);
{ for (i = 1; i <= n; i++) {
a[i] = -1;
}
u = 0;
for (i = 0; i < n - 1; i++) {
scanf("%d%d", &x, &y);
all[u].a = x;
all[u].b = y;
all[u].next = a[x];
a[x] = u;
u++;
all[u].a = y;
all[u].b = x;
all[u].next = a[y];
a[y] = u;
u++;
}
fo[1].r = 0;
make(1);
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%s%d", ss, &x);
if (ss[0] == 'Q')
printf("%d\n", fo[x].num);
else {
if (fo[x].t) {
fo[x].t = 0;
in(x, -1);
} else {
fo[x].t = 1;
in(x, 1);
}
}
}
}
return 0;
}
总体思路是:先用一个邻接表把“图”存下来,然后dfs将每个fork连接起来,里面的r表示该结点的根。对于每一个Q,直接访问结点即可,时间为O(1);而对于每一个C,通过in函数,沿着路径向根修改“拥有的苹果”值,按理说时间是O(lgn)。
按理说,如果是in函数卡时间的话,树状结构本来就是链型,变成O(n)一个C的话,那线段树和树状数组应该也会…………
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator