文章目录

  • A题
  • B题
  • C题
  • D题
  • E题
  • F题
  • G题

传送门
GGG题略难,膜了一波 zhouyuyang{\color{red} zhouyuyang}zhouyuyang巨佬的代码。
其余都挺清真的。


A题

传送门
题意:你有sss元钱,现在每颗糖ccc元,每买aaa颗会送你bbb颗,问最多买几颗糖。


思路:按照题意模拟。
代码:

#include<bits/stdc++.h>
#define ri register int
#define int long long
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef long long ll;
signed main(){for(ri s,a,b,c,tt=read();tt;--tt){s=read(),a=read(),b=read(),c=read();cout<<(ll)s/c/a*(a+b)+((s-s/c/a*c*a)/c)<<'\n';}return 0;
}

B题

传送门
题意:给你nnn个点mmm条边让你随意构造无向图,称度为000的点为孤立点,问孤立点数量的最小值和最大值。


思路:
要使得数量最小显然每两个点连一条边,数量最大的话显然尽量拿去建完全图,随便判一判就完了。
注意m读入可能会爆int!!!233333333333
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
typedef long long ll;
inline ll read(){ll ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
signed main(){ll n=read(),m=read();cout<<max(0ll,n-m*2)<<' ';for(ll i=0;;++i){if(i*(i-1)/2<m)continue;cout<<n-i;break;}return 0;
}

C题

传送门
题意:给你一排积木,没个积木有高度hih_ihi​。
让你每次指定一个高度把所有高于它的部分都砍掉,每次砍的代价是砍掉的所有高度之和,问如果每次砍的代价都不能超过给定的kkk最少砍几次。


思路:考虑时间倒流,改为每次加一部分,预处理前缀和+二分求每次可以走的最上点即可。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
typedef long long ll;
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef long long ll;
const int N=2e5+5;
int n,k,a[N],mn=0x3f3f3f3f,mx=-0x3f3f3f3f;
ll cnt[N],det[N];
signed main(){n=read(),k=read();for(ri i=1;i<=n;++i)a[i]=read();sort(a+1,a+n+1);for(ri i=1;i<=n;++i){++det[a[1]],--det[a[i]+1];}mn=a[1],mx=a[n];for(ri i=mn;i<=mx;++i)cnt[i]=cnt[i-1]+det[i];for(ri i=mn+1;i<=mx;++i)cnt[i]+=cnt[i-1];int turn=0;while(mn!=mx){++turn;int l=mn+1,r=mx,res=mn+1;while(l<=r){int mid=l+r>>1;if(cnt[mid]-cnt[mn]<=k)l=mid+1,res=mid;else r=mid-1;}mn=res;}cout<<turn;return 0;
}

D题

传送门
题意:给你一个n∗nn*nn∗n的国际象棋,每个格子上有一个111~n2n^2n2之间的正整数,每个格子上的数互不相同。你有三个棋子象,车和马,每次可以选择切换一种棋子或者走一步,问从111所在格子走到222所在格子再走到333所在格子这样下去一直走到n2n^2n2所在格子所需的最短步数,以及在所有最短的方案中最小的换棋子的次数。


思路:直接暴力建边跑n2n^2n2次最短路即可。
注意车和象可以分别对行,列,主对角线,副对角线建虚点优化边数。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef pair<int,int> pii;
const int N=15,inf=0x3f3f3f3f;
int a[15][15],h[N],l[N],x[N<<1],y[N<<1],n,val[1005],tot;
struct Node{int v,w,col;};
vector<Node>e[1005];
inline void add(int u,int v,int w,int col){e[u].push_back((Node){v,w,col});}
map<pii,bool>in;
map<pii,pii>pred;
inline void solve(){static int hd,tl,s,t;static pii q[1005],dis[1005][4];dis[1][1]=pii(0,0),dis[1][2]=pii(0,0),dis[1][3]=pii(0,0);for(ri tt=1;tt<n*n;++tt){s=tt,t=tt+1;for(ri i=1;i<=tot;++i){if(i==s)continue;for(ri j=1;j<=3;++j)dis[i][j]=pii(inf,inf);}hd=1,tl=0;in[q[++tl]=pii(s,1)]=1,in[q[++tl]=pii(s,2)]=1,in[q[++tl]=pii(s,3)]=1;pred.clear();while(hd<=tl){pii x=q[hd++];in[x]=0;for(ri i=0,v,w,col;i<e[x.fi].size();++i){v=e[x.fi][i].v,w=e[x.fi][i].w,col=e[x.fi][i].col;pii tmp=pii(dis[x.fi][x.se].fi+w+val[v]+(x.se!=col),dis[x.fi][x.se].se+(x.se!=col));if(tmp<dis[v][col]){dis[v][col]=tmp;pred[pii(v,col)]=x;if(!in[pii(v,col)])in[q[++tl]=pii(v,col)]=1;}}}}pii res=min(min(dis[t][1],dis[t][2]),dis[t][3]);cout<<res.fi<<' '<<res.se<<'\n';
}
int main(){n=read();for(ri i=1;i<=n;++i)for(ri j=1;j<=n;++j)a[i][j]=read();for(ri i=1;i<=n;++i)for(ri j=1;j<=n;++j){if(i>1&&j>2)add(a[i][j],a[i-1][j-2],1,1);if(i>1&&j<n-1)add(a[i][j],a[i-1][j+2],1,1);if(i>2&&j>1)add(a[i][j],a[i-2][j-1],1,1);if(i>2&&j<n)add(a[i][j],a[i-2][j+1],1,1);if(i<n&&j>2)add(a[i][j],a[i+1][j-2],1,1);if(i<n&&j<n-1)add(a[i][j],a[i+1][j+2],1,1);if(i<n-1&&j>1)add(a[i][j],a[i+2][j-1],1,1);if(i<n-1&&j<n)add(a[i][j],a[i+2][j+1],1,1);}tot=n*n;for(ri i=1;i<=n;++i){val[h[i]=++tot]=1;for(ri j=1;j<=n;++j)add(a[i][j],h[i],0,2),add(h[i],a[i][j],0,2);}for(ri i=1;i<=n;++i){val[l[i]=++tot]=1;for(ri j=1;j<=n;++j)add(a[j][i],l[i],0,2),add(l[i],a[j][i],0,2);}for(ri det,i=1;i<=n*2-1;++i){val[x[i]=++tot]=1,det=i-n;for(ri j=1;j<=n;++j)if(j+det>=1&&j+det<=n)add(a[j][j+det],x[i],0,3),add(x[i],a[j][j+det],0,3);}for(ri sum,i=1;i<=n*2-1;++i){val[y[i]=++tot]=1,sum=i+1;for(ri j=1;j<=n;++j)if(sum-j>=1&&sum-j<=n)add(a[j][sum-j],y[i],0,3),add(y[i],a[j][sum-j],0,3);}solve();return 0;
}

E题

传送门
题意:给一个长度为n,字符集为A的字符串,以及m个数字b,对于任意数字bib_ibi​足长度为bib_ibi​的前缀和后缀先反转再交换位置后形成的新串与原串视作相等,问存在多少不同串。


思路:把bbb排序,然后方案只跟起差分数列有关,显然对于两个长度都等于某一个bib_ibi​的串A,BA,BA,B如果A&lt;BA&lt;BA<B就可以产生一次贡献。
于是只用处理询问一个f(x)f(x)f(x)表示从长度为xxx的所有串中选出来两个,A&lt;BA&lt;BA<B的方案。
代码:

#include<bits/stdc++.h>
#define ri register int
#define fi first
#define se second
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
typedef long long ll;
const int N=2e5+5,mod=998244353,inv2=499122177;
inline int add(const int&a,const int&b){return a+b>=mod?a+b-mod:a+b;}
inline int dec(const int&a,const int&b){return a>=b?a-b:a-b+mod;}
inline int mul(const int&a,const int&b){return (ll)a*b%mod;}
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=mul(a,a))if(p&1)ret=mul(ret,a);return ret;}
int n,m,a,b[N],ans;
inline int f(const int&x){int tmp=ksm(a,x);return mul(mul(tmp,tmp+1),inv2);}
int main(){n=read(),m=read(),a=read();for(ri i=1;i<=m;++i)b[i]=read();ans=mul(ksm(a,n-2*b[m]),f(b[1]));for(ri i=2;i<=m;++i)ans=mul(ans,f(b[i]-b[i-1]));cout<<ans;return 0;
}

