Educational Codeforces Round 64(Unrated for Div.1+Div. 2)
什么垃圾比赛,A题说的什么鬼楞是没看懂。就我只会BD(其实C是个大水题二分),垃圾游戏,技不如人,肝败吓疯,告辞,口胡了E就睡觉了。
B
很容易发现,存在一种方案,使得相同字母连在一起,然后发现,当字母出现种类数大于等于4时,可以奇偶性相间地连接,然后讨论种类数<=3的:种类数为1,显然直接输出;种类数为2,若两字母相邻则无解,否则直接输出;种类数为3,若三字母相邻则无解,否则按照213/231(至少一种符合条件)输出。
#include<bits/stdc++.h>
using namespace std;
const int N=;
int T,n,m,ans,sum[N],id[N];
char s[N];
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%s",s+),n=strlen(s+);
memset(sum,,sizeof sum);
memset(id,,sizeof id);
for(int i=;i<=n;i++)sum[s[i]-'a'+]++;
int num=;
for(int i=;i<=;i++)if(sum[i])id[i]=++num;
if(num==)
{
for(int i=;i<=n;i++)printf("%c",s[i]);
}
else if(num>=)
{
for(int i=;i>=;i--)
if(id[i]&)
{
for(int j=;j<=sum[i];j++)printf("%c",'a'+i-);
}
for(int i=;i>=;i--)
if(id[i]&&id[i]%==)
{
for(int j=;j<=sum[i];j++)printf("%c",'a'+i-);
}
}
else if(num==)
{
int flag=;
for(int i=;i<=;i++)if(sum[i]&&sum[i-]&&sum[i+])flag=;
if(flag)printf("No answer");
else{
for(int i=;i<=;i++)
for(int j=;j<i;j++)
for(int k=i+;k<=;k++)
if(sum[j]&&sum[i]&&sum[k])
{
for(int t=;t<=sum[i];t++)printf("%c",'a'+i-);
if(j==i-)
{
for(int t=;t<=sum[k];t++)printf("%c",'a'+k-);
for(int t=;t<=sum[j];t++)printf("%c",'a'+j-);
}
else{
for(int t=;t<=sum[j];t++)printf("%c",'a'+j-);
for(int t=;t<=sum[k];t++)printf("%c",'a'+k-);
}
}
}
}
else{
int flag=;
for(int i=;i<=;i++)if(sum[i]&&sum[i+])flag=;
if(flag)printf("No answer");
else{
for(int i=;i<=;i++)if(sum[i])
{
for(int j=;j<=sum[i];j++)printf("%c",'a'+i-);
}
}
}
puts("");
}
}
D
很容易想到一个DP,令f[i]表示以i为根的子树,从下面的节点走上来,最后一步是黑边的点数,g[i]表示全走白边的点数,于是就有f[u]=Σ(f[son]+g[son]+1),son为经过黑边的son,g[u]=Σ(g[son]+1),son为经过白边的son。然后这个东西很容易换根DP,根据黑白边讨论一下即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+;
int n,cnt,f[N],g[N],nf[N],ng[N],hd[N],v[N<<],nxt[N<<],w[N<<];
ll ans;
void adde(int x,int y,int z){v[++cnt]=y,nxt[cnt]=hd[x],w[cnt]=z,hd[x]=cnt;}
void dfs(int u,int fa)
{
for(int i=hd[u];i;i=nxt[i])
if(v[i]!=fa)
{
dfs(v[i],u);
if(!w[i])g[u]+=g[v[i]]+;
else f[u]+=f[v[i]]+g[v[i]]+;
}
}
void dfs2(int u,int fa)
{
ans+=nf[u]+ng[u];
for(int i=hd[u];i;i=nxt[i])
if(v[i]!=fa)
{
if(!w[i])nf[v[i]]=f[v[i]],ng[v[i]]=ng[u];
else nf[v[i]]=nf[u]-g[v[i]]+ng[u],ng[v[i]]=g[v[i]];
dfs2(v[i],u);
}
}
int main()
{
scanf("%d",&n);
for(int i=,x,y,z;i<n;i++)scanf("%d%d%d",&x,&y,&z),adde(x,y,z),adde(y,x,z);
dfs(,);
nf[]=f[],ng[]=g[],dfs2(,);
cout<<ans;
}
E
口胡了一个分治做法,一写发现,它居然过了。感觉本题比D简单。
做法大致如下:直接算很难处理,考虑分治,对于长度大于等于3的区间[l,r],考虑覆盖mid和mid+1的所有区间,可以把[l,r]分为[l,mid]和[mid+1,r]两半,然后mx[i]对于左半部分表示后缀最大值,对于右半部分表示前缀最大值,然后枚举位置计算另一端的位置是否符合题意,因为区间的max值出现在两端的mx之一,所以左右都搜一下即可统计所有答案。复杂度O(nlogn)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+;
int n,ans,a[N],b[N],mx[N];
void solve(int l,int r)
{
if(l+>=r)return;
int mid=l+r>>;
solve(l,mid),solve(mid+,r);
mx[mid]=a[mid];for(int i=mid-;i>=l;i--)mx[i]=max(mx[i+],a[i]);
mx[mid+]=a[mid+];for(int i=mid+;i<=r;i++)mx[i]=max(mx[i-],a[i]);
for(int i=l;i<=mid;i++)
{
int pos=b[mx[i]-a[i]];
if(pos>mid&&pos<=r&&mx[pos]<mx[i])ans++;
}
for(int i=mid+;i<=r;i++)
{
int pos=b[mx[i]-a[i]];
if(pos>=l&&pos<=mid&&mx[pos]<mx[i])ans++;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]),b[a[i]]=i;
solve(,n);
printf("%d",ans);
}
F
很容易想到dp,令f[i][j]表示第i轮当前卡为j且游戏继续的概率,然后根据第i轮每张卡有1/(n-i+1)的概率选中,直接写个前缀和,根据题意暴力DP转移即可,代码20行。
感觉这题更简单,CF这场什么垃圾排题顺序,难怪Unrated
#include<bits/stdc++.h>
using namespace std;
const int N=,mod=;
int n,ans,a[N],s[N],inv[N],f[N][N];
int main()
{
scanf("%d",&n);
for(int i=,x;i<=n;i++)scanf("%d",&x),a[x]++;
for(int i=n;i;i--)s[i]=s[i+]+a[i];
inv[]=;for(int i=;i<=n;i++)inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=n;i++)f[][i]=1ll*a[i]*inv[n]%mod;
for(int i=;i<=n;i++)
for(int j=,sum=;j<=n;j++)
f[i][j]=1ll*a[j]*sum%mod,sum=(sum+1ll*f[i-][j]*inv[n-i+])%mod;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(a[j]>)ans=(ans+1ll*f[i][j]%mod*(a[j]-)%mod*inv[n-i])%mod;
printf("%d",ans);
}
G
看了下是个没有意思的大模拟,不想写也不会写,咕了。
感觉真实难度顺序:C<B<E<D=F<G<A
Educational Codeforces Round 64(Unrated for Div.1+Div. 2)的更多相关文章
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- Educational Codeforces Round 64部分题解
Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点 ...
- Educational Codeforces Round 64 部分题解
Educational Codeforces Round 64 部分题解 不更了不更了 CF1156D 0-1-Tree 有一棵树,边权都是0或1.定义点对\(x,y(x\neq y)\)合法当且仅当 ...
- Educational Codeforces Round 64(ECR64)
Educational Codeforces Round 64 CodeForces 1156A 题意:1代表圆,2代表正三角形,3代表正方形.给一个只含1,2,3的数列a,ai+1内接在ai内,求总 ...
- Educational Codeforces Round 64 (Rated for Div. 2) A,B,C,D,E,F
比赛链接: https://codeforces.com/contest/1156 A. Inscribed Figures 题意: 给出$n(2\leq n\leq 100)$个数,只含有1,2,3 ...
- Educational Codeforces Round 64 (Rated for Div. 2) (线段树二分)
题目:http://codeforces.com/contest/1156/problem/E 题意:给你1-n n个数,然后求有多少个区间[l,r] 满足 a[l]+a[r]=max([l, ...
- Educational Codeforces Round 64 (Rated for Div. 2)D(并查集,图)
#include<bits/stdc++.h>using namespace std;int f[2][200007],s[2][200007];//并查集,相邻点int find_(in ...
- Educational Codeforces Round 64 (Div. 2)
A.3*3讨论即可,注意正方形套圆套三角形只有6个点. #include<cstdio> #include<cstring> #include<iostream> ...
- Educational Codeforces Round 64 -C(二分)
题目链接:https://codeforces.com/contest/1156/problem/C 题意:给出n个数和整形数z,定义一对数为差>=z的数,且每个数最多和一个数组成对,求最多有多 ...
随机推荐
- 装WIN7的一点心得
一.为什么要装WIN7 长久以来个人的习惯,WIN10用不来,总体安装思路是:下官方版,找方法激活 二.安装镜像的来源 这个网上版本五花八门,各种系统网站,但都会有软件捆绑等行为,还有浏览器中强制捆了 ...
- 51Nod大数加法(两个数正负都可)
很多大数的问题都运用模拟的思想,但是这个说一样也一样,但是难度较大,很麻烦,我自己谢写了100多行的代码,感觉很对,但就是WA.其实个人感觉C和C++没有大数类,是对人思想和算法的考验,但是有时候做不 ...
- centos 7.4 安装docker 19.03.6 版本。附带离线安装包
说明: 1.此环境为未安装过docker服务的环境, 如果已经安装,则自行卸载. 2.以下环境中上传的包及离线yum源默认为/home目录下,如无特殊说明,以此目录为准 步骤一:下载docker离线安 ...
- 在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4
上次在网上找了一个在阿里云Centos7.6中部署nginx1.16+uwsgi2.0.18+Django2.0.4的文档,可能是这个文档不是最新版的,安装的时候遇到了很多问题, 最后跟一个大神要了一 ...
- Vue 指令 v-text v-html
有三个指令达到的效果是一样的 {{JS表达式}} 差值表达式 v-text="JS表达式" v-html="JS表达式" //会自动解析tag js表达式 ...
- golang实现单链表
package main import "fmt" type Object interface{} type Node struct { data Object next *Nod ...
- UVA 11019 二维匹配 AC自动机
这个题目要求在一个大矩阵里面匹配一个小矩阵,是AC自动机的灵活应用 思路是逐行按普通AC自动机匹配,用过counts[i][j]记录一下T字符矩阵以i行j列为开头的与P等大的矩阵区域 有多少行已经匹配 ...
- UML-重构
1.重构是什么? 重构是重写或重新构建已有代码的结构化和规律性方法,但不会改变已有代码的外在行为,而是采用一系列少量转换的步骤,并且每一步都结合了重新执行的测试.重构并不是全部推翻原有代码结构. 2. ...
- 浅谈Redis五个对象类型的底层原理
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html Redis是一种key/value型数据库,其 ...
- 黑马_13 Spring Boot:04.spring boot 配置文件
13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...