首页 > 其他分享 >USACO作题记录1

USACO作题记录1

时间:2023-11-10 23:22:09浏览次数:38  
标签:必经 记录 int 拓扑 合并 USACO 作题 排序 出度

更好的访问

[[2023年11月10日总结]] 这一天的题目。

[USACO22OPEN] Alchemy B

link

二分答案。倒着建图,是一个 dag。验证的方法感觉类似 [NOIP2020] 排水系统。但是要注意中间判断一下往下传的多余量有没有超过总金属数。不然容易指数级增长爆掉。这道题写的时候降智了,还搞了一遍拓扑排序,其实倒着来就行。 #二分答案

[USACO22OPEN] Visits S

link

会发现是一个内向基环树(应该是叫这个名字),发现只要删去环上面那个最小的边就行。可以边反过来拓扑排序找环。我这里直接使用的是最小(大)生成树的方式。

[USACO22OPEN] COW Operations S

link

把 \('C','O','W'\) 分别映射到 \(1, 2, 3\),发现两种操作异或和不变,并且可以发现可以操作交换相邻两个字符。可以证明最后一定能只剩下一个字符或者空。所以求得区间异或和是否为 \(1\) 即可。

[USACO22OPEN] Hoof and Brain P

link

很有趣的一道题。首先把走不到环中的点去掉,拓扑排序即可。然后易证两个在剩余图上能够遇到一定是在两个的共同必经点,而且两个棋子如果有共同的必经点一定能碰到。朴素的方法就是对于一个起始点,枚举点删掉,如果这个起点不能到一个环里了,那么这个点就一定是必经点。用 bitset 存一下,询问的时候与一下就行。考虑正解。会发现所有的必经关系可以抽象成几条链,参考 luogu 上的第一篇题解。因此在同一个必经关系中一定有共同必经的点。然后参考洛谷上第三篇题解,发现对于一个缩点的图,出度为 \(1\) 的点一定能和其指向的点连到一个关系图中,使用启发式合并。如果合并后指向这一坨的点有出度变成1了,那就代表这个点一定必经这个缩的点,而进入这个缩的点后一定又必经一些点,所以也要加入。这样最后剩下的图中每个点的出度一定大于 1 (包括自环)。可以证明这样的图中一定没有新的必经点了,因此所有的都被合并了。查询的时候并查集查询即可。复杂度:\(O(m\log^2{n}+q)\)。参考代码:

