虽然打的是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)题解的更多相关文章

  1. Codeforces Round #609 (Div. 2)前五题题解

    Codeforces Round #609 (Div. 2)前五题题解 补题补题…… C题写挂了好几个次,最后一题看了好久题解才懂……我太迟钝了…… 然后因为longlong调了半个小时…… A.Eq ...

  2. Codeforces Round #635 (Div. 2) 题解

    渭城朝雨浥轻尘,客舍青青柳色新. 劝君更尽一杯酒,西出阳关无故人.--王维 A. Ichihime and Triangle 网址:https://codeforces.com/contest/133 ...

  3. Codeforces Round #635 (Div. 2)

    Contest Info Practice Link Solved A B C D E F 4/6 O O Ø  Ø     O 在比赛中通过 Ø 赛后通过 ! 尝试了但是失败了 - 没有尝试 Sol ...

  4. Codeforces Round #635 (Div. 1)

    传送门 A. Linova and Kingdom 题意: 给定一颗以\(1\)为根的树,现在要选定\(k\)个结点为黑点,一个黑点的贡献为从他出发到根节点经过的白点数量. 问黑点贡献总和最大为多少. ...

  5. Codeforces Round #556 (Div. 2) D. Three Religions 题解 动态规划

    题目链接:http://codeforces.com/contest/1150/problem/D 题目大意: 你有一个参考串 s 和三个装载字符串的容器 vec[0..2] ,然后还有 q 次操作, ...

  6. Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解 组合数学

    题目链接:https://codeforces.com/contest/1265/problem/E 题目大意: 有 \(n\) 个步骤,第 \(i\) 个步骤成功的概率是 \(P_i\) ,每一步只 ...

  7. Codeforces Round #624 (Div. 3) F. Moving Points 题解

    第一次写博客 ,请多指教! 翻了翻前面的题解发现都是用树状数组来做,这里更新一个 线段树+离散化的做法: 其实这道题是没有必要用线段树的,树状数组就能够解决.但是个人感觉把线段树用熟了会比树状数组更有 ...

  8. Codeforces Round #677 (Div. 3) E、G题解

    E. Two Round Dances #圆排列 题目链接 题意 \(n\)(保证偶数)个人,要表演一个节目,这个节目包含两种圆形舞蹈,而每种圆形舞蹈恰好需要\(n/2\)个人,每个人只能跳一种圆形舞 ...

  9. Codeforces Round#402(Div.1)掉分记+题解

    哎,今天第一次打div1 感觉头脑很不清醒... 看到第一题就蒙了,想了好久,怎么乱dp,倒过来插之类的...突然发现不就是一道sb二分吗.....sb二分看了二十分钟........ 然后第二题看了 ...

随机推荐

  1. P5343 【XR-1】分块(dp矩阵加速)

    \(大意是用数组a里的数字,组成一个序列,使得序列和为n的方案种数\)传送门 \(先考虑dp.\) \(但是不能直接用背包转移,因为是序列,要考虑顺序.\) \(所以,为了去重,我们令dp[i][j] ...

  2. P2774 方格取数问题 网络流

    题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  3. Oracle触发器之系统触发器

    系统触发器 可以用系统触发器记录一些ddl的数据操作或者是数据库的登录 或者登出操作. 语法: create or replace trigger 触发器名称 before/after 触发器时机 事 ...

  4. spring学习笔记(二)spring中的事件及多线程

    我们知道,在实际开发中为了解耦,或者提高用户体验,都会采用到异步的方式.这里举个简单的例子,在用户注册的sh时候,一般我们都会要求手机验证码验证,邮箱验证,而这都依赖于第三方.这种情况下,我们一般会通 ...

  5. python2执行程序报错:NameError: name 'y' is not defined

    然后运行一直报错 这个错误,是由于版本不同造成的语法错误,在python3中,输入可以使用input,但如果你的版本是python2,那么此时input就得改成raw_input,否则你输入数据会被当 ...

  6. 李婷华 201771010113 《面向对象程序设计(java)》 第三周学习总结

    第一部分:理论知识回顾 第一章 再次了解了java“白皮书”的关键术语,java的常见术语,对于“白皮书”的关键术语依然环游不太理解的. 第二章 在使用命令行工具运行java程序的过程中,依然会有环境 ...

  7. 【Spark】RDD(Resilient Distributed Dataset)究竟是什么?

    目录 基本概念 官方文档 概述 含义 RDD出现的原因 五大属性 以单词统计为例,一张图熟悉RDD当中的五大属性 解构图 RDD弹性 RDD特点 分区 只读 依赖 缓存 checkpoint 基本概念 ...

  8. SAP ME01创建货源清单

    1业务说明 此文档使用函数:ME_DIRECT_INPUT_SOURCE_LIST创建货源清单 2前台实现 事务代码:ME01 输入抬头信息 保存即可 3代码实现 3.1调用函数 定义参数 字段 调用 ...

  9. 世界这么大,Python 也想去看看

    把时间线拉回到 2015 年 4 月 13 日,一位河南省实验中学的心里老师在辞职信上写下了「世界那么大,我想去看看」这句话,后来爆红网络,我想这位心里老师当时写这句话的时候肯定没想到这句只有十个字的 ...

  10. Mysql 常用函数(5)- substring 函数

    Mysql常用函数的汇总,可看下面系列文章 https://www.cnblogs.com/poloyy/category/1765164.html substring 的作用 截取指定范围的字符串, ...