C题卡了好久,A掉C题之后看到自己已经排在好后面说实话有点绝望,最后又过了两题,总算稳住了。

AC:ABCDE Rank:191 Rating:2156+37->2193

A.Oath of the Night's Watch

题目大意:给定N个数,求有多少个数存在严格比它大的数和严格比它小的数。(N<=100,000)

思路:阅读能力训练+手速,排序一遍就没了。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
int a[MN+];
int main()
{
fread(B,,<<,stdin);
int n=read(),i,ans=;;
for(i=;i<=n;++i)a[i]=read();
sort(a+,a+n+);
for(i=;i<=n;++i)if(a[i]!=a[]&&a[i]!=a[n])++ans;
printf("%d",ans);
}

B.Code For 1

题目大意:一开始有一个数N,每次能把一个大于1的数x拆成x/2,x%2,x/2(除法向下取整),拆到不能拆时停止,问最后拆出来的01序列的[l,r]中有几个1。(0<=n<2^50,0<=r-l<=10^5,r>=1,l>=1,r不超过最终拆出序列的长度)

思路:可以logN预处理出N能拆出的所有数最后拆完的长度,然后分治,每次把[l,r]分到拆出的三段里,最后复杂度大约是O((r-l)logN)。

#include<iostream>
#include<map>
#define ll long long
using namespace std;
map<ll,ll> mp;
int ans;
ll cal(ll x)
{
if(mp[x])return mp[x];
return mp[x]=cal(x>>)+cal(x&)+cal(x>>);
}
void work(ll x,ll l,ll r)
{
if(x<){if(x)++ans;return;}
ll mid=mp[x>>];
if(r<=mid)work(x>>,l,r);
else if(l<=mid)work(x>>,l,mid);
if(l<=mid+&&r>=mid+)work(x&,,);
if(l>mid+)work(x>>,l-mid-,r-mid-);
else if(r>mid+)work(x>>,,r-mid-);
}
int main()
{
ll n,l,r;
cin>>n>>l>>r;
mp[]=mp[]=;cal(n);
work(n,l,r);
cout<<ans;
}

C.Jon Snow and his Favourite Number

题目大意:给定N,k,x和N个数,每次操作把N个数排序,排在奇数位的异或上x,重复k次操作,问最终序列的最大值和最小值。(1<=N<=10^5,0<=k<=10^5,0<=x<=10^3,序列中元素小等于10^3)

思路:一开始往奇怪的方向想,例如做几次操作后就会开始循环,然后考虑暴力做几次操作,想优化一下暴力,发现序列元素特别小,可以计数排序……然后猛然发现只要存1024种元素的个数每次分下奇偶暴力做就可以了……并不需要什么结论,而且时限有4s,应该比较科学。复杂度O(N+1024k)。另外cf机子真的快,理论上上亿次运算最慢的只跑了200ms+(PP的时候显示的233ms,是不是被嘲讽了?)(另外一提,我家机子要4秒……)。

#include<cstdio>
#include<cstring>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 100000
int a[][];
int main()
{
fread(B,,<<,stdin);
int n,k,x,i,p,q,l;
n=read();k=read();x=read();
for(i=;i<=n;++i)++a[][read()];
for(p=,q=;k--;p^=,q^=)
{
memset(a[p],,sizeof(a[p]));
for(i=l=;i<;++i)
{
a[p][i]+=a[q][i]+l>>;
a[p][i^x]+=a[q][i]+(l^)>>;
l^=a[q][i]&;
}
}
for(i=;i--;)if(a[q][i])break;printf("%d ",i);
for(i=;i<;++i)if(a[q][i])break;printf("%d",i);
}

D.Jon and Orbs

题目大意:k种数,每次取会等概率取到其中一种,q次询问,每次给出一个pi,要求求出最少取几次后每种数至少取到一次的概率至少pi/2000(题目中怕你被卡精度写的(pi-eps)/2000,eps<1e-7,好良心啊)(1<=k,q,pi<=1000)。

思路:概率DP,f[i][j]表示取i个取到j种不同元素的概率,再取一个有j/k的概率取到取过的,有(k-j)/k的概率取到没取过的,初始化f[0][0]=1,然后递推就可以了。发现最大的数据k=1000,pi=1000时只要取7000多个,然后随便做了。(好像以前见过这道题,当时naive怎么想都不会,现在已经变成水题了……)

