2020牛客寒假算法基础集训营1

这套题整体来说还是很简单的。

A.honoka和格点三角形

这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2,

注意底边1和2会有重复的,所以要注意去除这个重复部分的。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
typedef long long ll;
const int mod=1e9+;
int main(){
ll n,m,ans=;
scanf("%lld%lld",&n,&m);
ans=*(m-)%mod*m%mod*(n-)%mod;
ans+=*(n-)%mod*n%mod*(m-)%mod;
ans+=*(m-)%mod*(m-)%mod*(n-)%mod;
ans+=*(n-)%mod*(n-)%mod*(m-)%mod;
ans%=mod;
printf("%lld\n",ans);
return ;
}

A

B.kotori和bangdream

这个题目也很简单,因为每一个音符的概率都是确定的。。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
typedef long long ll; int main(){
int n,x,a,b;
cin>>n>>x>>a>>b;
double ans=n*x*a+n*(-x)*b;
ans/=100.0;
printf("%.2f\n",ans);
return ;
}

B

C.umi和弓道

这个可能看起来稍微复杂一点,不过整体还是很简单,

把所有可以投影到y轴的投影到y轴,可以投影到x轴的投影到x轴。

然后排个序,求长度最短的n-k个点。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+;
typedef long long ll;
long double dx[maxn],dy[maxn];
long double x[maxn],y[maxn];
int judge(ll x,ll y){
if(x>&&y>) return ;
if(x<&&y>) return ;
if(x<&&y<) return ;
if(x>&&y<) return ;
}
int main(){
ll n,k;
long double x0,y0;
scanf("%Lf%Lf%lld%lld",&x0,&y0,&n,&k);
int f=judge(x0,y0);
int num=,numx=,numy=;
for(int i=;i<=n;i++){
scanf("%Lf%Lf",&x[i],&y[i]);
int ans=judge(x[i],y[i]);
if(ans==f) num++;
else if(x0*x[i]>) numx++;
else if(y0*y[i]>) numy++;
}
if(num+numx>k&&num+numy>k){
printf("-1\n");
return ;
}
int cntx=,cnty=;
for(int i=;i<=n;i++){
if(x[i]*x0<){
// cout<<"i="<<i<<" x[i]="<<x[i]<<" y[i]="<<y[i]<<endl;
dy[++cnty]=(y0-y[i])/(x0-x[i])*(-x0)+y0;
// printf("dy[%d]=%Lf\n",cnty,dy[cnty]);
}
if(y0*y[i]<){
dx[++cntx]=(x0-x[i])/(y0-y[i])*(-y0)+x0;
}
}
int res=n-k;
sort(dy+,dy++cnty);
sort(dx+,dx++cntx);
long double ans=2e9;
for(int i=res;i<=cntx;i++){
// printf("dx[%d]=%Lf\n",i,dx[i]);
ans=min(ans,dx[i]-dx[i-res+]);
}
for(int i=res;i<=cnty;i++){
// printf("dy[%d]=%Lf dy[%d]=%Lf\n",i,dy[i],i-res+1,dy[i-res+1]);
ans=min(ans,dy[i]-dy[i-res+]);
}
printf("%.6Lf\n",ans);
return ;
}

C

D.hanayo和米饭

这个太签到了

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
typedef long long ll; int vis[maxn]; int main(){
int n;
scanf("%d",&n);
for(int i=;i<n;i++){
int x;
scanf("%d",&x);
vis[x]=;
}
for(int i=;i<=n;i++){
if(!vis[i]){
printf("%d\n",i);
return ;
}
}
}

D

E.rin和快速迭代

这个题目f函数其实求的就是约数的个数,这个还是很好求的,

把这个数唯一分解,x=p1^a1*p2^a2*....*pn^an

那么这个数的约数的个数就是 num=(a1+1)*(a2+1)*...*(an+1)

这个就暴力求就可以了。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+;
typedef long long ll;
const int mod=1e9+;
ll v[maxn],isp[maxn],m;
void init1()
{
for(int i=;i<maxn;i++){
if(v[i]==){
isp[m++]=i;
v[i]=i;
}
for(int j=;j<m;j++){
if(v[i]<isp[j]||i*isp[j]>maxn) break;
v[i*isp[j]]=isp[j];
}
}
}
ll judge(ll x){
ll ans=,p=;
for(int i=;i<m;i++){
while(x%isp[i]==){
// printf("isp[%d]=%d\n",i,isp[i]);
p++,x/=isp[i];
}
ans*=p,p=;
if(x==) break;
}
if(x>) ans*=;
// printf("x=%lld ans=%lld\n",x,ans);
return ans;
} int main(){
init1();
ll n,res=;
scanf("%lld",&n);
while(n>) n=judge(n),res++;
printf("%lld\n",res);
return ;
}

E

F.maki和tree

这个题目我觉得我写的挺复杂的,

我是先预处理出白色块的连通块。

然后对于每一个黑块去枚举它周围的白色连通块。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
typedef long long ll;
struct node{
int v,nxt;
node(int v=,int nxt=):v(v),nxt(nxt){}
}e[maxn*];
int head[maxn],cnt;
void add(int u,int v){
e[++cnt]=node(v,head[u]);
head[u]=cnt;
e[++cnt]=node(u,head[v]);
head[v]=cnt;
}
int f[maxn],sum[maxn];
char s[maxn];
void dfs(int u,int pre){
f[u]=pre,sum[u]=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==pre) continue;
dfs(v,u);
if(s[u]!='B'&&s[v]!='B') sum[u]+=sum[v];
}
}
void dfs1(int u,int pre){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==pre) continue;
if(s[u]!='B'&&s[v]!='B') sum[v]=max(sum[v],sum[u]);
dfs1(v,u);
}
}
ll ans=;
void dfsans(int u,int pre){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(v==pre) continue;
dfsans(v,u);
}
if(s[u]!='B') return ;
ll all=;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].v;
if(s[v]=='B') continue;
all+=sum[v];
ans-=sum[v]*(sum[v]-)/;
}
ans+=all*(all-)/;
}
int main(){
int n;
scanf("%d%s",&n,s+);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
dfs(,-),dfs1(,-);
dfsans(,-);
printf("%lld\n",ans);
}

F

G.eli和字符串

这个题目很简单,直接暴力枚举26个字母即可。

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=2e5+;
typedef long long ll;
char s[maxn];
int num[],pos[][maxn];
int main(){
int n,k;
scanf("%d%d%s",&n,&k,s+);
int slen=strlen(s+);
for(int i=;i<=slen;i++){
int x=s[i]-'a';
num[x]++;
pos[x][num[x]]=i;
}
int ans=inf;
for(int i=;i<;i++){
if(num[i]<k) continue;
int cnt=;
for(int j=k;j<=num[i];j++) ans=min(ans,pos[i][j]-pos[i][j-k+]+);
}
if(ans>=inf) ans=-;
printf("%d\n",ans);
return ;
}

G

H.nozomi和字符串

这个是一个二分,二分最大长度即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
typedef long long ll;
const int mod=1e9+;
char s[maxn];
int n,k,slen;
int num[][maxn];
bool check(int x){
for(int i=x;i<=slen;i++){
int len0=num[][i]-num[][i-x];
int len1=num[][i]-num[][i-x];
if(len0<=k||len1<=k) return true;
}
return false;
}
int main(){
scanf("%d%d%s",&n,&k,s+);
slen=strlen(s+);
for(int i=;i<=slen;i++){
num[][i]=num[][i-];
num[][i]=num[][i-];
num[s[i]-''][i]++;
}
int l=,r=n,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d\n",ans);
return ;
}

H

I.nico和niconiconi

这个是一个dp,注意细节的处理。

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+;
typedef long long ll;
char cur[]={'n','i','c','o'},s[maxn];
ll dp[maxn];
int main(){
ll n,a,b,c;
scanf("%lld%lld%lld%lld%s",&n,&a,&b,&c,s+);
for(int i=;i<=n;i++){
dp[i]=max(dp[i-]+a,dp[i]);
if(i>=) dp[i]=max(dp[i],dp[i-]+b);
if(i>=) dp[i]=max(dp[i],dp[i-]+c);
}
ll ans=;
int num=,pos=,slen=strlen(s+);
s[++slen]='~';
for(int i=;i<=slen;i++){
if(s[i]==cur[pos]) {
pos++;
if(pos==) num++,pos=;
}
else{
ll res=dp[num];
if(pos>=){
if(num>=) res=max(dp[num-]+b,res);
if(num>=) res=max(dp[num-]+c,res);
}
ans+=res,num=,pos=;
if(s[i]==cur[pos]) pos++;
}
}
printf("%lld\n",ans);
return ;
}
/*
19 1 2 5
niconiconiniconico
*/

I

J.u's的影响力

这个推一下就会发现,x和y的指数都是斐波那契数列的一项,a^b的指数是斐波那契数列的前缀和。

所以都可以用矩阵快速幂解决,斐波那契数列前缀和也可以用矩阵快速幂解决。

推荐资料:大斐波拉契数列及斐波拉契前缀和(m阶前缀和)求解

斐波那契数列总(这个挺好的)

但是这个还有几个点需要注意,第一个:斐波那契数列求的是指数,所以不可以直接对mod取模,而是要对mod-1取模,因为费马小定理。

ap-1 mod p == 1 所以只可以对p-1取模。

第二个就是a是p的倍数时,不满足费马小定理,这个要分开考虑。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const long long mod = 1e9+; int UP;
struct mat
{
long long mn[][];
mat() {
for(int i = ;i<UP;i++) {
for(int j = ;j<UP;j++) {
mn[i][j]=;
}
}
for(int i = ;i<UP;i++) {
mn[i][i] = ;
}
}
void init(){
for(int i=;i<UP;i++){
for(int j=;j<UP;j++){
mn[i][j]=;
}
}
}
mat operator * (const mat& a) {
mat res;
for(int i = ;i<UP;i++) {
res.mn[i][i] = ;
}
for(int i=;i<UP;i++) {
for(int j=;j<UP;j++) {
for(int k=;k<UP;k++) {
res.mn[i][j] += mn[i][k]*a.mn[k][j]%(mod-);
res.mn[i][j] %= (mod-);
}
}
}
return res;
}
}; mat fast(mat a,long long c) {
mat res = mat();
while(c) {
if(c&) res = res * a;
a = a*a;
c >>= ;
}
return res;
}
ll quick_mul(ll a,ll b,ll mod)
{
ll ans = ;
while(b)
{
if (b & ) ans = (ans + a) % mod;
a = (a + a) % mod;
b >>= ;
}
return ans;
} ll quick_pow(ll a,ll b,ll mod)
{
ll ans = ;
while(b)
{
if (b & ) ans = quick_mul(ans, a, mod);
a = quick_mul(a, a, mod);
b >>= ;
}
return ans;
}
int main(){
UP=;
ll n,x,y,a,b;
scanf("%lld%lld%lld%lld%lld",&n,&x,&y,&a,&b);
if(n==) {
printf("%lld\n",x%mod);
return ;
}
if(n==){
printf("%lld\n",y%mod);
return ;
}
if(x%mod==||y%mod==||a%mod==){
printf("0\n");
return ;
}
mat res;res.init();
res.mn[][]=,res.mn[][]=res.mn[][]=res.mn[][]=;
res=fast(res,n-);
x=quick_pow(x,res.mn[][],mod);
y=quick_pow(y,res.mn[][],mod);
a%=mod,a=quick_pow(a,b,mod);
UP=,res.init();
res.mn[][]=res.mn[][]=res.mn[][]=;
res.mn[][]=res.mn[][]=res.mn[][]=;
res=fast(res,n-);
a=quick_pow(a,res.mn[][]+res.mn[][],mod);
printf("%lld\n",quick_mul(quick_mul(a,x,mod),y,mod));
return ;
}

J

2020牛客寒假算法基础集训营1 J题可以回顾回顾的更多相关文章

  1. 2020牛客寒假算法基础集训营2 J题可以回顾回顾

    2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...

  2. 2020牛客寒假算法基础集训营2 J.求函数 (线段树 推公式 单点修改 区间查询)

    https://ac.nowcoder.com/acm/contest/3003/J 题解: #include<bits/stdc++.h> typedef long long ll; u ...

  3. 2020牛客寒假算法基础集训营1 J. 缪斯的影响力 (矩阵快速幂/费马小定理降幂)

    https://ac.nowcoder.com/acm/problem/200658 f(n) = f(n-1) * f(n-2) * ab ,f的第一项是x,第二项是y. 试着推出第三项是x·y·a ...

  4. 2020牛客寒假算法基础集训营4 J 二维跑步

    https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43035417 假设有i步选择不动,就有n-i步移动 假设其中又有a ...

  5. 2020牛客寒假算法基础集训营4-F树上博弈

    链接:https://ac.nowcoder.com/acm/contest/3005/F来源:牛客网 题目描述 现有一个 n 个点,n-1条边组成的树,其中 1 号点为根节点. 牛牛和牛妹在树上玩游 ...

  6. 2020牛客寒假算法基础集训营4-I 匹配星星【贪心】

    链接:https://ac.nowcoder.com/acm/contest/3005/I来源:牛客网 示例1 输入 复制 2 1 1 0 2 2 1 2 1 1 0 2 2 1 输出 复制 1 1 ...

  7. 2020牛客寒假算法基础集训营1 F-maki和tree

    链接:https://ac.nowcoder.com/acm/contest/3002/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  8. 牛客寒假算法基础集训营4 I题 Applese 的回文串

    链接:https://ac.nowcoder.com/acm/contest/330/I 来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如--判断一个字符串是不是回文串. ...

  9. 牛客寒假算法基础集训营5 J 炫酷数学

    链接:https://ac.nowcoder.com/acm/contest/331/J来源:牛客网 小希最近想知道一个东西,就是A+B=A|B(其中|为按位或)的二元组有多少个. 当然,直接做这个式 ...

随机推荐

  1. AJ学IOS 之微博项目实战(2)微博主框架-自定义导航控制器NavigationController

    AJ分享,必须精品 一:添加导航控制器 上一篇博客完成了对底部的TabBar的设置,这一章我们完成自定义导航控制器(NYNavigationController). 为啥要做自定义呢,因为为了更好地封 ...

  2. 知识点一:OSI模型初识

    OSI(开放系统)模型是一组协议的集合,它使得两个不同的系统之间能够互相通信,分为七层 第一层:物理层 物理层负责把逐个的比特(01)从一个节点移动到下个节点 具体体现在如何把比特转换成电或者光信号. ...

  3. Map使用foreach遍历方式,Map获取第一个键值

    List<Map<String, Object>> mapList = new ArrayList<>();  for (Map.Entry<String,O ...

  4. L10机器

    机器翻译和数据集 机器翻译(MT):将一段文本从一种语言自动翻译为另一种语言,用神经网络解决这个问题通常称为神经机器翻译(NMT). 主要特征:输出是单词序列而不是单个单词. 输出序列的长度可能与源序 ...

  5. C - Mind Control CodeForces - 1291C

    菜到家了,题意都读不懂. 题目大意: 总共有n个人和n个数字 n个人拍成一队,n个数字也是有顺序的 你排在第m个位置 按照顺序的每个人可以拿走这个序列中的第一个数字或者最后一个数字 你可以在所有人操作 ...

  6. 百度关键词搜索工具 v1.1|url采集工具 v1.1

    功能介绍:关键词搜索工具 批量关键词自动搜索采集 自动去除垃圾二级泛解析域名 可设置是否保存域名或者url 持续更新中

  7. mongo基础

    以下如有任何问题,直接到官方操作文档左上角搜索框搜索 安装 On Windows, this path is on the drive from which you start MongoDB. Fo ...

  8. 漫谈LiteOS之开发板-LiteOS移植(基于GD32450i-EVAL)

    1 为什么移植? 嵌入式设备的芯片型号和外设的差异较大,资源有限.而RTOS无法适配集成所有的驱动,因此会先适配部分开发板,然后通过移植使得适配更多的开发板. 可移植性是嵌入式操作系统与普通操作系统的 ...

  9. 最简单的懒人springcloud之Eureka(服务注册与发现)

    本文开发软件是STS,是eclipse为springboot项目而生的一个软件,用这个软件开发spring的项目版本都会自己对应的,话不多说直接上代码 springboot版本2.1.8.RELEAS ...

  10. GoJS 教程新手入门(资源整理,解决方案)

    以下几个是我在百度.谷歌 上能找到的比较全的GoJs的一些东西,希望对各位有所帮助! 如有外网网站不能访问请自行FQ GoJS官网 第一个推荐的是GoJS的一个类似于社区的问题讨论区,这里面初学者的一 ...