首页 > 其他分享 >ABC 312

ABC 312

时间:2024-02-08 18:44:17浏览次数:31  
标签:结点 ABC 罐头 312 multiset 开罐器 长方体 rightarrow

前三题氵

D

给定一个由 (,?,) 组成的字符串。每个 ? 可以设定为任意括号。求有几种设定方法使得整个是合法括号序列。

套路,dp

E

给定 \(n\) 个两两不相交的长方体,对每个长方体,求有多少个长方体与其有公共面。

有一个可以大幅度优化代码麻烦程度的小技巧:因为坐标范围很小,我们直接把每个长方体拆成 \(x*y*z\) 个小立方体看就行。

对于第 \(i\) 个长方体的每个小立方体 \((a,b,c)\),让它相邻的六个小立方体都统计一下:我的相邻小立方体有来自第 \(i\) 个长方体的。这其实就等价于有公共面。

F

有 \(n\) 个东西类型为 \(0,1,2\)。

类型 \(0\) 的是罐头,无限制,有一个价值。

类型 \(1\) 的也是罐头,需要开罐器,也有一个价值。

类型 \(2\) 的是开罐器,有一个可开罐数量。

只能选 \(m\) 个东西,求最大价值和。


这题比 E 氵

考虑枚举拿的开罐器数量,同时维护此时的最大价值和。

