您当前的位置: 首页 >  ar

对方正在debug

暂无认证

  • 5浏览

    0关注

    385博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Farm Updates(模拟/dfs)

对方正在debug 发布时间:2022-02-11 22:13:49 ,浏览量:5

题目 题意:给定n个活跃农场,q个操作。 (D x) 停用一个活跃的农场 x,使其不再生产牛奶。 (A x y) 在两个活跃的农场 x 和 y 之间添加一条道路。 (R e) 删除之前添加的第 e 条道路(e=1 是添加的第一条道路)。

一个农场 x 如果正在活跃地生产牛奶,或者可以通过一系列道路到达另一个活跃的农场,则该农场是有效的。

对于每个农场 x,计算最大的 i(0≤i≤Q),使得农场 x 在第 i 次更新后是有关的。

思路:由于要使每个农场的i值尽量大,我们可以倒序遍历所有的操作。 先构图,根据最新的图去标记所有的有效农场。 接着,倒叙遍历所有操作,对于废弃边,则恢复,表示新增一条边;对于废弃农场,也恢复。

倒序操作过程中,恢复的有效农场,后边不会变成废弃农场。变成废弃农场只有可能是“删边”的时候。而因为添加边,只在两个活跃的农场之间,这意味着倒序过程中“删边”的时候两边都是活跃的。

#include
using namespace std;
#define ll long long
const int maxn = 200010;

struct node {
	char op;
	int x, y;
}a[maxn];
bool vis[maxn];// 标记是否活跃 
int n, q;
vector edge; // 边 
vector g[maxn];// 存邻接点 
int ans[maxn];

void dfs(int u, int val) {
	if (ans[u]) {
		return;
	}
	ans[u] = val;
	for (auto v: g[u]) {
		dfs(v, val);
	}
}
int main() {
	cin >> n >> q;
	for (int i = 1; i  a[i].op >> a[i].x;
		if (a[i].op == 'A') {
			cin >> a[i].y;
			// 新增边 
			edge.emplace_back(a[i].x, a[i].y);
		} else if (a[i].op == 'D') {
			// 废弃点 
			vis[a[i].x] = 0;
		} else {
			// 标记为负数 表示废弃边 
			edge[a[i].x-1].first = -edge[a[i].x-1].first;
		}
	}
	// 构图 
	for (auto p: edge) {
		if (p.first             
关注
打赏
1664076964
查看更多评论
0.0555s