首页 > 其他分享 >CF1715D 2+ doors 题解

CF1715D 2+ doors 题解

时间:2022-08-22 15:44:32浏览次数:66  
标签:100010 int 题解 一位 枚举 CF1715D doors ans 相连

个人认为这道 D 比 C 要简单

思路

因为题目中每个条件限制为$ a_i \mid a_j = x $,并且题目中还提到 \(x<2^{30}\),我们考虑将 \(x\) 转换成二进制的方式表示,枚举 \(x\) 的每一位,若枚举到的当前位置上为 \(0\),则 \(a_i\) 和 \(a_j\) 上的该位不能赋值成 \(1\),用数组标记一下。

对于每一个关系,我们可以以图的形式来表示,每一个 $ a_i \mid a_j = x $ 的关系,可以在 \(i\) 和 \(j\) 中间连一条权值为 \(x\) 的边。在遍历的时候,对于每一条边,为了保证字典序最小,我们可以尽可能地让 \(i\) 和 \(j\) 中较大的一位尽可能地和 \(x\) 的每一位相等。

我们可以枚举二进制的每一位,枚举每一位时,枚举每个点和当前的点相连的边,若相连的点的下标比当前的小且边权中包含这一位,同时相连的点的答案中不包含这一位,就将当前点的答案的这一位变成 \(1\),如果相连的点的下标比当前的大且边权中包含这一位,若相连的点的这一位被标记,将当前点的答案的这一位变为 \(1\)。

最终输出答案即可。

代码

#include <bits/stdc++.h>
using namespace std;

struct node {
	int to, k;
};
vector <node> G[100010];
int n, m, v[100010][31], ans[100010];

int main() {
	scanf("%d%d", &n, &m);
	memset(ans, 0, sizeof(ans));

	for (int i = 1; i <= m; i++) {

		int x, y, k;
		scanf("%d%d%d", &x, &y, &k);

		for (int j = 0; j < 30; j++) {

			if (k & (1 << j)) {
				continue;
			}

			v[x][j] = v[y][j] = 1;
		}

		if (x == y) {
			ans[x] |= k;
			continue;
		}

		G[x].push_back(node{y, k});
		G[y].push_back(node{x, k});
	}

	for (int x = 29; x >= 0; x--) {

		for (int i = 1; i <= n; ++i) {

			bool f = 0;

			for (int j = 0; j < G[i].size(); j++) {

				int to = G[i][j].to, k = G[i][j].k;

				if (to < i) {
					if (k & (1 << x)) {
						if (ans[to] & (1 << x)) {
							continue;
						}

						f = 1;
						break;
					}
				} else {
					if (k & (1 << x)) {
						if (v[to][x]) {
							f = 1;
							break;
						}
					}
				}
			}

			if (f)
				ans[i] |= (1 << x);
		}
	}

	for (int i = 1; i <= n; i++) {

		printf("%d ", ans[i]);
	}

	return 0;
}


标签:100010,int,题解,一位,枚举,CF1715D,doors,ans,相连
From: https://www.cnblogs.com/Dregen-Yor/p/16613000.html

相关文章

  • 蔚来杯2022牛客暑期多校训练营加赛 题解
    E.Everyoneisbot对于后\(p\)个人,这\(p\)个人相互制约,一旦有一个人进行复读,剩下的\(p-1\)个人一定会进行复读,那么这个人就会被禁言,对于他来说不是最优策略。此时......
  • CodeForces-1715D 2+ doors
    2+doors贪心位与位之间互不一向,因此考虑每个位进行考虑就行因为是或的关系,先考虑\(0\)的情况,如果出现\(0\),则两个数字的该位必然是\(0\)如果是\(1\)的情况,就考......
  • 题解 - CF1715
    C.Monoblock先考虑算出修改前的答案。这明显可以增量法\(O(n)\)。修改的时候先考虑把这里断开,然后再考虑和左右两边连上(大概三种情况,随便讨论)D.2+doors完了,口胡假了......
  • CF 1329 题解
    A.DreamoonLikesColoring题目描述有\(n\)个格子排成一行,每个格子初始没有颜色,进行\(m\)次操作,第\(i\)次操作有一个参数\(l_i\),表示可以把\([p_i,p_i+l_i-......
  • P3605 [USACO17JAN]Promotion Counting P 题解
    solution考虑权值线段树合并:首先离散化,然后对于一个节点,我们将它的所有子树合并上来,并统计所有能力指数的个数(权值线段树基本操作),查询时只需查询\(p_i+1\simn\)的和即......
  • 问题解决——SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!(转)
    转自:问题解决——SSH时出现WARNING:REMOTEHOSTIDENTIFICATIONHASCHANGED!1、问题描述终端出现:@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@WA......
  • STL中map容器的应用(HDU1263水果题解)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263题目描述:TimeLimit:2000MS;MemoryLimit:65536K;夏天来了~Joe经营着一个不大的水果店.他认为生存之道就......
  • Maven中xml配置文件导出到target失败问题解决方案
    Maven中xml配置文件导出到target失败问题解决方案在pom.xml中加入下面代码<!--在build中配置resources,来防止我们资源导出失败的问题--><build><resources>......
  • springboot多线程环境下注入bean空指针问题解决
    多线程环境下注入bean会出现空指针了..我是怎么知道这个bean有有没有在启动的时候注入进来的呢?用于指示bean包含在SpringApplication中时应该运行的接口。多个CommandL......
  • [题解] Atcoder Regular Contest ARC 146 A B C D 题解
    点我看题A-ThreeCards先把所有数按位数从多到少排序,答案的位数一定等于位数最多的三个数的位数之和\(tot\)。对于每个i,把有i位的数排序,并记录每个i的排序结果。最后......