前言
废物POJ,QDUOJ都比它强!!!废物POJ!
万能头用不了还说的过去,妈的,你告诉我还卡二维vector???非得用个vector<vector<int> > v(N)???debug 3h???wdnmd
哦,唯一的一个优点就是快。</int>
题目链接
http://poj.org/problem?id=3321
解题思路
首先,客观的说(不带主观色彩),这个题数据是不是过于水?通过AC代码,发现输入的a,b两个节点一定是a位于靠近根的位置,b位于远离根的位置,居然不用判断是不是经过父亲节点。
其次,POJ垃圾!
不想讲这个题,直接挂个类似的题吧。
求和
AC代码
#include<iostream>
#include<algorithm>
#include<vector>
#define lowbit(x) x&(-x)
using namespace std;
const int N=1e5+10;
vector<vector<int> > e(N);
int Time=0,n,x,m,u,v,in[N],out[N],c[N],a[N];
bool vis[N];
char op;
void dfs(int x)
{
in[x]=++Time;
for(int i=0;i<e[x].size();i++) dfs(e[x][i]);
out[x]=Time;
}
void update(int x,int add)
{
while(x<=n)
{
c[x]+=add;
x+=lowbit(x);
}
}
int getsum(int x)
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=lowbit(x);
}
return sum;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
e[u].push_back(v);
}
dfs(1);
for(int i=1;i<=n;i++)
update(i,1),a[i]=1;
scanf("%d",&m);
while(m--)
{
getchar();
scanf("%c%d",&op,&x);
if(op=='C')
update(in[x],a[x]?-1:1),a[x]=!a[x];
else
printf("%d\n",getsum(out[x])-getsum(in[x]-1));
}
return 0;
}
总结
妈的,越想越气,一下午本来想学完欧拉序,一个***题卡了俩小时,***,快六点了,真是***POJ!
早晚倒闭吧快!

京公网安备 11010502036488号