F题

传送门
题意:给你一棵树。
你从根节点111出发有如下两种走法:

  1. 走到该节点子树中的某个叶子
  2. 如果你在一个叶子上,可以选择走到你的111~kkk级祖先。

问你最后能够访问到的不同叶子数的最大值。


思路:
吐槽:想长链剖分和线段树想了好久然后突然发现一道NOIP难度的树形dp
gig_igi​表示iii向子树中走且最后能回到iii的最大答案,fif_ifi​则表示iii向子树中最后不必回到iii的最大答案。
然后从儿子转移一下就完了。
代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int rlen=1<<18|1;
inline char gc(){static char buf[rlen],*ib,*ob;(ib==ob)&&(ob=(ib=buf)+fread(buf,1,rlen,stdin));return ib==ob?-1:*ib++;
}
inline int read(){int ans=0;char ch=gc();while(!isdigit(ch))ch=gc();while(isdigit(ch))ans=((ans<<2)+ans<<1)+(ch^48),ch=gc();return ans;
}
const int N=1e6+5;
int n,k,f[N],g[N],dep[N],mndep[N];
vector<int>e[N];
void dfs(int p){mndep[p]=0x3f3f3f3f;if(!e[p].size()){f[p]=g[p]=1,mndep[p]=dep[p];return;}for(ri i=0,v;i<e[p].size();++i){dep[v=e[p][i]]=dep[p]+1,dfs(v),mndep[p]=min(mndep[p],mndep[v]);if(mndep[v]-dep[p]<=k)g[p]+=g[v],f[p]+=g[v];}int sum=f[p];for(ri i=0,v;i<e[p].size();++i)f[p]=max(f[p],sum-(mndep[v=e[p][i]]-dep[p]<=k?g[v]:0)+f[v]);
}
int main(){n=read(),k=read();for(ri i=2;i<=n;++i)e[read()].push_back(i);dfs(1);cout<<max(f[1],g[1]);return 0;
}