#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
#define MN 1000
double f[MN*+][MN+];
int main()
{
fread(B,,<<,stdin);
int k=read(),q,i,j,x;
for(f[][]=i=;i<=;++i)for(j=;j<=i&&j<=k;++j)
{
f[i+][j]+=f[i][j]*j/k;
f[i+][j+]+=f[i][j]*(k-j)/k;
}
for(q=read();q--;)
{
x=read();
for(i=;i<=;++i)if(f[i][k]>=(x-1e-)/)break;
printf("%d\n",i);
}
}

E.Game of Stones

题目大意:N堆石子,每堆石子有si个,两个玩家轮流取石子,每次可以取走一堆中任意正整数个,不能取的算输,有一个限制条件是同一堆中不能两次取走相同数量的石子,求最优策略下先手必胜还是必败。(N<=1,000,000,1<=si<=60)。

思路:博弈论的题我不是很熟悉,看了几眼就先去看F了,想了很久F不会又滚回来做E,幸好还模糊记得博弈论那套理论,只要求出每一堆的SG值全部异或起来就可以了。发现si<=60很可怕,能不能打打表之类的?想了想,每堆的SG值好像就是最多能拆出几种不同的正整数……因为可以把拆出的最大的k种删掉得到SG值小k的情况而对后面没有影响。得出这个结论的我是巨虚无比的,因为我只要O(maxsi)就能求出各种si的SG值,而maxsi只有60……怀着试试和这个WA了反正我也想不出其他做法的心态交了一发,结果cf当时评测队列好像出了点问题,没即时显示,我只好继续肝F,肝着突然发现这题PP了,最后也AC了,不知道这个60的数据范围到底是哪里冒出来的啊?最终复杂度O(N+maxsi)。

#include<cstdio>
char B[<<],*S=B,C;int X;
inline int read()
{
while((C=*S++)<''||C>'');
for(X=C-'';(C=*S++)>=''&&C<='';)X=(X<<)+(X<<)+C-'';
return X;
}
int f[];
int main()
{
fread(B,,<<,stdin);
int n=read(),i,j,k,ans=;
for(i=;i<=;++i)
for(j=i*(i+)/;j<=&&j<(i+)*(i+)/;++j)f[j]=i;
for(i=;i<=n;++i)ans^=f[read()];
puts(ans?"NO":"YES");
}

F.Barrels and boxes

题目大意:N个A物品,M个B物品,把所有A物品堆成若干堆,所有B物品堆成若干堆,相间地排成一列(如ABAB、BAB等)求每堆B物品中B物品数量都超过H的概率(对1e9+7取模)。(N,M,H<=100,000,N+M>0)

思路:做的时候看错题意,看题解的时候才发现,无比尴尬(我以为是求至少一堆超过H),然后才发现是SB题。题目相当于把A和B随意排列,然后相邻的同种物品并成一堆,先把A排开,然后相当于有N+1个空位给我们塞B,枚举塞几堆B,每堆B我们先强制扣掉H,直接排列组合计算,方案数即为Σ(C(M-i*H-1,i-1)*C(N+1,i)),总方案数令H=0再算一遍就能知道概率了,注意特判M=0。交的第一发阶乘只预处理到100,000然后WA了,发现有个N+1,要多预处理一位……

