A:二分答案,从左往右考虑每个人,选尽量靠左的钥匙即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define int long long
#define N 2010
#define M 2010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m,p,a[N],b[M];
bool flag[M];
bool check(int k)
{
memset(flag,0,sizeof(flag));
for (int i=1;i<=n;i++)
{
bool f=0;
for (int j=1;j<=m;j++)
if (!flag[j]&&abs(a[i]-b[j])+abs(p-b[j])<=k)
{
flag[j]=1;
f=1;
break;
}
if (!f) return 0;
}
return 1;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read(),p=read();
for (int i=1;i<=n;i++) a[i]=read();
for (int i=1;i<=m;i++) b[i]=read();
sort(a+1,a+n+1);sort(b+1,b+m+1);
int l=0,r=2000000000,ans=0;
while (l<=r)
{
int mid=l+r>>1;
if (check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  B:暴力,每次找到下一张被扔出去的牌并累加距离(即翻几张牌后会翻到)即可,距离用树状数组维护。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 100010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],id[N],tree[N];
ll ans;
bool cmp(const int&x,const int&y)
{
return a[x]<a[y]||a[x]==a[y]&&x<y;
}
void add(int k,int x){while (k<=n) tree[k]+=x,k+=k&-k;}
int query(int k){int s=0;while (k) s+=tree[k],k-=k&-k;return s;}
int dis(int x,int y)
{
if (x<=y) return query(y)-query(x);
else return query(n)+query(y)-query(x);
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
for (int i=1;i<=n;i++) id[i]=i,a[i]=read();
sort(id+1,id+n+1,cmp);
for (int i=1;i<=n;i++) add(i,1);
int last=0;
for (int i=1;i<=n;i++)
{
int t=i;
while (t<n&&a[id[t+1]]==a[id[i]]) t++;
int p=i;
for (int j=i+1;j<=t;j++) if (dis(last,id[j])<dis(last,id[p])) p=j;
ans+=dis(last,id[p]),add(id[p],-1),last=id[p];
for (int j=p+1;j<=t;j++)
ans+=dis(last,id[j]),add(id[j],-1),last=id[j];
for (int j=i;j<p;j++)
ans+=dis(last,id[j]),add(id[j],-1),last=id[j];
i=t;
}
cout<<ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  C:不考虑d是某数因子的特殊情况的话,相当于要求nd-Σai mod d<=k,最大化d。而ai mod d=ai-⌊ai/d⌋*d,众所周知⌊ai/d⌋只有sqrt(ai)种取值。在所有⌊ai/d⌋都不变的一段区间内,最大的d可以很容易的算出来。于是暴力找出所有区间分割点(包括每个数的因数,因为不满足上述式子),对分割点暴力验证,区间内直接算出最大取值判一下是否合法即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 110
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N],t;
ll k,d,b[10000010];
void print(ll x){cout<<x;exit(0);}
bool check(ll x)
{
ll s=0;
for (int i=1;i<=n;i++)
if (a[i]%x) s+=x-a[i]%x;
return s<=k;
}
ll check(ll l,ll r)
{
if (l>r) return -1;
ll s=n,tot=0;
for (int i=1;i<=n;i++) s+=a[i]/l,tot+=a[i];
tot+=k;
if (tot/s>=l) return min(tot/s,r);
else return -1;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
cin>>n>>k;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++)
{
for (int j=1;j*j<=a[i];j++)
if (a[i]%j==0)
{
b[++t]=j;
if (j*j<a[i]) b[++t]=a[i]/j;
}
for (int j=1;j<=a[i];j++)
{
b[++t]=j;
j=a[i]/(a[i]/j);
}
}
sort(b+1,b+t+1);
t=unique(b+1,b+t+1)-b-1;b[++t]=1000000000000ll;
for (int i=t;i>=2;i--)
{
if (check(b[i])) print(b[i]);
if (check(b[i-1]+1,b[i]-1)>0) print(check(b[i-1]+1,b[i]-1));
}
cout<<1;
return 0;
//NOTICE LONG LONG!!!!!
}

  D:容易想到设f[i]为i层满二叉树的答案,由f[i-1]转移。但考虑一下容易发现无法处理由某子树走到根再走回该子树的情况。这个转移需要知道选两条不相交路径的方案数。要求出这个似乎又要知道选更多条不相交路径的方案数。

  那么自然的有设f[i][j]为i层满二叉树无序选j条不相交路径的方案数。看起来第二维状态是指数级别的,不过先不管这个。

  考虑转移。显然其中至多只有一条路径经过根。

  如果没有路径经过根,方案数为Σf[i-1][x]*f[i-1][j-x]。

  如果根是一个孤立路径,方案数为Σf[i-1][x]*f[i-1][j-x-1]。

  如果根是路径端点,方案数为Σf[i-1][x]*f[i-1][j-x]*2*j。

  如果根是由某子树走上去再走下来的,方案数为f[i-1][x]*f[i-1][j-x+1]*2*C(j+1,2)。

  和最开始的想法相同,求f[i][j]至多只会用到f[i-1][j+1]。最终我们要求f[n][1],我们中间需要用到的第二维状态并不会超过n。于是状态数n2,复杂度O(n3)。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 410
#define P 1000000007
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,f[N][N];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read();
f[1][0]=1;f[1][1]=1;
for (int i=2;i<=n;i++)
for (int j=0;j<=n;j++)
for (int x=0;x<=j+1;x++)
{
if (j>=x) inc(f[i][j],1ll*(2*j+1)*f[i-1][x]%P*f[i-1][j-x]%P%P);
if (j>x) inc(f[i][j],1ll*f[i-1][x]*f[i-1][j-x-1]%P);
inc(f[i][j],1ll*f[i-1][x]*f[i-1][j-x+1]%P*(j+1)%P*j%P);
}
cout<<f[n][1];
return 0;
//NOTICE LONG LONG!!!!!
}

  