用一个 multiset 保存当前持有的罐头。初始时把最大的 \(m\) 个类型 \(0\) 加入 multiset 并令初始价值和为它们的价值和。(赛时居然把所有类型 \(0\) 的都加入 multiset 了,一定注意是最大的m个

然后枚举拿的开罐器数量,注意开罐器一定是按照可开罐数量从大到小拿。(如果某次发现上一次的总可开罐数量已经足够开启所有罐头,就 break)

假设这次拿的开罐器可以打开 \(x\) 个罐头,接下来从上一次开罐的结尾开始,再把之后的 \(x\) 个罐头加入 multiset,同时也令当前价值和加上这 \(x\) 个罐头。

最后把 multiset 中多余的罐头去掉。(注意要考虑拿了一些开罐器)这时剩下的就是拿这么多开罐器的答案了。

每次让 \(ans\) 和维护的最大价值和取 \(\max\) 即可。

G

找出树上有多少个三个点的点组,使得不存在一条简单路径包含这点组内的三个点。

每一个符合要求的三点组 \((i,j,k)\),一定唯一存在一个结点 \(v\),使得 \((i\rightarrow v,j\rightarrow v),\;\,(j\rightarrow v,k\rightarrow v),\;\,(i\rightarrow v,k\rightarrow v)\) 这三对路径中,每一对路径都存在一个非 \(v\) 的结点重复。(说人话就是从点 \(v\) 往外辐射出去)

因此只需要考虑每一个点 \(v\),统计对应的 \((i,j,k)\) 个数,加起来就是答案。

而假设固定了点 \(v\),\((i,j,k)\) 的个数就是从 \(v\) 的每个儿子子树的规模中,任取三个相乘的和。(例如 \(v\) 有 \(4\) 个儿子,\(4\) 颗子树的规模分别为 \(2,1,1,3\),答案就是 \((2*1*1+2*1*3+1*1*3\))

如果 \(v\) 的子结点不足 \(3\) 个,对答案的贡献为 \(0\)。

“任取三个相乘的和” 这个问题可以用 DP 解:\(dp_{i,j}\) 表示前 \(i\) 个元素任取 \(j\) 个数相乘,求和是多少。时间复杂度 \(O(\)序列长度\()\)。

因此对于一个固定的结点 \(v\),它对答案的贡献可以以 \(O(sons[v])\) 的复杂度求出,\(sons[v]\) 是以 \(v\) 为根时 \(v\) 的子结点个数。

但是还有一个问题:以 \(v\) 为根时,各子结点的子树规模怎么求?其实做一遍换根 DP 就行。

总复杂度 \(O(n)\)。

其实这题用到的知识点并不超纲。赛时卡在了如何求出“任取三个相乘的和”上。

标签:结点,ABC,罐头,312,multiset,开罐器,长方体,rightarrow
From: https://www.cnblogs.com/FLY-lai/p/18012022

相关文章

  • ABC 311
    前四题过水E枚举正方形的上边界所在行。对于第\(i\)行一个没洞的位置\((i,j)\),我们尝试求出以它为右上角的无洞正方形个数。结论:设以\((i,j-1)\)为右上角的无洞正方形边长最大为\(len\),那以\((i,j)\)为右上角的无洞正方形边长最大为\(len+1\)。以\((i,j)\)为右上......
  • [ABC327G] Many Good Tuple Problems 题解
    Description对于一对长度均为\(M\)且元素值在\(\left[1,N\right]\)之间的序列\((S,T)\),定义其为好的当且仅当:存在一个长度为\(N\)的\(01\)序列\(X\),使得其满足如下条件:对于任意\(i\in\left[1,M\right]\),有\(X_{S_i}\neqX_{T_i}\)。给定\(N,M\),求在......
  • AT_abc270_g [ABC270G] Sequence in mod P 题解
    题目传送门前置知识大步小步算法解法递推式为\(x_{n}=(ax_{n-1}+b)\bmodp\),发现可以统一消去\(\bmodp\),只在最后参与计算。以下过程省去模运算。当\(x_{0}=t\)时,则\(n=0\)即为所求。当\(a=0,x_{0}\net\)时,递推式转化为\(x_{n}=b\bmodp\)。若\(b=t\),则......
  • AtCoder-ABC-Ex乱写
    ABC233ExManhattanChristmasTree先将\((x,y)\)变成\((x+y,x-y)\),也就是曼哈顿转切比雪夫,之后曼哈顿距离\(\lek\)的在切比雪夫坐标系下就是一个正方形。用主席树做矩形和,外层套一个二分即可,时间复杂度\(\mathcal{O}(n\log^2n)\)。ABC233Ex#include<bits/stdc++.h......
  • 【多线程例题】使用三个线程,分别可以打印A,B,C。要求实现三个线程协同打印,顺序打印出ABC
    顺序打印-进阶版方法一:三个线程竞争同一个锁,通过count判断是否打印三个线程分别打印A,B,C方法一:通过count计数打印(三个线程上同样的锁,打印一个,召唤所有锁,如果不满足条件,则wait等待,锁自动解锁)方法二:/***有三个线程,分别只能打印A,B和C*要求按顺序打印ABC,打印10次*输出示......
  • ABC335 A~E 题解
    A题目大意输入一个字符串,把这个字符串的最后一位改成4后输出这个字符串。解题思路直接模拟即可AC代码#include<iostream>#include<math.h>#include<time.h>#include<stdio.h>#include<algorithm>#definelllonglonginlinevoidwork(){std::strings;s......
  • ABC240Ex Sequence of Substrings
    题意简述有长度为\(n\)的01串,你现在要选出\(k\)个两两无交子串,使得将\(k\)个子串按照出现位置排序后,后者的字典序严格比前者大。最大化\(k\)。\(\bm{n\le2\times10^4}\)。分析首先的首先观察数据范围可知此题应该是个线性根号对数的时间复杂度首先有个显然的\(O(n......
  • 按大小顺序依次输出abc的值
    include<stdio.h>intmain(){inta,b,c;printf("请输入三个整数:");scanf("%d%d%d",&a,&b,&c);if(a>b&&a>c){if(b>c){printf("从大到小输出三个数:%d%d%d",a,b,c);}else{printf("从大到小输出三个数:%d%d%d&q......
  • [ABC238F] Two Exams 题解
    题目链接题意有\(N\)个人,有两个\(1\simN\)排列\(P,Q\),在其中选择\(K\)个数,要满足:如果\(P_x<P_y\)且\(Q_x<Q_y\)则不能选了\(y\)而不选\(x\)。思路首先按照\(P\)从小到大排序,这样的话只用考虑\(Q\)。设\(f_{i,j,k}\)表示从前\(i\)个数中选\(j\)个,其中......
  • abc339 详解
    第一篇整场题解纪念我第一次AK的abc!A从后往前找到第一个'.'然后输出'.'到字符串结尾构成的字符串。#include<iostream>usingnamespacestd;intmain(intargc,constchar*argv[]){stringstr;cin>>str;intlen=(int)str.length();stri......