Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

1002怎么做呢?为什么c++ 15MS WA g++ TLE

Posted by 20053565 at 2008-10-18 17:08:36
#include <set>
#include <vector>
#include <stdio.h>
#include <algorithm>

using namespace std;

int n, m, q;
int c;
set <int> map[20000];

struct Query
{
	char com[2];
	int a, b;
}qr[100000];

vector <int> update[20000];
int visited[20000];
vector <int> block[20000];
int cnt;
int pos[20000];
//
void dfs(int u)
{
	visited[u] = 1;
	block[cnt].push_back(u);
	pos[u] = cnt;
	for (set<int>::iterator it = map[u].begin(); it != map[u].end(); it++)
	{
		int v = *it;
		if (!visited[v])
		{
			dfs(v);
		}
	}
}

int main()
{
	int i;
	int u, v;
	int a, b;
	int cas(1);

	while (scanf("%d%d%d", &n, &m, &q) == 3)
	{
		memset(visited, 0, sizeof visited);
		for (i = 0; i < n; i++)
		{
			scanf("%d", &c);
			map[i].clear();
			update[i].clear();
			block[i].clear();
			update[i].push_back(c);
		}
		for (i = 0; i < m; i++)
		{
			scanf("%d%d", &u, &v);
			u--;v--;
			map[u].insert(v);
			map[v].insert(u);
		}
		for (i = 0; i < q; i++)
		{
			scanf("%s%d%d", qr[i].com, &qr[i].a, &qr[i].b);
			a = qr[i].a - 1;
			b = qr[i].b - 1;
			if (qr[i].com[0] == 'E')
			{		
				map[a].erase(map[a].find(b));
				map[b].erase(map[b].find(a));
				continue;
			}
			if (qr[i].com[0] == 'U')
			{
				update[a].push_back(b + 1);
				continue;
			}
		}
		cnt = 0;
		for (i = 0; i < n; i++)
		{
			if (!visited[i])
			{
				dfs(i);
				cnt++;
			}
		}
		double ans = 0;
		double total = 0;
		for (i = q - 1; i >= 0; i--)
		{
			a = qr[i].a - 1;
			b = qr[i].b - 1;
			if (qr[i].com[0] == 'U')
			{
				update[a].pop_back();
				continue;
			}
			if (qr[i].com[0] == 'F')
			{
				int p = pos[a];
				int min = -1;
				for (vector<int>::iterator it = block[p].begin(); it != block[p].end(); it++)
				{
					int v = (*it);
					int tmp = *(update[v].rbegin());
					if (tmp >= b + 1 && (min == -1 || tmp < min))
					{
						min = tmp;
					}
				}
				if (min == -1)	min = 0;
				ans += min;
				total += 1.0;
				continue;
			}
			map[a].insert(b);
			map[b].insert(a);
			if (pos[a] == pos[b])
			{
				continue;
			}
			int tb = pos[b];
			
			for (vector<int>::iterator it = block[tb].begin(); it != block[tb].end(); ++it)
			{
				int v = *it;
				pos[v] = pos[a];
				block[pos[a]].push_back(v);
			}
		}
		printf("Case %d: %.3lf\n", cas++, ans / total);
	}
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator