首页 > 其他分享 >CCO 2019 Day2

CCO 2019 Day2

时间:2024-09-25 11:27:02浏览次数:1  
标签:const string int Day2 CCO 2019 字符串 return size

Luogu P6680

题目描述

给定一张 \(N\) 个点,\(M\) 条边的无向简单图。

如果存在 \(1\le a<b<c\le N\) 满足存在边 \((a,b),(a,c)\),并且不存在 \((b,c)\),则加入边 \((b,c)\)。

求最后的边数。

思路

首先我们可以把边看做从小的连向大的。

通过观察可以发现只有在这种情况下才会建边:

image

这里红色的边是新加入的。

如果每次我们都对这样的建一个完全图,那么有很多边会被重复加入,所以我们考虑每个点会伸出去多少条边。

可以发现,这里只需要让最靠前的一个儿子建边就行了,也就是这样:

image

因为在枚举到这个儿子时又会传递给下一个。

所以我们用一个 set 记录连向的结点,然后用启发式合并的方法传递给儿子。

空间复杂度 \(O(N+M)\),时间复杂度 \(O(N\log^2 M)\)。

代码

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

const int MAXN = 100001;

int n, m;
ll ans;
set<int> e[MAXN];

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1, u, v; i <= m; ++i) {
    cin >> u >> v;
    e[u].insert(v);
  }
  for(int i = 1; i <= n; ++i) {
    ans += e[i].size();
    if(e[i].size()) {
      int x = *e[i].begin();
      e[i].erase(x);
      if(e[i].size() > e[x].size()) {
        swap(e[i], e[x]);
      }
      for(int v : e[i]) {
        e[x].insert(v);
      }
    }
  }
  cout << ans;
  return 0;
}

Luogu P6681

题目描述

给定 \(N\) 个长度至多为 \(M\) 的 \(01\) 串。你要用两种不同的字符串组合拼接出一个相同的 \(01\) 串,你可以使用重复的字符串。求这个拼接出字符串的最短长度。如果没有输出 \(-1\)。

思路

令 \(dp_S\) 表示更长的字符串比更短的字符串长出的部分为 \(S\) 时的最短长度。

每次我们暴力枚举下一个位置填什么字符串并拼接即可。

空间复杂度 \(O(NM)\),时间复杂度 \(O(NM(NM+\log NM))\)。

代码

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

const int MAXN = 51;

struct Node {
  string s;
  int dis;
};

struct cmp {
  bool operator()(const Node &a, const Node &b) const {
    return a.dis > b.dis;
  }
};

int n, m;
map<string, int> dist;
map<string, bool> vis;
string s[MAXN];

bool check(const string &a, const string &b) {
  for(int i = 0; i < min(int(a.size()), int(b.size())); ++i) {
    if(a[i] != b[i]) {
      return 0;
    }
  }
  return 1;
}

string Get(const string &a, const string &b) {
  string ret = "";
  for(int i = 0; i < max(int(a.size()), int(b.size())); ++i) {
    if(i >= int(a.size())) {
      ret += b[i];
    }
    if(i >= int(b.size())) {
      ret += a[i];
    }
  }
  return ret;
}

void dij() {
  priority_queue<Node, vector<Node>, cmp> pq;
  for(int i = 1; i <= n; ++i) {
    for(int j = 1; j <= n; ++j) {
      if(i != j && check(s[i], s[j])) {
        string t = Get(s[i], s[j]);
        int w = max(0, int(s[j].size()) - int(s[i].size()));
        if(!dist.count(t) || int(s[i].size()) + w < dist[t]) {
          dist[t] = int(s[i].size()) + w;
          pq.push({t, int(s[i].size()) + w});
        }
      }
    }
  }
  for(; !pq.empty(); ) {
    auto [str, dis] = pq.top();
    pq.pop();
    if(vis.count(str)) {
      continue;
    }
    vis[str] = 1;
    for(int i = 1; i <= n; ++i) {
      if(check(str, s[i])) {
        string t = Get(str, s[i]);
        int w = max(0, int(s[i].size()) - int(str.size()));
        if(!dist.count(t) || dis + w < dist[t]) {
          dist[t] = dis + w;
          pq.push({t, dis + w});
        }
      }
    }
  }
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin >> n >> m;
  for(int i = 1; i <= n; ++i) {
    cin >> s[i];
  }
  dij();
  cout << (!dist.count("") ? -1 : dist[""]);
  return 0;
}