#include<cstdio>
#define MN 100001
#define MOD 1000000007
int f[MN+],r[MN+];
int C(int n,int m){return 1LL*f[n]*r[m]%MOD*r[n-m]%MOD;}
int inv(int x)
{
int t=x,y=MOD-;
for(;y;t=1LL*t*t%MOD,y>>=)if(y&)x=1LL*x*t%MOD;
return x;
}
int cal(int n,int m,int p)
{
if(!m)return ;
int r=,i;
for(i=;i<=n+&&i*(p+)<=m;++i)
r=(r+1LL*C(m-i*p-,i-)*C(n+,i))%MOD;
return r;
}
int main()
{
int n,m,p,i,x=,y=;
for(f[]=i=;i<=MN;++i)f[i]=1LL*f[i-]*i%MOD;
for(r[i=MN]=inv(f[MN]);i--;)r[i]=1LL*r[i+]*(i+)%MOD;
scanf("%d%d%d",&n,&m,&p);
printf("%d",1LL*cal(n,m,p)*inv(cal(n,m,))%MOD);
}

Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined)的更多相关文章

  1. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) D. Jon and Orbs

    地址:http://codeforces.com/contest/768/problem/D 题目: D. Jon and Orbs time limit per test 2 seconds mem ...

  2. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C - Jon Snow and his Favourite Number

    地址:http://codeforces.com/contest/768/problem/C 题目: C. Jon Snow and his Favourite Number time limit p ...

  3. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1

    地址:http://codeforces.com/contest/768/problem/B 题目: B. Code For 1 time limit per test 2 seconds memor ...

  4. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A. Oath of the Night's Watch

    地址:http://codeforces.com/problemset/problem/768/A 题目: A. Oath of the Night's Watch time limit per te ...

  5. Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) A B 水 搜索

    A. Oath of the Night's Watch time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. 【博弈论】【SG函数】【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) E. Game of Stones

    打表找规律即可. 1,1,2,2,2,3,3,3,3,4,4,4,4,4... 注意打表的时候,sg值不只与剩下的石子数有关,也和之前取走的方案有关. //#include<cstdio> ...

  7. 【概率dp】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) D. Jon and Orbs

    直接暴力dp就行……f(i,j)表示前i天集齐j种类的可能性.不超过10000天就能满足要求. #include<cstdio> using namespace std; #define ...

  8. 【基数排序】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) C. Jon Snow and his Favourite Number

    发现值域很小,而且怎么异或都不会超过1023……然后可以使用类似基数排序的思想,每次扫一遍就行了. 复杂度O(k*1024). #include<cstdio> #include<c ...

  9. 【找规律】Divide by Zero 2017 and Codeforces Round #399 (Div. 1 + Div. 2, combined) B. Code For 1

    观察一下,将整个过程写出来,会发现形成一棵满二叉树,每一层要么全是0,要么全是1. 输出的顺序是其中序遍历. 每一层的序号形成等差数列,就计算一下就可以出来每一层覆盖到的区间的左右端点. 复杂度O(l ...

随机推荐

  1. 冲刺NO.10

    Alpha冲刺第十天 站立式会议 项目进展 项目核心功能逐步构建完成,测试工作也已开始.主要对部分功能组合进行测试以测试系统可用性. 问题困难 项目的主要困难在这个时间点主要存在于测试工作中,测试工作 ...

  2. Dijkstra算法课后补分博客

    题目名称:Dijkstra算法 题目要求:课上给出相关附图,求解附图顶点A的单源最短路径. 附图: 做题过程 1.了解Dijkstra算法的相关知识,包括定义以及使用方法. 定义:Dijkstra算法 ...

  3. 【iOS】Swift if let 和 if var

    if let unwrappedOptional = postDict { print("The optional has a value! It's \(unwrappedOptional ...

  4. GPUImage实战问题解决

    在项目中遇到了使用完GPUImage以后,内存不释放的问题,翻阅官方API,找到了解决方法: deinit{ GPUImageContext.sharedImageProcessingContext( ...

  5. 《高级软件测试》web测试实践--12月30日记录

    考完数学,我们正式开始web测试实践的作业,今天,我们主要进行了方案的选择和人员的分工.任务计划和安排如上图所示. 任务进展:完成题目选择和人员分工: 遇到问题:暂无: 下一步任务:完成软件评测.用户 ...

  6. linux的脚本应用for循环答应变量

    #!/bin/bash for var in A B C ; do echo "var is $var" done

  7. Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇——多页面VueSSR+热更新Server)

    Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(下篇--多页面VueSSR+热更新Server) @(HTML/JS) 这是Vue多页面框架系列文章的第二篇,上一篇(纯前 ...

  8. js 过多 导致页面加载过慢

    自己的代码检查了很久,才检查 出来 通常我们的网站里面会加载一些js代码,统计啊,google广告啊,百度同盟啊,阿里妈妈广告代码啊, 一堆,最后弄得页面加载速度很慢,很慢. 解决办法:换一个js包含 ...

  9. 【笔记】HybridApp中使用Promise化的JS-Bridge

    背景: HybridApp,前端采用JS-bridge的方式调用Native的接口,如获取设备信息.拍照.人脸识别等 前端封装了调用库,每次调用Native接口,需要进行两步操作(1.在window下 ...

  10. 大数据学习总结(7)we should...

    大数据场景一.各种标签查询 查询要素:人.事.物.单位 查询范围:A范围.B范围.... 查询结果:pic.name.data from 1.痛点:对所有文本皆有实时查询需求2.难点:传统SQL使用W ...