前言
废物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!
早晚倒闭吧快!