G题

传送门
题意:给你一个字符串斐波那契数列,F0=F_0=F0​="000",F1=F_1=F1​="111",Fi=Fi−2+Fi−1F_i=F_{i-2}+F_{i-1}Fi​=Fi−2​+Fi−1​,令AFiA_{F_i}AFi​​表示这个串的所有后缀排序后的序列,问这个序列第kkk项的前mmm个字符。


思路:
我们相当于二分一样每次按位考虑走0/10/10/1就完了。
代码(照着zhouoyuyang{\color {red}zhouoyuyang}zhouoyuyang的码了一遍):

#include<bits/stdc++.h>
#define ri register int
using namespace std;
typedef long long ll;
const int N=305;
const ll lim=1e18+1;
int n,m;
ll k;
string ans="",f[15];
inline bool pre(int pos,const string&s,int st,const ll&len){int id=pos<=14?pos:14-(pos&1);return len<=f[id].size()&&!f[id].compare(0,len,s,st,len);
}
inline bool suf(int pos,const string&s,int st,const ll&len){int id=min(pos,14);return len<=f[id].size()&&!f[id].compare(f[id].size()-len,len,s,st,len);
}
inline ll calc(const int&n,const string&s){static ll g[N];for(ri i=0;i<=n;++i){if(i<2){g[i]=f[i]==s;continue;}g[i]=g[i-1]+g[i-2];for(ri up=s.size(),j=1;j<up;++j)if(suf(i-2,s,0,j)&&pre(i-1,s,j,up-j))++g[i];g[i]=min(g[i],lim);}return g[n];
}
int main(){f[0]="0",f[1]="1";for(ri i=2;i<=14;++i)f[i]=f[i-2]+f[i-1];scanf("%d%lld%d",&n,&k,&m);ll cnt0,ext;for(ri i=1;i<=m;++i){cnt0=calc(n,ans+'0');ll ext=ans!=""&&suf(n,ans,0,ans.size());if(k<=ext)break;if(k<=ext+cnt0)k-=ext,ans+='0';else k-=ext+cnt0,ans+='1';}cout<<ans;return 0;
}

