| ||||||||||
| 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 | |||||||||
用树状树组做怎么还超时#include<cstdio>
#include<iostream>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<fstream>
#include<algorithm>
using namespace std;
int C[100101];
int b[100101];
int e[100101];
vector<int>N[100101];
bool flag[100101]={0};
inline int Lowbit(int x)
{
return x&(x^(x-1));
}
inline int sum(int p)
{
int result=0;
while(p>0){
result+=C[p];
p-=Lowbit(p);
}
return result;
}
inline void Modify(int p,int n,int v)
{
while(p<=n){
C[p]+=v;
p+=Lowbit(p);
}
}
int num;
void tree(int p)
{
num++;
b[p]=num;
for(int i=0;i<N[p].size();i++){
if(b[N[p][i]]>0)continue;
tree(N[p][i]);
}
e[p]=num;
}
int main()
{
int n,i,j,a,b1;
scanf("%d",&n);
for(i=1;i<n;i++){
scanf("%d %d",&a,&b1);
N[a].push_back(b1);
N[b1].push_back(a);
}
tree(1);
int m;char s[10];
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%s %d",s,&a);
if(s[0]=='Q'){
int s=e[a]-b[a]+1+sum(e[a])-sum(b[a]-1);
/*int sum=e[a]-b[a]+1;
int p=e[a];
while(p>0){
sum+=C[p];
p-=p&(p^(p-1));
}
p=b[a]-1;
while(p>0){
sum-=C[p];
p-=p&(p^(p-1));
}*/
printf("%d\n",s);
}
else{
if(flag[a]==0)j=-1;
else j=1;
Modify(b[a],n,j);
/*int p=b[a];
while(p<=n){
C[p]+=j;
p+=p&(p^(p-1));
}*/
flag[a]=!flag[a];
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator