虽然打的是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. Jmeter系列(10)- 阶梯加压线程组Stepping Thread Group详解

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 前言 Stepping Thread ...

  2. Spring Boot学习 之 Spring Boot Actuator(一)

    Spring Boot版本:2.1.4.RELEASE 启用: spring-boot-actuator模块提供了一系列的用于监控的端点.最简单的开启这个功能的方法就是,在pom文件中添加如下的依赖. ...

  3. Cookie什么?Cookie和Session防御怎么做?

    Cookie什么?Cookie和Session防御怎么做? Cookie的概念 Cookie,复数形态Cookies,中文名称为小型文本文件.指某些网站为了辨别用户身份.进行session跟踪而储存在 ...

  4. YOLOV4所用到的一些tricks

    原文链接:http://arxiv.org/abs/2004.10934 整体框架        Bag of Freebies(BoF) & Bag  of Specials (BoS) B ...

  5. (1)从通信中的MCS含义开始讲起

    通信中的MCS:Modulation and Coding Scheme,意思为调制编码方案/调制编码策略,其内涵可分为两个部分:Modulation  和  Coding. 在基带的信号处理流程中, ...

  6. 跨站点请求伪造(CSRF)总结和防御

    什么是CRSF 构建一个地址,比如说是删除某个博客网站博客的链接,然后诱使已经登录过该网站的用户点击恶意链接,可能会导致用户通过自己的手将曾经发布在该网站的博客在不知情的情况下删除了.这种构建恶意链接 ...

  7. Vue中跨域问题解决方案1

    我们需要配置代理.代理可以解决的原因:因为客户端请求服务端的数据是存在跨域问题的,而服务器和服务器之间可以相互请求数据,是没有跨域的概念(如果服务器没有设置禁止跨域的权限问题),也就是说,我们可以配置 ...

  8. JavaWeb学习之JSP(二) JSP标签

    JSP常用标签 什么是JSP标签 JSP标签,有的地方也叫做JSP动作,在JSP中编写大量的java代码会使JSP页面显得杂乱无章,看起来非常不舒服,因此JSP提供了一些类似html的标签,通过这些标 ...

  9. appium——如何导出夜神模拟器下载“微信”app的apk

    背景:夜神模拟器是一款功能强大的安卓模拟器,但是当我们在上面下载APP应用后,通常不知道apk文件在哪里,下面以“微信”APP为例做一下详细介绍. 一般情况下,使用夜神安卓模拟器下载的文件只能在夜神安 ...

  10. react+express实现跨域

    1. 首先复习一下跨域的几种主要方式: a. jsonp b. cors c. 代理服务(开发环境下常用) 2. 代理服务器:可实现转发请求.即浏览器在3000端口发出请求,通过代理转发,将请求发送给 ...