#include <bits/stdc++.h>
using namespace std;
#define N 100010
int n, m;
int Q;
int u, v;
int fa[N]; //并查集
void ini() {
  for (int i = 1; i <= n; ++i) fa[i] = i;
}
int getfa(int v) {
  return v == fa[v] ? v : fa[v] = getfa(fa[v]);
}
set<int> g[N], r[N]; //用set维护图,方便去除重边,可以使用更高效的方法。
//g: 正向图,r: 反向边的图
int main() {
  scanf("%d%d", &n, &m);
  ini();
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d", &u, &v);
    g[u].emplace(v);
    r[v].emplace(u);
  }
  queue<int> q; //队列,拓扑排序和后面合并可以用一个队列,节省一点
  for (int i = 1; i <= n; ++i) {
    if (g[i].size() == 0) q.emplace(i);
  }
  while (!q.empty()) { //去除走不到环里的点
    int u = q.front();
    q.pop();
    fa[u] = 0;
    for (auto i : r[u]) {
      g[i].erase(u);
      if (!g[i].size()) q.emplace(i);
    }
  }
  for (int i = 1; i <= n; ++i) { //将出度为1的点加入队列
    if (g[i].size() == 1) q.emplace(i);
  }
  while (!q.empty()) { //合并所有在一个必经关系中的点
    int u = q.front();
    q.pop();
    int v = *g[u].begin();
    u = getfa(u), v = getfa(v);
    if (u == v) continue;
    if (r[u].size() > r[v].size()) swap(u, v);//启发式合并
    for (auto i : r[u]) { //这里只用合并入的边,因为出的边更改后也会找到根继续合并入的边
      g[i].erase(u);
      g[i].emplace(v);
      r[v].emplace(i);
      if (g[i].size() == 1) q.emplace(i); //出度为1加入队列
    }
    fa[u] = v;
  }
  scanf("%d", &Q);
  while (Q--) {
    scanf("%d%d", &u, &v);
    u = getfa(u), v = getfa(v);
    if (!u || !v || u == v) { //询问,如果有点走不到环或在一个关系中

标签:必经,记录,int,拓扑,合并,USACO,作题,排序,出度
From: https://www.cnblogs.com/huasushis/p/17825327.html

相关文章

  • [USACO22OPEN] Apple Catching G
    [USACO22OPEN]AppleCatchingG题目描述天上下苹果了!在某些时刻,一定数量的苹果会落到数轴上。在某些时刻,FarmerJohn的一些奶牛将到达数轴并开始接苹果。如果一个苹果在没有奶牛接住的情况下落到数轴上,它就会永远消失。如果一头奶牛和一个苹果同时到达,奶牛就会接住苹果。每头......
  • 记录--ECharts — 饼图相关功能点(内环、外环、环形间隔、环形文字、轮播动画)
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助记录一下在公司遇到的一些功能,以及相关实现以上的内容我花了一周时间去实现的,自己也觉得时间很长,但主要因为很少使用ECharts,导致使用的过程中大部分的时间都在查文档。对于上面的这些功能点,其实算是写了两遍吧......
  • 银行卡转账记录p图软件,建设邮政工商招商农业,易语言回执单生成开发!
    花了好长时间设计出来了这么一个软件,当然各个功能我都做了防范处理界面还有生成的图片都有对应的水印提示,做不了啥坏事,这里就是分享下原理和代码还有运行逻辑,仅此而已,软件加了一个画板,画面上面的图片资源会根据单选框的选择随之改变,实现了针对性替换模版图的效果,图片资源都加入到......
  • verdi使用记录/ycai
    查看一段时间内信号边沿等信息:view-》signaleventCtrl+F定位信号所在schematic中的位置Verdi左下角有个message,可以显示信号驱动的逻辑,而使用1oad默认只显示第一个在代码里使用x作用是在信号下方,直接显示其值,实时更新,但没有波形方便在波形中使用x作用是将中键的标记......
  • 【chatgpt问答记录】双端队列、栈和函数调用栈
    collections.deque和queue.Queue的区别Q:collections.deque()跟queue.Queue()有什么区别?collections.deque()和queue.Queue是两种不同的数据结构,它们有一些区别:实现方式:collections.deque()是Python标准库提供的双端队列数据结构,使用双向链表实现,具有高效的在两端进行......
  • 什么是DNS,A记录,子域名,CNAME别名,MX记录,TXT记录,SRV 记录,TTL值
    DNSDNS,DomainNameSystem或者DomainNameService(域名系统或者域名服务)。域名系统为Internet上的主机分配域名地址和IP地址。由于网络中的计算机都必须有个IP地址,来识别,互相之间才能通信,但让我们记住一大串的IP地址来访问网站显然是不可能的,所以用户使用域名地址,而DNS系统的......
  • 四个id 生成器性能比较记录
    IdGeneratorSeata优化的雪花算法Seata基于改良版雪花算法的分布式UUID生成器分析关于新版雪花算法的答疑csharp移植代码publicclassIdGenerator{privatereadonlylongtwepoch=1588435200000L;privateconstintworkerIdBits=10;......
  • Node opensslErrorStack 错误解决方法记录
    从Git仓库中下载了一个老项目,使用npminstall安装后没有问题,当我使用npmrundev的时候遇到了OpenSSL相关错误,例如opensslErrorStack:['error:03000086:digitalenveloperoutines::initializationerror']网上找了一下相关信息,然后顺利解决了,记录分享给大家问题原因:这种错......
  • Sql server 删除重复记录的SQL语句
     有两个意义上的重复记录:1.完全重复的记录,也即所有字段均重复的记录.2.部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。1、对于第一种重复,比较容易解决,使用selectdistinct*fromtableName就可以得到无重复记录的结果集。如果该表需要删除重复......
  • DP查缺补漏之LIS状态记录
    DP查缺补漏之\(LIS\)状态记录前置知识状态假设\(F[i]\)为以\(a[i]\)为结尾的最长上升子序列长度。状态转移\(F[i]=max(F[j]+1,F[i])(j<i)\)很好理解,即\(i\)之前的所有以\(a[j]\)结尾的最长上升子序列中取最大,再加上\(a[i]\)即加一。代码实现for(inti=1;i<=......