什么垃圾比赛,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)的更多相关文章

  1. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  2. Educational Codeforces Round 64部分题解

    Educational Codeforces Round 64部分题解 A 题目大意:给定三角形(高等于低的等腰),正方形,圆,在满足其高,边长,半径最大(保证在上一个图形的内部)的前提下. 判断交点 ...

  3. Educational Codeforces Round 64 部分题解

    Educational Codeforces Round 64 部分题解 不更了不更了 CF1156D 0-1-Tree 有一棵树,边权都是0或1.定义点对\(x,y(x\neq y)\)合法当且仅当 ...

  4. Educational Codeforces Round 64(ECR64)

    Educational Codeforces Round 64 CodeForces 1156A 题意:1代表圆,2代表正三角形,3代表正方形.给一个只含1,2,3的数列a,ai+1内接在ai内,求总 ...

  5. 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 ...

  6. 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, ...

  7. 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 ...

  8. Educational Codeforces Round 64 (Div. 2)

    A.3*3讨论即可,注意正方形套圆套三角形只有6个点. #include<cstdio> #include<cstring> #include<iostream> ...

  9. Educational Codeforces Round 64 -C(二分)

    题目链接:https://codeforces.com/contest/1156/problem/C 题意:给出n个数和整形数z,定义一对数为差>=z的数,且每个数最多和一个数组成对,求最多有多 ...

随机推荐

  1. hash表系列(转)

    http://www.cnblogs.com/mumuxinfei/p/4441826.html 前言: 我以前在百度的mentor, 在面试时特喜欢考察哈希表. 那时的我满是疑惑和不解, 觉得这东西 ...

  2. javascript面向对象编程的3种常见封装形式解析

    javascript如何才能脱离函数式编程,拥抱面向对象编程呢,常见的有3种形式,其它形式可以说都是这3种的变种.   1.直接定义对象直接量的形式   var Util={     getType: ...

  3. arm 裸机学习笔记

    位置无关码 bl 是位置无关码,指令中带的数值是,编译的时候,编译器计算好的,需要跳转的位置减去 bl 指令所在位置的结果.这样当程序最开始在 4k sram 中运行的时候,跳转的位置是在 0 + o ...

  4. 关于Java中内省的总结

    内省基于JavaBean规范对反射进行了封装,提供了更加便捷的通过getter/setter方法来访问字段的方式 Java内省的知识结构图 JavaBean的规范 JavaBean在现在可以认为就是普 ...

  5. 【php】Swoole之php高性能通信框架

    Swoole介绍 swoole是由c语言开发的异步网络通信引擎,被编译为so文件(swoole.so)作为php的extesion扩展. 与其他普通扩展不同: 与普通的扩展不同的是普通的扩展只是提供一 ...

  6. 冒泡排序_python

    def popdata(ls): for i in range(len(ls)): for j in range(i+1,len(ls)): if ls[i]>ls[j]: # tmp=ls[i ...

  7. 对比Node.js和Python 帮你确定理想编程解决方案!

    世上没有最好的编程语言.有些编程语言比其他编程语言用于更具体的事情.比如,你可能需要移动应用程序,网络应用程序或更专业化的系统,则可能会有特定的语言.但是我们暂时假设你需要的是一个相对来说比较简单的网 ...

  8. spyder.app制作图标

    安装了 anaconda3, 自带spyder, 但是只能在terminal 中打开, 非常不友好. 模仿 anaconda3/目录下 Anaconda-Navigator.app, 制作了 spyd ...

  9. Nginx和php交互的两种方式

    Unix socket 也叫IPC socket  也就是进程间通信套接字用于同一台主机上的不同进程间交换数据 TCP socket IP socket要利用主机的传输层(tcp),可以用于同一台主机 ...

  10. 1.2 NumPy数组基础

    目录 第一章 numpy入门 1.2 numpy数组基础 1.2.1 数组的属性 1.2.2 数组的索引:获取单个元素 1.2.3 数组切片:获取子数组 1.2.4 数组的变形 1.2.5 数组的拼接 ...