Codeforces Round #635 (Div. 2)部分(A~E)题解
虽然打的是div1,但最后半小时完全处于挂机状态,不会做1C,只有个 \(O(n^3)\) 的想法,水了水论坛,甚至看了一下div2的AB,所以干脆顺便写个div2的题解吧,内容看上去还丰富一些(X)
A Ichihime and Triangle
div2的日常构造题,想造个三角形的话,贪的思路就是让三条边长度尽可能接近,那就尽量把三个数都往中间凑一凑,然后发现\((b,c,c)\)是满足要求的,输出即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int t,a,b,c,d;
int main(){
cin>>t;
while(t--){
cin>>a>>b>>c>>d;
printf("%d %d %d\n",b,c,c);
}
return 0;
}
B Kana and Dragon Quest game
div2的日常贪心题,注意到操作1可能让HP变的更多,而操作2保证HP会越来越少。所以先贪心的使用操作1,直到操作1再用就使得HP变更多了为止,再进行操作二。检查这一通操作后HP是否还大于0即可。
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int t,x,n,m;
int main(){
cin>>t;
while(t--){
cin>>x>>n>>m;
rep(i,1,n){
if(x/2+10>x){
break;
}
x=x/2+10;
}
rep(i,1,m){
x-=10;
}
if(x>0) puts("NO");
else puts("YES");
}
return 0;
}
C Linova and Kingdom
div2的日常......好吧这题不太日常,算是比较难一些的div2C,是道很有意思的好题。
第一反应的思路肯定是按照深度来贪心,优先选深的,然后你会发现甚至过不了样例,因为可能某一个点虽然很深,但它的儿子很多,所以你选了他之后,他所有儿子的贡献都要减一,可能该选择不如选另一条分支上一个比他浅的点优。
所以在此基础上稍加改变,也就是由于实际上选一个点对答案的贡献是:1、增加了一个深度那么大的值;2、减少了一个儿子数那么多的值。所以,我们对树上的\(i\)号节点,记录\(dep[i]-son[i]\),这才是选择某个点的真正贡献,贪心的选择该值大的i即可。当然,上面的“2”中其实隐含了另一个贪心性质,也就是最优解中某个节点被选择时其所有的儿子一定已经先被选择了,而这是好证的,因为否则的话,我们就可以选择其一个未被选择的儿子,得到更优的结果。
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int n,k,u,v,dep[200010],son[200010];
vector<int> g[200010];
ll a[200010];
int dfs(int now,int fa,int d){
dep[now]=d;
int ret=0;
for(auto to:g[now]){
if(to!=fa) ret+=dfs(to,now,d+1);
}
son[now]=ret;
return ret+1;
}
int main(){
cin>>n>>k;
rep(i,1,n-1){
scanf("%d%d",&u,&v);
g[u].pb(v);
g[v].pb(u);
}
dfs(1,1,0);
rep(i,1,n) a[i]=dep[i]-son[i];
sort(a+1,a+1+n);
ll ans=0;
rep(i,n-k+1,n) ans+=a[i];
cout<<ans<<endl;
return 0;
}
D Xenia and Colorful Gems
根据一些奇怪的高中数学知识,很容易想到,三个数字越接近答案越小,但具体怎么接近呢?发现“0 2 4”的答案比“0 1 4”的答案,前者更小一些,因此“枚举第一个数,用第一个数二分第二个数,用二分到的第二个数再二分第三个数”的算法就是错误的。
那咋搞呢?这里需要脑子绕个弯,换个角度来看,我们只要枚举中间的那个数字,二分到离他最近的两个数计算即可。最后的答案取所有这些结果的最小值。该方法的证明也简单,通过反证法,可以说明该方法一定不会漏掉取到最小值的那个三元组。
代码实现上,应该用函数简化编程,否则的话......君不见,有老哥此题怒写200+行
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
int t;
int pa,pb,pc;
ll a[100010],b[100010],c[100010];
ll ans;
void solve(ll* a,ll* b,ll *c,int pa,int pb,int pc){
ll x,y,z;
rep(i,1,pa){
x=a[i];
int posy=lower_bound(b+1,b+1+pb,x)-b;
if(posy==pb+1) continue;
y=b[posy];
int posz=upper_bound(c+1,c+1+pc,x)-c-1;
if(posz==0) continue;
z=c[posz];
ans=min(ans,(x-z)*(x-z)+(x-y)*(x-y)+(y-z)*(y-z));
}
}
int main(){
cin>>t;
while(t--){
cin>>pa>>pb>>pc;
rep(i,1,pa) scanf("%lld",a+i);
rep(i,1,pb) scanf("%lld",b+i);
rep(i,1,pc) scanf("%lld",c+i);
sort(a+1,a+1+pa);
sort(b+1,b+1+pb);
sort(c+1,c+1+pc);
ans=9e18;
solve(a,b,c,pa,pb,pc);
solve(a,c,b,pa,pc,pb);
solve(b,a,c,pb,pa,pc);
solve(b,c,a,pb,pc,pa);
solve(c,a,b,pc,pa,pb);
solve(c,b,a,pc,pb,pa);
printf("%lld\n",ans);
}
return 0;
}
E Kaavi and Magic Spell
本题赛时我只会 \(O(n^3)\) 的解法,但比赛结束后一看题解我就会 \(O(n^2)\)的了,为什么呢?因为我发现我赛时想的算法其实tmd就是\(O(n^2)\)的...
首先,这题一会儿可以往前添加,一会可以往后添加,感觉好像会有很多种字符串的样子,但其实,因为你最后得到的字符串要以T作为前缀,所以任何时刻,只有那些最终有可能得到T作为前缀的字符串才是我们关心的。
那么,哪些字符串有可能最终得到\(T\)呢,举个例子,\(T\)是abcd的话,长为2的字符串里,可以得到T的就有ab、bc、cd了......吗?其实可能不止这些,例如如果\(S\)是fabcdf的话,那么诸如ff、df的字符串也可以最终得到\(T\)——只要给这堆f往后稍稍就行。
综上,给出这样的状态:\(dp[i][l][r]\)表示当前取了\(S\)的前\(i\)个字符了,这些字符形成的字符串是与\(T\)中的在\(l\)到\(r\)这一段完全相等的,注意按照这个定义,总有\(r-l+1==i\)成立。
那么,如何解决类似上述ff的问题呢?我们可以把\(T\)串的\([m+1,n]\)这一段脑补为填充了许多通配符,可以与任何一个字母匹配(当然,下面的程序里并不是真的这么实现的)
然后,最终的答案就是\(sum(dp[n][1][x])\)啦,之中\(m \leq x \leq n\)。
当然啦,上述过程中的第一维要优化掉,
代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
typedef double db;
char s[3010],t[3010];
int n,m;
ll dp[3010][3010],mod=998244353;
int main(){
cin>>(s+1)>>(t+1);
int n=strlen(s+1),m=strlen(t+1);
rep(i,1,n){
int len=i;
rep(l,1,n+1-len){
int r=l+len-1;
if(s[i]==t[l]||l>m){
dp[l][r]+=(l==r)?1:dp[l+1][r];
dp[l][r]%=mod;
}
if(s[i]==t[r]||r>m){
dp[l][r]+=(l==r)?1:dp[l][r-1];
dp[l][r]%=mod;
}
}
}
ll ans=0;
rep(i,m,n){
ans+=dp[1][i];
ans%=mod;
}
printf("%lld\n",ans);
return 0;
}
Codeforces Round #635 (Div. 2)部分(A~E)题解的更多相关文章
- Codeforces Round #609 (Div. 2)前五题题解
Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...
- Codeforces Round #635 (Div. 2) 题解
渭城朝雨浥轻尘,客舍青青柳色新. 劝君更尽一杯酒,西出阳关无故人.--王维 A. Ichihime and Triangle 网址:https://codeforces.com/contest/133 ...
- Codeforces Round #635 (Div. 2)
Contest Info Practice Link Solved A B C D E F 4/6 O O Ø Ø O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 Sol ...
- Codeforces Round #635 (Div. 1)
传送门 A. Linova and Kingdom 题意: 给定一颗以\(1\)为根的树,现在要选定\(k\)个结点为黑点,一个黑点的贡献为从他出发到根节点经过的白点数量. 问黑点贡献总和最大为多少. ...
- Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划
题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...
- Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学
题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...
- Codeforces Round #624 (Div. 3) F. Moving Points 题解
第一次写博客 ,请多指教! 翻了翻前面的题解发现都是用树状数组来做,这里更新一个 线段树+离散化的做法: 其实这道题是没有必要用线段树的,树状数组就能够解决.但是个人感觉把线段树用熟了会比树状数组更有 ...
- Codeforces Round #677 (Div. 3) E、G题解
E. Two Round Dances #圆排列 题目链接 题意 \(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞 ...
- Codeforces Round#402(Div.1)掉分记+题解
哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...
随机推荐
- HTML data-* 属性的含义和使用
data-*自定义数据属性 首先讲一下语法格式: data-* =“值” data-* 属性包括两部分: 属性名不应该包含任何大写字母,并且在前缀 "data-" 之后必须有至 ...
- 化妆品行业的一个MES系统案例(三)
项目的主要需求如下: (1) 管理产品的配方(物料BOM) (2) 管理产品的生产工艺(最终要将工艺参数下发到设备PLC自动执行) (3) 根据生产工单集合产品配方生成称量任务(其实领料之后的成料过程 ...
- A. Hilbert's Hotel(数学)
传送门 \(看了一下网上都没什么题解,自己写一篇吧,对你有帮助的话留个言吧~\) \(\color{Orange}{----------------------分割------------------ ...
- 网络流 + 欧拉回路 = B - Sightseeing tour POJ - 1637
B - Sightseeing tour POJ - 1637 https://blog.csdn.net/qq_36551189/article/details/80905345 首先要了解一下欧拉 ...
- 图形学_Bezier曲线
Bezier曲线由n个控制点生成,举个例子:当n=2时,点$P_0$.$P_1$之间遵从计算: $P_0=(1-t)P_0+tP_1$ 而推广为n维时,有: $P^n_0=(1-t)P^{n-1}_0 ...
- Linux之V4L2基础编程
Linux之V4L2基础编程 本文内容来源于网络,本博客进行整理. 1. 定义 V4L2(Video For Linux Two) 是内核提供给应用程序访问音.视频驱动的统一接口. 2. 工作流程: ...
- Mybatis学习笔记汇总(包括源码和jar包)
博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...
- Centos ps命令
输出格式(ps -aux) USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND VSZ:占用的虚拟内存大小() RSS: COMMAND: 执 ...
- vue-cli 2.x 搭建项目
一.vue-cli优势 1.成熟的vue项目架构设计 2.本地测试服务器 3.集成打包上线方案 二.系统要求 1.node.js 2. Git 3.node命令行终端 三.安装 1.安装vue-cli ...
- Floyd's Triangle
Floyd's Triangle Floyd's triangle is a right-angled triangular array of natural numbers. Floyd's tri ...