| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
1002怎么做呢?为什么c++ 15MS WA g++ TLE#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: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator