首页 > 其他分享 >2023.04.19总结

2023.04.19总结

时间:2023-04-21 21:24:10浏览次数:40  
标签:总结 pq 19 top 2023.04 int le MAXN dp

题目1:abc252_f

题意

  • 有一个长度为 \(l\) 的面包,要把这块面包切成 \(n\) 段,$a_1, a_2, \dots,a_n $,有剩下的不分配。将一块长度为 \(k\) 的面包切成两块的代价为 \(k\),问要将面包切成 \(n\) 段的最小代价。

  • \(1 \le n \le 10^5, 1 \le a_i \le 10^9, \sum\limits_{i = 1}^n a_i\le l \le 10^{15}\),输入均为整数。

思路

  • 首先我们可以发现,这块面包最后分成了:\(a_1, a_2, \dots a_n, l - \sum\limits_{i = 1}^n a_i\)(最后一段有没有取决于它的长度是否 \(>0\))。所以题目简化为每次将两块面包合起来,问把这些面包合成一块的最小代价。而这不就是合并果子吗。

  • 时间复杂度:贪心时用堆求答案,\(O(n \times \log n)\)。

using ll = long long;

const int MAXN = 2e5 + 5;

int n;
ll ans, l, s, x, y;
priority_queue<ll, vector<ll>, greater<ll>> pq;

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> l ;
  for (int i = 1; i <= n; i++) {
    cin >> x;
    pq.push(x), s += x;
  }
  if (l > s) {
    pq.push(l - s);
  }
  while (pq.size() > 1) { // 贪心
    x = pq.top(), pq.pop();
    y = pq.top(), pq.pop();
    ans += x + y, pq.push(x + y);
  }
  cout << ans;
  return 0;
}

题目2:洛谷 P5658

题意

有一棵有 \(n\) 个结点,根是 \(1\) 的括号树,每个节点为左或右括号,用 \(t_i\) 表示。结点 \(i(2 \le i \le n)\) 的父亲为 \(f_i\)。令 \(S_i\) 为:将根结点到 \(i\) 的简单路径上的括号,设 \(s_i\) 里有 \(k_i\) 个合法括号子串。请输出 \(((1\times k_1) xor (2 \times k_2) xor \cdots xor (n \times k_n))\)。

思路

  • 这道题是 \(dp\),令 \(dp_i\) 表示 \(S_i\) 中以 \(i\) 为结尾的合法子串数量。我们用栈 \(stk\) 记录左括号,当枚搜索到 \(i\) 时,有如下几种情况:
if (a[x] == '(') { //左括号
  stk[++top] = x;
} else if (top) { //右括号,有可以匹配的左括号
  p = stk[top--];
  dp[x] = dp[fa[p]] + 1; //首先 p ~ i 一定合法,而且和可以用以 dp[fa[p]] 为结尾的合法括号串接上 p~i
}
  • 当然我们深搜时需要回溯,注意一下。当然还要注意我们的 \(dp_i\) 是以 \(i\) 结尾的合法子串个数,不是整个 \(S_i\) 的合法子串个数,需要开前缀和,每次将父亲信息传递到儿子。

  • 时间复杂度:\(O(n)\)。

const int MAXN = 5e5 + 5;

char a[MAXN];
vector<int> son[MAXN];
int n, fx, top, stk[MAXN], fa[MAXN];
long long ans, s[MAXN], dp[MAXN];

void Dfs(int x) {
  int p = 0;
  if (a[x] == '(') {
    stk[++top] = x;
  } else if (top) {
    p = stk[top--];
    dp[x] = dp[fa[p]] + 1, s[x] += dp[x];
  }
  ans ^= s[x] * x; //记录答案
  for (int y : son[x]) {
    s[y] = s[x], Dfs(y);
  }
  // 回溯
  if (p) {
    stk[++top] = p;
  } else if(a[x] == '(') {
    top--;
  }
}

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  for (int i = 2; i <= n; i++) {
    cin >> fx, son[fx].push_back(i), fa[i] = fx;
  }
  Dfs(1);
  cout << ans;
  return 0;
}

标签:总结,pq,19,top,2023.04,int,le,MAXN,dp
From: https://www.cnblogs.com/xhr0817-blog/p/17333097.html

相关文章

  • 每日总结2023-04-21
    今天将补货的历史记录做出来了。补货历史界面: 修改了补货的界面,调整了预约时间 ......
  • 每日总结 4.21
    今天进行了供货商的页面设计,对于需求方发送的商品信息进行数据处理显示需要付款的金额,对补货按钮进行了操作,进行了数据库的更新。packageres;importjava.io.IOException;importjava.io.PrintWriter;importjakarta.servlet.ServletException;importjakarta.servlet.an......
  • 1119 前序和后序遍历
    假设一个二叉树上所有结点的权值都互不相同。我们可以通过后序遍历和中序遍历来确定唯一二叉树。也可以通过前序遍历和中序遍历来确定唯一二叉树。但是,如果只通过前序遍历和后序遍历,则有可能无法确定唯一二叉树。现在,给定一组前序遍历和后序遍历,请你输出对应二叉树的中序遍历......
  • 今日总结
    今天学习了mybatisplus,在springboot导入plus的起步依赖, 之后就可以使用了,plus的最大好处在于简化mapper的开发,只需继承基础mapper, 里面神么都不写,因为basemapper已经包含了我们需要的方法。还有plus的专门语法......
  • Linux权限维持-隐藏总结
    攻击者在获取服务器权限后,会通过一些技巧来隐藏自己的踪迹和后门文件,本文总结下Linux的一些隐藏手段。隐藏文件Linux下创建一个隐藏文件:touch.test.txttouch命令可以创建一个文件,文件名前面加一个. 就代表是隐藏文件查看Linux下的隐藏文件需要用到命令:ls-al这里,我们可以......
  • 测试常用工具总结
    1.adb       安卓调试查日志等2.git         代码管理平台3.idea        java集成开发平台4.pycharm    Python集成开发平台5.jdk         Java编译环境6.jmeter       压测工具7......
  • 4.21总结
    --查询所有数据SELECT*FROMstu;--给指定列添加数据INSERTINTO表名(列名1,列名2,...)VALUES(值1,值2,...);INSERTintostu(id,name,sex,birthday,score,email,tel,status)values(3,'李四','男','2000-11-11',88.88,'qq.com','18100000000�......
  • 【总结】浅刷leetcode,对于位运算提高性能的一些总结
    目录什么是位运算?位运算技巧1.判断奇偶性2.交换两个数3.判断一个数是否是2的幂次方4.取绝对值5.计算平均数结论位运算技巧是计算机科学中非常重要的一部分,它可以用来解决很多实际问题。在本篇博客中,我们将介绍一些常见的位运算技巧,以及它们在实际应用中的使用。什......
  • ubuntu常用命令总结
    本地与服务器之间copy文件输入命令:【scp/path/to/source/file.tar.gzuser@destination:/path/to/destination/】/path/to/source/file.tar.gz是要复制的源文件的路径和文件名。user是目标服务器的用户名。destination是目标服务器的IP地址或主机名。:/path/to/destin......
  • hive 知识总结
      hive为何要修改数据库: deby只支持一个SESSION会话,如果hive使用默认的deby,那么在linux客户端开启第二个Hive命令行的时候,会报错,而mysql是支持多会话的数据库。  hive对应的列为何不规定长度:  不确定这些字段的长度,而且最终存储在hdfs文件中(联想与txt)txt中也没法规......