CF Educational Codeforces Round 57划水记

时间:2022-03-15 14:31:44

因为是unrated于是就叫划水记了,而且本场也就用了1h左右。

A、B:划水去了,没做

C:大水题,根据初三课本中圆的知识,可以把角度化成弧长,而这是正多边形,所以又可以化成边数,于是假设读入为a,就是周长的a/180,gcd一下就行了,注意如果a/b这个分数满足a+1=b,那么就要ans*=2

#include<bits/stdc++.h>
using namespace std;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n,t,fm,fz;
scanf("%d",&n);
if(n==){puts("");continue;}
t=__gcd(n,);
fm=/t,fz=n/t;
if(fz+==fm)fm*=;
printf("%d\n",fm);
}
}

Code C

D:首先不是h、a、r、d的字符可以删去,不用管它,而我们可以做个dp,f[i][0/1/2/3/4]表示当前位置匹配了前0/1/2/3/4个以后的最小代价

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+;
int n,m,v[N],a[N],C[N];
ll f[N][],ans;
char s[N];
int main()
{
scanf("%d",&n);
scanf("%s",s+);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
C['h']=,C['a']=,C['r']=,C['d']=;
for(int i=;i<=n;i++)
if(C[s[i]])v[++m]=C[s[i]],a[m]=a[i];
for(int i=;i<=m;i++)for(int j=;j<;j++)f[i][j]=1e18;
for(int i=;i<=m;i++)
for(int j=;j<;j++)
{
if(j==v[i]-)f[i][j]=min(f[i][j],f[i-][j]+a[i]);
else f[i][j]=min(f[i][j],f[i-][j]);
if(j==v[i])f[i][j]=min(f[i][j],f[i-][j-]);
}
ans=1e18;
for(int j=;j<;j++)ans=min(ans,f[m][j]);
printf("%lld",ans);
}

Code D

E:本场切的人数最少的题,现场当然没有想到怎么做。由于是期望,肯定是求合法方案数/总方案数,总方案数好求就是一个组合数,考虑求合法方案数。由于总分、人数范围都比较小,考虑枚举Hasan的得分,然后进行计算即可。计算过程大概就是个容斥的过程。复杂度O(玄学),总之范围小能通过就行了。

#include<bits/stdc++.h>
using namespace std;
const int mod=;
int p,s,r,sum,c[][];
int qpow(int a,int b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%mod;
a=1ll*a*a%mod,b>>=;
}
return ret;
}
int calc(int n,int m,int x)
{
int ret=;
for(int i=;i<=m&&x*i<=n;i++)
{
int add=1ll*c[m][i]*c[n-x*i+m-][m-]%mod;
if(i&)ret=(ret-add+mod)%mod;
else ret=(ret+add)%mod;
}
return ret;
}
int main()
{
scanf("%d%d%d",&p,&s,&r);
if(p==){puts("");return ;}
for(int i=;i<=;i++)
{
c[i][]=;
for(int j=;j<=i&&j<=;j++)c[i][j]=(c[i-][j-]+c[i-][j])%mod;
}
for(int x=r;x<=s;x++)
if(x*p>=s)
for(int i=;i<=p;i++)
if(i*x<=s&&(p-i)*(x-)+x*i>=s)
{
if(i==p)sum=(sum+(x*i==s?qpow(i,mod-):))%mod;
sum=(sum+1ll*c[p-][i-]*calc(s-x*i,p-i,x)%mod*qpow(i,mod-))%mod;
}
sum=1ll*sum*qpow(c[s-r+p-][p-],mod-)%mod;
printf("%d",sum);
}

Code E

