首页 > 其他分享 >20240911

20240911

时间:2024-10-17 20:20:53浏览次数:8  
标签:return int 20240911 mid long fa find

Jordan's Castles

我们先思考如何快速求出 \(b_1, b_2, b_3...b_n\) 显然我们可以直接用二分找到,然后我们可以直接将 \(a_i\) 改为 \(min(a[i], b[i])\),然后统计答案即可

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 1e5 + 5;

int t, n, a[N];

void Solve() {
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  int ans = 0;
  for (int i = n; i >= 1; i--) {
    int l = 0, r = n;
    while (l < r) {
      int mid = (l + r + 1) >> 1;
      if (a[mid] >= i) {
        l = mid;
      }
      else r = mid - 1;
    }
    ans += max(0ll, a[i] - l);
    a[i] = min(a[i], l);
  }
  cout << ans << "\n";
}

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> t;
  while (t--) {
    Solve();
  }
  return 0;
}

Game on a Graph

我们看到一个重要的性质 "移除该分量中编号最小的顶点",那么我们可以从大到小枚举编号,每次枚举出边 \(v\) 那么只要 \(v < i\) 就可以直接用并查集合并,最后判断一下奇偶性即可

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 1e5 + 5;

int t, n, m, fa[N], f[N], sz[N];

vector<int> g[N], new_g[N];

void dfs(int u) {
  sz[u] = 1;
  for (auto v : new_g[u]) {
    dfs(v);
    sz[u] += sz[v];
  }
}

int find(int x) {
  if (fa[x] == x) {
    return x;
  }
  return fa[x] = find(fa[x]);
}

void Solve() {
  cin >> n >> m;
  for (int i = 0; i <= n; i++) {
    fa[i] = i;
    g[i].clear();
    new_g[i].clear();
  }
  for (int i = 1, u, v; i <= m; i++) {
    cin >> u >> v;
    u++, v++;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  for (int i = n; i >= 1; i--) {
    for (auto v : g[i]) {
      if (v > i && find(v) != i) {
        f[find(v)] = i;
        new_g[i].push_back(find(v));
        fa[find(v)] = i;
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    if (find(i) == i) {
      f[i] = 0;
      new_g[0].push_back(i);
    }
  }
  dfs(0);
  for (int i = 1; i <= n; i++) {
    if (f[i] == 0 || (n - sz[f[i]]) % 2 == 1) {
      cout << i - 1 << ' ';
    }
  }
  cout << "\n";
}

signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> t;
  while (t--) {
    Solve();
  }
  return 0;
}

标签:return,int,20240911,mid,long,fa,find
From: https://www.cnblogs.com/libohan/p/18473003

相关文章

  • [20240911]查看超长视图的定义2.txt
    [20240911]查看超长视图的定义2.txt--//昨天看了链接:https://www.anbob.com/archives/8295.html,提供了另外的方式获得超长定义试图的长文本。--//我重复验证看看.1.环境:SYS@book>@ver2==============================PORT_STRING                  :x86_6......
  • 20240911 模拟赛总结
    期望得分:100+0+30=130实际得分:100+20+30=150T1感觉没有大样例也还是可以猜到那么一点的结论。k=0无解。当k≠0时,考虑交换不含1的两项,一定能使这两个位置都符合gcd(i,ai)=1,如果最后长度为奇数剩一个位置出来怎么办?那就O(n)枚举一遍找到可行的位置和它换一下即可,易......
  • 20240911_220441 公共基础 线性链表
    什么是线性链表单向线性链表双向线性链表带链的栈带链队列线性链表的运算循环链表考点小结习题c习题a习题b习题c......
  • 20240911_190441 公共基础 栈
    什么是栈栈的特点栈的出入演练习题31习题30习题b习题b习题习题a习题c......
  • 20240911_170441 公共基础 线性表
    什么是线性表线性表的基本特征线性表的示例graphLR3-->1-->2-->4......