标签:const,string,int,Day2,CCO,2019,字符串,return,size
From: https://www.cnblogs.com/yaosicheng124/p/18430944

相关文章

  • P5329 [SNOI2019] 字符串 题解
    Description给出一个长度为\(n\)的由小写字母组成的字符串\(a\),设其中第\(i\)个字符为\(a_i\(1\leqi\leqn)\)。设删掉第\(i\)个字符之后得到的字符串为\(s_i\),请按照字典序对\(s_1,s_2,……,s_n\)从小到大排序。若两个字符串相等,则认为编号小的字符串字典序更小。......
  • 开发在线法律咨询平台的设计与实现Day2
    今日完成开发获取用户信息接口http://localhost:8080/user/userinfo@GetMapping("/userinfo")publicResult<User>getUserInfo(@RequestHeader(name="Authorization")Stringtoken){Map<String,Object>map=JwtUtil.parseToken(token);......
  • 【代码随想录Day27】贪心算法Part01
    理论基础题目链接/文章讲解:代码随想录视频讲解:贪心算法理论基础!_哔哩哔哩_bilibili455.分发饼干题目链接/文章讲解:代码随想录视频讲解:贪心算法,你想先喂哪个小孩?|LeetCode:455.分发饼干_哔哩哔哩_bilibili一开始使用了双重循环,时间复杂度为......
  • 【代码随想录Day25】回溯算法Part04
    491.递增子序列题目链接/文章讲解:代码随想录视频讲解:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibiliclassSolution{List<List<Integer>>result=newArrayList<>();LinkedList<Integer>path=newLinkedList<>();pub......
  • 0基础学前端 day2
    大家好,欢迎来到无限大的频道。今天继续带领大家开始0基础学前端。一、CSS简介与基础层叠样式表(CSS,CascadingStyleSheets)是用来进行网页样式和布局设计的语言。通过CSS,开发者可以控制网页中元素的颜色、字体、大小、间距以及布局等视觉效果。CSS让页面不仅仅是信息的载体......
  • Office project 2019安装图文安装教程下载项目管理
    不仅可以快速、准确地创建项目计划,而且可以帮助项目经理实现项目进度、成本的控制、分析和预测,使项目工期大大缩短,资源得到有效利用,提高经济效益。是专案管理软件程序由微软开发销售。软件设计目的在于协助专案经理发展计划、为任务分配资源、跟踪进度、管理预算和分析工作量。......
  • 信息学奥赛复赛复习02-CSP-J2019-02-结构体、无构造函数、有构造函数、初始化列表构造
    PDF文档公众号回复关键字:2024092412019CSP-J题目2公交换乘[题目描述]著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过......
  • 【Day20240924】05git 两人协作 冲突
    git两人协作冲突命令行解决两个人修改同一文件时的冲突可视化解决两个人修改同一文件时的冲突参考命令行解决两个人修改同一文件时的冲突假设kerwin.js是项目的路由文件。tiechui文件夹是组员铁锤的工作目录;test2008文件夹是组长的工作目录。此时,两人都想要......
  • 【刷题笔记】2019 CSP-S
    2019CSP-S题目整理A-格雷数思路简介思路很简单,如果编号在中点的左边那么就输出0,否则输出1,同时还要改变编号。代码实现#include<bits/stdc++.h>#definemaxn80usingnamespacestd;typedef__int128int1;int1n,k;__int128read(){ charch=getchar(); __int128......
  • leetcode刷题day27|贪心算法Part01(455.分发饼干、376. 摆动序列、53. 最大子序和)
    前言:贪心的本质选择每一阶段的局部最优,从而达到全局最优。455.分发饼干思路:局部最优-大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个;全局最优:喂饱尽可能多的小孩。可以尝试使用贪心策略,先将饼干数组和小孩数组排序,然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计......