F:又是一道期望题,其实还是不太难,可以把答案分成三类:1、两者都在原有序列。2、两者都在-1上。3、一个在-1上一个在原有序列。第一类可以用归并排序求解逆序对,第二类直接记录状态f[i]=f[i-1]+(i-1)/2,考虑插入最大的即可。第三类也很好求,记录每个位置前面有多少空当,比当前数小的有几个数没有出现,这个都可以前缀和O(1)求得,然后枚举每个不为-1的位置,答案分成两部分:1、前面的空当数/总空当数*比该数大的没填的个数。2、后面的空当数/总空当数*比该数小的没填的个数。为什么呢?每个数分到前/后的机会是均等的,考虑随机性即可,不能把问题想复杂。复杂度O(nlogn),瓶颈在于归并排序

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+,mod=;
int n,m,ans,p[N],a[N],b[N],c[N],sp[N],sv[N],inv[N],f[N];
void merge(int l,int r)
{
if(l>=r)return;
int m=(l+r)/,i,j,n1=m-l+,n2=r-m;
merge(l,m);merge(m+,r);
for(i=;i<=n1;i++)b[i]=a[l+i-];
for(i=;i<=n2;i++)c[i]=a[m+i];
i=j=;b[n1+]=c[n2+]=1e9;
for(int k=l;k<=r;k++)
if(b[i]<=c[j])a[k]=b[i++];
else a[k]=c[j++],ans=(ans+n1-i+)%mod;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)sv[i]=;
for(int i=;i<=n;i++)
{
scanf("%d",&p[i]);
sp[i]=sp[i-];
if(p[i]>)a[++m]=p[i],sv[p[i]]=;
else sp[i]++;
}
for(int i=;i<=n;i++)sv[i]+=sv[i-];
inv[]=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]=(f[i-]+1ll*(i-)*inv[])%mod;
merge(,m);
ans=(ans+f[n-m])%mod;
for(int i=;i<=n;i++)
if(p[i]>)
{
int P=1ll*(sv[n]-sv[p[i]])*sp[i-]%mod*inv[sp[n]]%mod;
ans=(ans+P)%mod;
P=1ll*sv[p[i]-]*(sp[n]-sp[i])%mod*inv[sp[n]]%mod;
ans=(ans+P)%mod;
}
printf("%d",ans);
}

Code F

G:弱智题没写出来,第二天早上一看就会,是不是晚上智商有debuff水平低啊。题解:没什么好讲的,每次只有+指定是数才可以,n次可以NTT转移(我都想到了NTT还不会)没写出来的原因:想复杂问题,每次还倍增,硬生生的把复杂度从O(9nlogn)->O(9nlog2n),其实NTT(a,1)后,对a数组直接乘n次方再NTT(a,-1)就行了

#include<bits/stdc++.h>
using namespace std;
const int N=,p=;
int n,k,a[N],R[N],ans;
int qpow(int a,int b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%p;
a=1ll*a*a%p,b>>=;
}
return ret;
}
void NTT(int*a,int n,int typ)
{
for(int i=;i<n;i++)
{
R[i]=(R[i>>]>>)|((i&)*(n>>));
if(i<R[i])swap(a[i],a[R[i]]);
}
for(int i=;i<n;i<<=)
{
int wn=qpow(,typ*(p/(i*))+p-);
for(int j=;j<n;j+=i*)
for(int k=,w=;k<i;k++,w=1ll*w*wn%p)
{
int x=a[j+k],y=1ll*w*a[j+k+i]%p;
a[j+k]=(x+y)%p;
a[j+k+i]=(x-y+p)%p;
}
}
if(typ==)return;
int invn=qpow(n,p-);
for(int i=;i<n;i++)a[i]=1ll*a[i]*invn%p;
}
int main()
{
scanf("%d%d",&n,&k);
n/=;
for(int i=,x;i<=k;i++)scanf("%d",&x),a[x]=;
int nn=;
while(nn<=n*)nn<<=;
NTT(a,nn,);
for(int i=;i<nn;i++)a[i]=qpow(a[i],n);
NTT(a,nn,-);
for(int i=;i<=n*;i++)ans=(ans+1ll*a[i]*a[i])%p;
printf("%d",ans);
}

Code G