Codeforces 1065 简要题解相关推荐

  1. c语言1106回文数,Codeforces 1106 简要题解

    A题 传送门 读错题还能过样例我给自己点个赞. 题意简述:给一个010101网格SSS,问满足Si,j=Si+1,j+1=Si+1,j−1=Si−1,j−1=Si−1,j+1S_{i,j}=S_{i+ ...

  2. Codeforces 1110 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 众所周知ldxoildxoildxoi这种菜鸡选手是不会写HHH题的,因此该篇博客只有AAA题至GGG题的题解,实在抱歉. A题 传送门 题 ...

  3. Codeforces 837 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 并没有找到难度评级但感觉是div3div3div3场. A题 题意:一个单词的价值是里面大写字母的个数,一篇文章的价值是里面所有单词的价值的 ...

  4. CodeForces 1089 简要题解

    Alice the Fan 预处理 f(wina,winb,scorea,scoreb)f(win_a, win_b, score_a, score_b)f(wina​,winb​,scorea​,s ...

  5. CodeForces 878 简要题解

    A. Short Program 起床困难综合征,随便构造一下就好了. #include <bits/stdc++.h> #define xx first #define yy secon ...

  6. Codeforces 1086 简要题解

    文章目录 A题 B题 C题 D题 E题 传送门 这场比赛原地爆炸了啊!!! 只做了两道. A题 传送门 手贱没关freopenfreopenfreopen于是wawawa了一次,死活调不出错. 题意: ...

  7. Codeforces 1198 简要题解

    文章目录 E F 传送门 前四题对应这套题的CCC~FFF E 传送门 考虑用扫描线的思想将原图分成若干小矩形,然后就可以利用行列二分图匹配+差分的思想建图,最后用dinicdinicdinic跑最小 ...

  8. Codeforces 1106 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 传送门 A题 传送门 读错题还能过样例我给自己点个赞. 题意简述:给一个010101网格SSS,问满足Si,j=Si+1,j+1=Si+1,j−1=Si− ...

  9. CodeForces 997 简要题解

    Convert to Ones 翻转操作实际就是合并两段 000 ,特判全 1" role="presentation" style="position: re ...

最新文章

  1. 谈谈你对oracle的认识,对Oracle存储过程的几点认识
  2. java分页代码思路,记录--java 分页 思路 (hibernate关键代码)
  3. Android 应用开发(18)---在运行时请求权限
  4. Cannot read property 'style' of null 问题
  5. coreseek4.1
  6. 服务器显示叹号DASD,ibm system x3850 x5服务器DASD亮橙色灯怎么处理
  7. IOTSWC欧洲工业物联网解决方案大会-2019
  8. 外汇投资风险在哪里.
  9. 房屋租赁合同电子版(可下载)
  10. centos上使用Dropbox
  11. 学fpga(先自顶而下设计,再自下而上集成)
  12. Flutter Provider状态管理-Consumer
  13. 【Matlab】多元线性回归(Excel可直接替换数据)
  14. git push代码时自动化添加reviewer
  15. java2ee preview_JavaEE 的基本实现
  16. arm linux gcc 说明书,第七篇:gcc和arm-linux-gcc常用选项
  17. SQLSERVER 跨数据库 触发器 同步数据
  18. Adobe正版软件购买
  19. 生化奇兵无限服务器过于繁忙,生化奇兵无限BUG问题解决 | 手游网游页游攻略大全...
  20. windows web服务器性能测试工具,网站性能Web压力测试工具webbench

热门文章

  1. 什么?你还没女伴?教你如何借助Python俘获女孩子芳心
  2. 综述:从LeNet 到 GoogLeNet:卷积神经网络的进化
  3. G-SHOCK时间校准
  4. 论文《Learning both Weights and Connections for Efficient Neural Network》阅读笔记
  5. latex中输入数学中的“属于” 符号
  6. mysql索引实战_MySQL索引实战经验总结
  7. H5页面支持拍照选择图片
  8. 利率风险结构和期限结构
  9. 设置表格1px边框线的两种方式
  10. linux查看硬件PCI设备,Linux系统查看硬件信息神器,比pci设备好用100倍!