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的数,且每个数最多和一个数组成对,求最多有多 ...
随机推荐
- 201812-1 小明上学 Java
思路: 上学这个题和放学有区别,上学是小明每到一个路口的情况,是实时更新的.不是只有出发时间,那样就比较复杂了. 这个题需要注意:黄灯之后要等红灯,想一下交通规则. import java.util. ...
- MongoDB三-高级操作
复制来自:http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html 今天跟大家分享一下mongodb中比较好玩的知识,主 ...
- Linux基础(1) 安装
Linux基础 一.创建CentOS 7 Linux虚拟机 1.安装虚拟机 桥接网络:相当于这台机器就是物理机,多个电脑在连接在一个交换机上,同一个子网 NAT:这台机器只能通过物理机(相当于 ...
- [CISCN2019 总决赛 Day1 Web4]Laravel1
0x00 知识点 这个题核心就是找POP链,看了一下网上的WP,难顶啊.. 先贴上思路和poc,之后等熟练了再来做吧 https://glotozz.github.io/2019/11/05/buuc ...
- Centos7 死循环登录问题
问题:用户名和密码输入正确,登录后屏幕闪一下又回到初始的登录界面.不知道具体什么原因引起的,先记录下不知道是否正确的解决方案,网上找了些相关的方案有的也实现不了,可能这个问题跟装的虚拟机的版本也有关系 ...
- codeforces 596 C. p-binary
题意:给你一个n和一个p,让你用 (2k+p)进制来表示n,找出用最少的(2k+p)来表示n. 分析:首先我们看到2k,首先下想到二进制,我们可以我们列出式子,也就是 (2x1 + p)+(2x2 + ...
- 小程序调用wx.chooseLocation接口的时候无法获取权限(ios)
ios手机小程序调用wx.chooseLocation接口的时候,获取权限的时候报authorize:fail:require permission desc这样子的错误,这是由于苹果的安全机制导致需 ...
- 5)添加一个tab
1)还是按照(4)的代码:2) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~ ...
- github新建一个单页
比如可以在github上打开的网页是这种网址形式的:https://01xunsicheng.github.io/yumeihua/ 1.登录后首页找到 New repository 2.新建一个文件 ...
- Miller_Rabin素性测试
1. 为什么需要素性测试? 我们其实已经知道有一些判断素数的方法,比如: 遍历测试:待测试数n与2,3,...√n做除法判断余数是否为零,如果没有任何一个数可以整除n,则说明n为素数 Wilson定理 ...