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二分看了二十分钟........ 然后第二题看了 ...
随机推荐
- B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
- Python爬虫丨大众点评数据爬虫教程(2)
大众点评数据爬虫获取教程 --- [SVG映射版本] 前言: 大众点评是一款非常受大众喜爱的一个第三方的美食相关的点评网站.从网站内可以推荐吃喝玩乐优惠信息,提供美食餐厅.酒店旅游.电影票.家居装修. ...
- 武装你的WEBAPI-OData入门
本文属于OData系列 目录(可能会有后续修改) 武装你的WEBAPI-OData入门 武装你的WEBAPI-OData便捷查询 武装你的WEBAPI-OData分页查询 武装你的WEBAPI-ODa ...
- 用python爬了厦门人才网的.net岗位
为了看看.net的就业行情怎么样,用python爬取了厦门人才网.net岗位的信息,话不多说上代码,python没学多久,如果有什么不妥请指正 import requests from bs4 imp ...
- 进程和线程—Python多线程编程
进程和线程 进程 进程是一个执行中的程序.每个进程都拥有自己的地址空间.内存.数据栈以及其它用于跟踪执行的辅助数据. 一个程序运行就是一个进程(比如 QQ.微信或者其它软件): 进程可以通过派生新的进 ...
- chrom浏览器总是将http请求强制转换成https请求
chrome://net-internals/#hsts 中 Delete domain security policies 输入该站点,将将该站点删除一下就OK. 其他浏览器: Chrome 浏览器 ...
- 【蓝桥杯C组】备赛基础篇之前缀和算法
算法介绍: 设a为数组,a[i]中储存的是前i 个数(包括自己)的总和,相当于我们中学学过的前N项和,那么,弄成这样的好处是什么呢?假如我们要多次访问一段区间的总和,难道每次都加一次进行重复运算吗?? ...
- Java 如何实现优雅停服?刨根问底
在 Java 的世界里遨游,如果能拥有一双善于发现的眼睛,有很多东西留心去看,外加耐心助力,仔细去品,往往会品出不一样的味道. 通过本次分享,能让你轻松 get 如下几点,绝对收获满满. a)如何让 ...
- 【比较】粒子群算法PSO 和 遗传算法GA 的相同点和不同点
目录 PSO和GA的相同点 PSO和GA不同点 粒子群算法(PSO)和遗传算法(GA)都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解. PSO和G ...
- 10.1Go Mysql
第十章 Go Mysql 准备好mysql数据库服务端数据. 创建test数据库 MariaDB [(none)]> create database test; Query OK, 1 row ...