CF Educational Codeforces Round 57划水记的更多相关文章

  1. Educational Codeforces Round 17 颓废记

    又被虐了... (记一次惨痛的Codeforces) 好不容易登上去了Codeforces,22:35准时开打 第一题,一看:这不SB题嘛?直接枚举因数上啊.9min才过掉了pretest 第二题.. ...

  2. CF Educational Codeforces Round 10 D&period; Nested Segments 离散化&plus;树状数组

    题目链接:http://codeforces.com/problemset/problem/652/D 大意:给若干个线段,保证线段端点不重合,问每个线段内部包含了多少个线段. 方法是对所有线段的端点 ...

  3. CF Educational Codeforces Round 3 E&period; Minimum spanning tree for each edge 最小生成树变种

    题目链接:http://codeforces.com/problemset/problem/609/E 大致就是有一棵树,对于每一条边,询问包含这条边,最小的一个生成树的权值. 做法就是先求一次最小生 ...

  4. Educational Codeforces Round 57 &lpar;Rated for Div&period; 2&rpar;

    我好菜啊. A - Find Divisible 好像没什么可说的. #include<cstdio> #include<cstring> #include<algori ...

  5. Educational Codeforces Round 57 &lpar;Rated for Div&period; 2&rpar; ABCDEF题解

    题目总链接:https://codeforces.com/contest/1096 A. Find Divisible 题意: 给出l,r,在[l,r]里面找两个数x,y,使得y%x==0,保证有解. ...

  6. Educational Codeforces Round 57 &lpar;Rated for Div&period; 2&rpar; D dp

    https://codeforces.com/contest/1096/problem/D 题意 给一个串s,删掉一个字符的代价为a[i],问使得s的子串不含"hard"的最小代价 ...

  7. Educational Codeforces Round 57 &lpar;Rated for Div&period; 2&rpar; C 正多边形 &plus; 枚举

    https://codeforces.com/contest/1096/problem/C 题意 问是否存在一正多边形内三点构成的角度数为ang,若存在输出最小边数 题解 三点构成的角是个圆周角,假设 ...

  8. Educational Codeforces Round 57

    2018.12.28  22:30 看着CF升高的曲线,摸了摸自己的头发,我以为我变强了,直到这一场Edu搞醒了我.. 从即将进入2018年末开始,开启自闭场集合,以纪念(dian)那些丢掉的头发 留 ...

  9. CF&num; Educational Codeforces Round 3 F&period; Frogs and mosquitoes

    F. Frogs and mosquitoes time limit per test 2 seconds memory limit per test 512 megabytes input stan ...

随机推荐

  1. C&num; 实现一个可取消的多线程操作 示例

    private void button1_Click(object sender, EventArgs e) { //定义一个为可取消资源标志 CancellationTokenSource cts ...

  2. 纯CSS实现3D按钮效果

    今天分享一个用纯CSS实现的3D按钮.css巧妙利用了box-shadow来实现3D物体的立体感,当按钮按下的时候再去修改box-shadow和top值.让人感觉有一种按钮被按下的感觉.css代码非常 ...

  3. node&period;js基础 1之基本概念常识

    node.js 好牛逼的样子哦 很火,很腻害~~~~ 有关node.js的版本常识: 一般用最新的稳定版本,非稳定版本用于测试,其中包括api的不稳定等. 起一个web服务器: ndoejs可以自定义 ...

  4. STM32 USB CAN 学习笔记 - 共享RAM的用法

    USB 时钟可以一直使能. 如果CAN时钟没有使能,RAM 能被软件读写.(CANBus 不能发送和接受Message) 如果CAN时钟使能,RAM不能软件被写. CANBus Core 控制此RAM ...

  5. devexpress13学习系列(一)PDFViewer(2)

    DevExpress.XtraPdfViewer Namespace 该命名空间下,保留着pdfviewer组件需要的类,主要有:   Class Description   PdfCurrentPa ...

  6. usb协议分析-设备描述符配置包-描述符

    /* usb协议分析仅供大家参考---设备描述符配置包,设备描述符, 地址设置, 配置描述符, 字符串描述符 */ /* -1- usb设备描述符配置包 */ typedef struct _USB_ ...

  7. LeetCode OJ学习

    一直没有系统地学习过算法,不过算法确实是需要系统学习的.大二上学期,在导师的建议下开始学习数据结构,零零散散的一学期,有了链表.栈.队列.树.图等的概念.又看了下那几个经典的算法——贪心算法.分治算法 ...

  8. Unity NGUI 创建简单的按钮

    Unity版本:4.5.1 NGUI版本:3.6.5 注意NGUI版本,网上的大部分教程都是2.x版本的,在步骤上面略有不同,此文适合初学者. 示例: 通过NGUI创建一个背景和按钮. 1.首先创建一 ...

  9. oracle数据库表实现主键自增功能

    有关oracle中自增序列sequence+触发器trigger:实现数据表TABDATA_LIVE_CYCLE中的主键id的自增. CREATE SEQUENCE TABDATA_LIVE_CYCL ...

  10. sql查询语句报错处理——ERROR&colon; failed to find conversion function from unknown to text

    今天遇到写存储过程遇到的一个小问题,在查询语句中使用到了自定义的数当做列的值,然后想给这一列起一个别名 ,就直接在后面用了 as 别名.执行存储过程,存储过程报错,ERROR: failed to f ...