Topcoder srm div2 500

原创 2016年06月01日 22:07:00

Problem Statement

  Hero has just constructed a very specific graph. He started with n isolated vertices, labeled 0 through n-1. For each vertex i Hero then chose a vertex a[i] (other than i) and he added an edge that connected i and a[i]. This way he created a graph with n vertices and n edges. Note that if a[x]=y and a[y]=x, the vertices x and y were connected by two different edges. Hero now wants to perform the following procedure:
  1. Add a new isolated vertex number n.
  2. Choose a subset M of the original vertices.
  3. For each x in M, erase an edge between vertices x and a[x].
  4. For each x in M, add a new edge between vertices x and n.
Hero's goal is to create a final graph in which the vertices 0 through n-1 are all in the same connected component. (I.e., there must be a way to reach any of these vertices from any other of them by following one or more consecutive edges, possibly visiting vertex n along the way.) Note that Hero does not care whether vertex n is in the same component as the other vertices: both possibilities are fine. In step 2 of the above procedure Hero has 2^n possible subsets to choose from. A choice of M is good if it produces a graph with the desired property. Count how many of the 2^n possibilities are good choices. Return that count as a long long.

题意是说给出一个数组a,a[i]=j表示i到j有一条边。然后选定一个点的集合,这个集合中所有点a[x]=y的边都去掉,并把这些点都连接向点n。如果最终形成的图还是联通,那么就是好集合。问这样的集合有多少个。

和CF22E很像。。。如果每一个联通分量里面点的个数为x,尾巴上的点的个数为y,那么这块的集合的个数为2^x-2^y。把每一部分乘到一起。

代码:

#pragma warning(disable:4996)
#include <fstream>
#include <iostream>
#include <functional>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <set>
#include <map>
using namespace std;
typedef long long ll;

#define eps 1e-12
#define INF 0x3f3f3f3f
#define mem(a, b) memset(a, b, sizeof(a))
#define pper(i,n,m) for(int i = n;i >= m; i--)
#define repp(i, n, m) for (int i = n; i <= m; i++)
#define rep(i, n, m) for (int i = n; i < m; i++)
#define sa(n) scanf("%d", &(n))
#define mp make_pair
#define ff first
#define ss second
#define pb push_back

const int maxn = 500005, maxd = 18;
const ll mod = 1e9 + 7;
const double PI = acos(-1.0);

ll vis[maxn], cnt[maxn];
set<int>u;

class Sunnygraphs2
{
public:
	long long count(vector <int> a)
	{
		ll res = 1;
		int sz = a.size();
		int uni = 1;
		int i, j, k;
		
		u.clear();
		u.insert(0);

		mem(cnt, 0);
		mem(vis, -1);
		for (i = 0; i < sz; i++)
		{
			ll now = 1;
			int x = i;
			if (vis[x] == -1)
			{
				while (vis[x] == -1)
				{
					vis[x] = i;
					now <<= 1;
					cnt[x] = now;
					x = a[x];
				}
				if (u.find(vis[x]) != u.end())
				{
					u.insert(i);
				}
				else
				{
					uni = 0;
				}
				if (vis[x] == i)
				{
					res = res*(now - (cnt[x] >> 1));
				}
				else
				{
					res = res*now;
				}
			}
		}
		if (uni == 1)
			res++;
		return res;
	}
};




版权声明:本文为博主原创文章,未经博主允许不得转载。

topcoder SRM500 DIV1 level2 500分

Problem Statement   Nick likes to draw fractals. For the special occasion of Single Round M...

TopCoder SRM 654 Div2 Problem 500 - OneEntrance (思维)

RT

TopCoder SRM 653 Div2 Problem 500 - RockPaperScissorsMagicEasy (DP)

RT

Topcoder SRM 687 (Div 2) 500.Quacking __ string matches

Ducks have started mysteriously appearing in your room. All ducks make the same sound: "quack". Each...

topcoder SRM 500 div2 level3

Problem Statement   NOTE: This problem statement contains superscripts that may not display...

Topcoder SRM 503 DIV1 500 KingdomXCitiesandVillages

KingdomXCitiesandVillagesTask:给定n个城市和m个村庄的坐标。要求将每一个村庄都连接到城市。 你每一次选定一个未连接的村庄,寻找这个村庄到其他一个已经连接到城市的村庄或者...
  • zqh_wz
  • zqh_wz
  • 2016年09月13日 12:38
  • 138

TopCoder SRM687 div1 500

题意是已知一个无向图所有点对间的最小割,构造一个合法的原图。   看了题解得知有个叫Gomory-Hu tree的东西,即最小割树。解题要点是,你要知道一个图的所有点对最小割,一定能用一棵树做到。于...

Topcoder SRM552 Div1 500

int FoxAndFlowerShopDivOne::theMaxFlowers(vector flowers, int maxDiff) { const int NN=1000; in...

topcoder SRM500 div1 Level3

Problem Statement   NOTE: This problem statement contains superscripts that may not display...

topcoder SRM500 DIV1 LEVEL1 250分题

Problem Statement   N friends (numbered from 0 to N-1) play a game called Mafia. The exact ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Topcoder srm div2 500
举报原因:
原因补充:

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