CodeForces Round #112 Div2 165 D. Beard Graph

原创 2012年03月26日 14:40:36
/*
题目给定一棵树,这棵树很特殊,只有根节点的度可能超过2
有三种操作 
1.把编号为x的边染成黑色
2.把编号为x的边染成白色(此时这条边不可以走)
3.询问x,y之间的距离(不能走到输出-1)

*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=100009;
//**********************************树状数组
struct bit{  
     int c[maxn] ;   
     void init(){  
          memset(c , 0 ,sizeof(c));  
     }  
     int lowbit(int x){  
         return x&(-x);  
     }  
     void add(int x ,int d){ //在x处加上d  
          for( ; x < maxn ; x+=lowbit(x)) c[x]+=d ;   
     }  
     int sum(int x){ //求小于等于x的个数  
          int ans = 0 ;  
          for( ; x>0 ; x-=lowbit(x))  ans +=c[x] ;   
          return ans ;  
     }  
     int getkth1(int k){// 求第K小数模版1  
          int ans = 0 , cnt = 0 , i ;  
          for(i = 20 ; i>=0 ; --i){  
                ans += 1<<i ;  
                if(ans>=maxn||cnt+c[ans]>=k) ans-=1<<i ;  
                else cnt +=c[ans] ;        
          }  
          return ans+1 ;   
     }  
       
        int getkth2(int k){//求第K小数模版2  
            int l=0,r=maxn,mid,f;  
            while(l<r-1)  
            { mid=(l+r)>>1;  
              f=sum(mid);  
                if(f>=k) r=mid;  
                else l=mid;  
            }  
            return r;  
        }  
}tree; 
//****************************************
vector<int> node[maxn];
vector<pair<int,int> > edge;
int degree[maxn],L[maxn],pos[maxn],now,yy,lei[maxn],n,m;
//L[x]表示x和根的距离
//pos[x]表示dfs遍历时的顺序
//yy表示当前遍历的是根的第几个分支
//lei[x]表示x包含在根的第几个分支中
void dfs(int u,int f)
{
	L[u]=L[f]+1;
	pos[u]=now++;
	lei[u]=yy;
	for(int i=0;i<node[u].size();i++)
	{
		int y=node[u][i];
		if(y==f)continue;
		dfs(y,u);
	}
}
int main()
{
	int a,b,c;
	while(scanf("%d",&n)!=EOF)
	{
		tree.init();
		memset(degree,0,sizeof(degree));
		now=1;
		for(int i=1;i<=n;i++)
		{
			node[i].clear();
		}
		edge.clear();
		for(int i=1;i<=n-1;i++)
		{
			scanf("%d%d",&a,&b);
			degree[a]++;
			degree[b]++;
			node[a].push_back(b);
			node[b].push_back(a);
			edge.push_back(make_pair(a,b));
		}
		int root=1;
		for(int i=1;i<=n;i++)
		{
			if(degree[i]>2)
			{
				root=i;
				break;
			}
		}	
		L[root]=0;
		for(int i=0;i<node[root].size();i++)
		{
			yy=node[root][i];
			dfs(yy,root);
		}
		scanf("%d",&m);
		for(int i=0;i<m;i++)
		{
			scanf("%d",&c);
			if(c==3)
			{
				scanf("%d%d",&a,&b);
				if(pos[a]>pos[b])swap(a,b);
				if(a==root)//有一个为根,检查跟到b之间是否有白色的边
				{
					if(tree.sum(pos[b])-tree.sum(pos[lei[b]]-1)==0)
					cout<<L[b]<<endl;
					else 
					cout<<"-1"<<endl;
				}
				else if(lei[a]==lei[b])//属于同一个分支
				{
					if(tree.sum(pos[b])-tree.sum(pos[a])==0)
					cout<<L[b]-L[a]<<endl;
					else 
					cout<<"-1"<<endl;
				}
				else//属于不同的分支,同时检查这两个分支
				{
					if((tree.sum(pos[b])-tree.sum(pos[lei[b]]-1)==0)&&(tree.sum(pos[a])-tree.sum(pos[lei[a]]-1)==0))
					{
						cout<<L[a]+L[b]<<endl;
					}
					else cout<<"-1"<<endl;
				}
			}
			else if(c==2)
			{
				scanf("%d",&a);
				a--;
				int x=max(pos[edge[a].first],pos[edge[a].second]);
				tree.add(x,-1);
			}
			else 
			{
				scanf("%d",&a);
				a--;
				int x=max(pos[edge[a].first],pos[edge[a].second]);
				tree.add(x,1);
			}
		}
	}
 return 0;
}

Codeforces round 112 DIV2 B Burning Midnight Oil

题目很简单,开始的时候没想到用二分,经过一次二分搜索的学习后,对二分搜索的应用有了深刻的认识,然后就做了这个题目。同样是利用二分搜索,属于找下界的题目,代码很简单,不过需要注意两种情况:1. 当n ...
  • Sprithy_Dream
  • Sprithy_Dream
  • 2012年05月02日 01:03
  • 308

Codeforces Round #444 (Div. 2) D. Ratings and Reality Shows 贪心

http://codeforces.com/problemset/problem/887/D 题意:有一个模特,她有一个初始rating值 s。她每天可能进行拍照或show中的一种活动。每拍一次...
  • qq_36553623
  • qq_36553623
  • 2017年11月08日 23:47
  • 189

Codeforces Round #444 (Div. 2)-贪心&尺取-Ratings and Reality Shows

http://codeforces.com/contest/887/problem/D 一个模特有两种活动。 ① 拍照片,挣钱 a。 ②开演唱会,花费b 给定模特这两种工作的时间表。 模特可以...
  • qq_35781950
  • qq_35781950
  • 2017年11月11日 20:11
  • 129

Codeforces Round #136 (Div. 2) / 221A Little Elephant and Function (数学)

A. Little Elephant and Function http://codeforces.com/problemset/problem/221/A time limit pe...
  • synapse7
  • synapse7
  • 2013年08月18日 23:50
  • 1027

Codeforces Round #460 (Div. 2) D. Substring(图论,记忆化DFS)

描述 You are given a graph with n nodes and m directed edges. One lowercase letter is assigned ...
  • riba2534
  • riba2534
  • 2018年02月01日 10:03
  • 106

Educational Codeforces Round 36 题解

总结 第一次打cf的edu round,发现是acm赛制,感觉比平常的cf赛制要好玩一些。这场的题目比较水,当然我没打过其他场不能做比较。然而因为时间不太够所以并没有AK,果然自己跟Claris等神...
  • qq_33229466
  • qq_33229466
  • 2018年01月14日 00:40
  • 277

Codeforces Round #460 (Div. 2) D. Substring(树形dp)

D. Substring time limit per test 3 seconds memory limit per test 256 megabytes inpu...
  • m0_37134257
  • m0_37134257
  • 2018年02月01日 09:54
  • 93

Codeforces Round #460 (Div. 2) D. Substring(拓扑排序)

D. Substring time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
  • ffgcc
  • ffgcc
  • 2018年02月01日 17:04
  • 37

Codeforces Round #460 (Div. 2) D. Substring(拓扑排序)

题目链接题意:有一个n个点m条边的有向图,每个节点有一个字母,路径的权值是路径上相同字母的最大个数。求最大的路径权值。思路:因为只有26个字母,所以直接假设其中一个字母为相同字母数最大的字母。枚举每一...
  • cyf199775
  • cyf199775
  • 2018年02月01日 13:55
  • 39

Codeforces Round #459 (Div. 2) - D. MADMAX (记忆化搜索)

http://codeforces.com/contest/918/problem/D 题意: 在一个DAG图上,每条边都有一个权值,A先走,B后走。 每次走的时候,当前走的边的权值...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2018年01月31日 14:33
  • 59
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CodeForces Round #112 Div2 165 D. Beard Graph
举报原因:
原因补充:

(最多只允许输入30个字)