#include<bits/stdc++.h> usingnamespace std; intmain(){ int n, m; cin >> n >> m; vector<int> s(n + 2, 0); for (int i = 0; i < m; i++) { int l, r; cin >> l >> r; s[l] += 1; if (r + 1 <= n) { s[r + 1] -= 1; } } int sum = 0; int ans = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { sum += s[i]; if (sum < ans) { ans = sum; } } cout << ans; return0; }
D.Flip to Gather
题目描述
给你一个长度为 N 的字符串 S ,它由 0 和 1 组成。
您可以执行以下操作任意次数(可能为零):
选择一个满足 1≤i≤N 的整数 i ,并将 Si 从 0 改为 1,或从 1 改为 0。
你的目标是使 S 中的 1 最多形成1个区间。求实现目标所需的最少运算次数。
更准确地说,目标是使 S 中存在一对满足以下两个条件的整数 (l,r) 。求实现目标所需的最小运算次数。
#include<bits/stdc++.h> usingnamespace std; int n, m; vector<vector<pair<int, int>>> edges; boolcheck(int x) { vector<bool> vis(n + 1, 0); queue<int> q; q.push(1); vis[1] = 1; while (!q.empty()) { int tp = q.front(); q.pop(); for (int i = 0; i < edges[tp].size(); i++) { int v = edges[tp][i].first; int w = edges[tp][i].second; if ((w & x) != w) { continue; } if (v == n) { return1; } if (!vis[v]) { vis[v] = 1; q.push(v); } } } return0; }
intmain() { cin >> n >> m; edges.resize(n + 1); int cnt = 0; while (m--) { int u, v, w; cin >> u >> v >> w; edges[u].push_back({v, w}); edges[v].push_back({u, w}); cnt |= w; } int ans = cnt; for (int i = 29; i >= 0; i--) { if (!(ans & (1 << i))) { continue; } int x = ans & ~(1 << i); if (check(x)) { ans = x; } } cout << ans; return0; }