Codeforces Round #424 Div. 1的更多相关文章

  1. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)

    http://codeforces.com/contest/831 A. Unimodal Array time limit per test 1 second memory limit per te ...

  2. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals)A,B,C

    A:链接:http://codeforces.com/contest/831/problem/A 解题思路: 从前往后分别统计递增,相等,递减序列的长度,如果最后长度和原序列长度相等那么就输出yes: ...

  3. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem F (Codeforces 831F) - 数论 - 暴力

    题目传送门 传送门I 传送门II 传送门III 题目大意 求一个满足$d\sum_{i = 1}^{n} \left \lceil \frac{a_i}{d} \right \rceil - \sum ...

  4. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划

    There are n people and k keys on a straight line. Every person wants to get to the office which is l ...

  5. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem E (Codeforces 831E) - 线段树 - 树状数组

    Vasily has a deck of cards consisting of n cards. There is an integer on each of the cards, this int ...

  6. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem C (Codeforces 831C) - 暴力 - 二分法

    Polycarp watched TV-show where k jury members one by one rated a participant by adding him a certain ...

  7. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem A - B

    Array of integers is unimodal, if: it is strictly increasing in the beginning; after that it is cons ...

  8. 【Codeforces Round #424 (Div. 2) A】Unimodal Array

    [Link]:http://codeforces.com/contest/831/problem/A [Description] 让你判断一个数列是不是这样一个数列: 一开始是严格上升 然后开始全都是 ...

  9. 【Codeforces Round #424 (Div. 2) B】Keyboard Layouts

    [Link]:http://codeforces.com/contest/831/problem/B [Description] 两个键盘的字母的位置不一样; 数字键的位置一样; 告诉你第一个键盘按某 ...

  10. 【Codeforces Round #424 (Div. 2) C】Jury Marks

    [Link]:http://codeforces.com/contest/831/problem/C [Description] 有一个人参加一个比赛; 他一开始有一个初始分数x; 有k个评委要依次对 ...

随机推荐

  1. 【原创】自己动手写一个能操作redis的客户端

    引言 redis大家在项目中经常会使用到.官网也提供了多语言的客户端供大家操作redis,如下图所示 但是,大家有思考过,这些语言操作redis背后的原理么?其实,某些大神会说 只要按照redis的协 ...

  2. 助力ASP.NET Core 2.1开发!Layx 企业级弹窗插件发布!

    我们在开发B/S架构企业管理系统时经常用到弹窗.目前市场上主要有两大弹窗:layer/artdialog,这两款做的都非常的棒.由于我们ERP系统比较复杂.需要能够拥有和Windows弹窗一样的弹窗组 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简述及技术选型介绍

    作者:13GitHub:https://github.com/ZHENFENG13版权声明:本文为原创文章,未经允许不得转载. 萌芽阶段 很久之前就开始打算整理一下自己的技术博客了,由于各种原因(借口 ...

  4. javaMail发邮件,激活用户账号

    用javamail实现注册用户验证邮箱功能.用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数.发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和 ...

  5. 机器学习第一篇——最近邻kNN

    机器学习监督学习中,根据解决问题的连续性和离散型,分为分类问题和回归问题.最邻近算法kNN是一种最为直接和简便的分类方法. kNN本质上,是计算目标到模型的欧式距离,从而判定目标所属的类别. 首先,在 ...

  6. (第十三周)评论Final发布II

    按课上展示的顺序对每组进行点评:(性能.功能.UI.部署) 1.  Nice! 项目:约跑软件 软件操作的响应很快,俩人进行聊天时可以实现消息的及时传递.功能主要有:注册账号.登录.创建/删除跑步计划 ...

  7. Continued Fractions CodeForces - 305B (java+高精 / 数学)

    A continued fraction of height n is a fraction of form . You are given two rational numbers, one is ...

  8. scrapy之管道

    scrapy之管道 通过管道将数据持久化到数据库中,企业中常见的数据库是MySQL,分布式爬取数据时只能讲数据存储到Redis装,还可以将数据存储到本地磁盘(即写入到本地文件中). 未完待续... 0

  9. 在tomcat8.0.x和tomcat9.0.x之间么突然冒出个tomcat 8.5

    Apache Tomcat 8 (8.5.38) - Documentation Indexhttps://tomcat.apache.org/tomcat-8.5-doc/index.html to ...

  10. 一、npm基础

    一.什么是npm? npm 是模块管理工具,可以下载.更新第三方模块,也可以发布自己的模块共替他人使用,主要目的在于分享和重用代码: 二.下载安装node,更新npm node 下载网址  https ...