文章目录

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

传送门
并没有找到难度评级但感觉是div3div3div3场。

A题

题意:一个单词的价值是里面大写字母的个数,一篇文章的价值是里面所有单词的价值的最大值。
求一篇文章的价值。


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

#include<bits/stdc++.h>
#define ri register int
using namespace std;
char s[205];
int main(){int t,ans=0;cin>>t;while(~scanf("%s",s)){int cnt=0;for(ri i=0,up=strlen(s);i<up;++i){if(s[i]>='A'&&s[i]<='Z')++cnt;}ans=max(ans,cnt);}cout<<ans;return 0;
}

B题

传送门
题意:给你一个n∗mn*mn∗m的三色方阵,问是否满足这个方阵被三种颜色均分成三个长宽都相等的子方阵。


思路:按照题意模拟。

#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=105;
const int rlen=1<<18|1;
inline char gc(){return getchar();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;
}
int n,m;
char s[105][105];
inline void check1(){char tmp=s[1][1];if(s[1][1]==s[n/3+1][1]||s[n/3+1][1]==s[n/3*2+1][1]||s[1][1]==s[n/3*2+1][1])return;bool f=1;for(ri i=1;i<=n/3;++i){for(ri j=1;j<=m;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;tmp=s[n/3+1][1];for(ri i=n/3+1;i<=n/3*2;++i){for(ri j=1;j<=m;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;tmp=s[n/3*2+1][1];for(ri i=n/3*2+1;i<=n;++i){for(ri j=1;j<=m;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;   puts("YES");exit(0);
}
inline void check2(){char tmp=s[1][1];if(s[1][1]==s[1][m/3+1]||s[1][m/3+1]==s[1][m/3*2+1]||s[1][1]==s[1][m/3*2+1])return;bool f=1;for(ri i=1;i<=n;++i){for(ri j=1;j<=m/3;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;tmp=s[1][m/3+1];for(ri i=1;i<=n;++i){for(ri j=m/3+1;j<=m/3*2;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;tmp=s[1][m/3*2+1];for(ri i=1;i<=n;++i){for(ri j=m/3*2+1;j<=m;++j){if(s[i][j]!=tmp){f=0;break;}}if(!f)break;}if(!f)return;   puts("YES");exit(0);
}
int main(){n=read(),m=read();for(ri i=1;i<=n;++i)scanf("%s",s[i]+1);if(n%3&&m%3)return puts("NO"),0;if(!(n%3))check1();if(!(m%3))check2();puts("NO");return 0;
}

C题

传送门
题意:你有一个a∗ba*ba∗b的方格和nnn个长宽为xi,yix_i,y_ixi​,yi​的印章,要求你放两个印章上去,它们不能相交且印章覆盖总面积最大,每个印章可以旋转90°90\degree90°。


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

#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=105;
int n,a,b,tot=0,ans=0;
struct Node{int a,b,id;}A[N<<1];
inline void update(const Node&A,const Node&B){if(A.id==B.id)return;if(A.a>a||B.a>a||A.b>b||B.b>b)return;if(A.a+B.a<=a||A.b+B.b<=b)ans=max(ans,A.a*A.b+B.a*B.b);
}
int main(){n=read(),a=read(),b=read();for(ri x,y,i=1;i<=n;++i)x=read(),y=read(),A[++tot]=(Node){x,y,i},A[++tot]=(Node){y,x,i};for(ri i=1;i<=tot;++i)for(ri j=1;j<=tot;++j)update(A[i],A[j]);cout<<ans;return 0;
}

D题

传送门
题意:规定一个数的价值是其后缀0个数,现在要求你从nnn个数中选kkk个出来乘起来,问乘积的价值的最大值。n≤200,ai≤1e18n\le200,a_i\le1e18n≤200,ai​≤1e18


思路:
显然只用关心222和555的个数。
考虑dpdpdp,定义状态fi,j,kf_{i,j,k}fi,j,k​表示前iii个选了jjj个,555的个数为kkk时222的个数的最大值。
然后随便转移一下最后取一个最值就完了。
代码:

#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++;
}
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;
}
typedef pair<int,int> pii;
const int N=205,K=7005;
int n,k,f[2][N][K],tmp=0;
inline pii solve(ll x){int c1=0,c2=0;while(x==x/2*2)++c1,x/=2;while(x==x/5*5)++c2,x/=5;return pii(c1,c2);
}
int main(){n=read(),k=read();int sum=0;pii a;memset(f[tmp],-1,sizeof(f[tmp]));f[tmp][0][0]=0;for(ri tt=1;tt<=n;++tt){ll x=read();a=solve(x);sum+=a.se;tmp^=1;memcpy(f[tmp],f[tmp^1],sizeof(f[tmp]));for(ri j=1;j<=k;++j)for(ri i=a.se;i<=sum;++i)if(~f[tmp^1][j-1][i-a.se])f[tmp][j][i]=max(f[tmp][j][i],f[tmp^1][j-1][i-a.se]+a.fi);}int ans=0;for(ri j=0;j<=k;++j)for(ri i=0;i<=sum;++i)ans=max(ans,min(i,f[tmp][j][i]));cout<<ans;return 0;
}

E题

传送门
题意:有一个函数f(a,b):f(a,b):f(a,b):
f(a,0)=0,f(a,b&gt;0)=f(a,b−gcd(a,b))+1f(a,0)=0,f(a,b&gt;0)=f(a,b-gcd(a,b))+1f(a,0)=0,f(a,b>0)=f(a,b−gcd(a,b))+1
问f(x,y)f(x,y)f(x,y)等于多少a,b≤1e12a,b\le1e12a,b≤1e12


思路:
发现对于a,b,g=gcd(a,b)a,b,g=gcd(a,b)a,b,g=gcd(a,b),f(a,b)=f(ag,bg)f(a,b)=f(\frac ag,\frac bg)f(a,b)=f(ga​,gb​)
于是我们模拟一下这个过程,每次求出当前的bbb减几之后会跟当前的aaa的gcdgcdgcd大于111即可。
实现可以每次暴力求出aaa的所有约数来判断。
代码:

#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++;
}
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;
}
ll x,y;
vector<ll>divv;
inline void solve(ll x){if(x==1){divv.push_back(1);return;}divv.clear();for(ri i=2;(ll)i*i<=x;++i){if(x!=x/i*i)continue;divv.push_back(i);if((ll)i*i!=x)divv.push_back(x/i);}divv.push_back(x);sort(divv.begin(),divv.end());
}
int main(){x=read(),y=read();ll ans=0;solve(x);while(y>=divv[0]){if(x==1)break;solve(x);ll rs=divv[0],tim=y-y/rs*rs;for(ri i=1,up=divv.size();i<up;++i){if(divv[i]>y)break;if(y-y/divv[i]*divv[i]<=tim)rs=divv[i],tim=y-y/rs*rs;}ans+=tim,y/=rs,x/=rs;solve(x);}cout<<ans+y;return 0;
}

F题

传送门
题意:
定义函数f(a),a为数列=数列b,bi=∑j=1iaif(a),a为数列=数列b,b_i=\sum_{j=1}^i a_if(a),a为数列=数列b,bi​=∑j=1i​ai​
现在有一个初始数列aaa和一个数kkk,问对这个数列调用几次fff函数之后序列中会存在一个数不小于kkk,∣a∣≤200000,k≤1e18|a|\le200000,k\le1e18∣a∣≤200000,k≤1e18


思路:
显然特判掉次数为0,10,10,1的情况然后二分答案,checkcheckcheck的话直接看最后一个数是否小于kkk即可。
手推一波公式会发现初始数列中每个数对于要求值贡献的系数是组合数,因此我们暴力加就是了,注意可能会爆longlonglong longlonglong。
代码:

#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++;
}
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;
}
const int N=2e5+5;
int n;
ll k,a[N];
inline bool check(ll tim){long double sum=0,fac=1;for(ri i=1;i<=n;++i){if(i^1)fac=fac*(i+tim-2);if(i^1)fac/=(i-1);if(fac>k||fac<0)fac=k;if(fac*a[n-i+1]<0)return 1;sum+=fac*a[n-i+1];if(sum>=k||sum<0)return 1;}return 0;
}
int main(){n=read(),k=read();for(ri i=1;i<=n;++i){a[i]=read();if(a[i]>=k)return puts("0"),0;}ll sum=0;for(ri i=1;i<=n;++i)sum+=a[i];if(sum>=k)return puts("1"),0;ll l=2,r=k,res=k;while(l<=r){ll mid=l+r>>1;if(check(mid))r=mid-1,res=mid;else l=mid+1;}cout<<res;return 0;
}

G题

传送门
题意:现在有nnn个分段函数,fi(x)f_i(x)fi​(x)有666个参数x1,x2,y1,a,b,y2x_1,x_2,y_1,a,b,y_2x1​,x2​,y1​,a,b,y2​
f(x)=y1,0≤x≤x1f(x)=y1,0\le x\le x_1f(x)=y1,0≤x≤x1​
f(x)=ax+b,x1&lt;x≤x2f(x)=ax+b,x_1&lt;x\le x_2f(x)=ax+b,x1​<x≤x2​
f(x)=y2,x2&lt;xf(x)=y2,x_2&lt;xf(x)=y2,x2​<x
现在有mmm次询问,每次给出l,r,xl,r,xl,r,x,求∑i=lrfi(x)\sum_{i=l}^rf_i(x)∑i=lr​fi​(x),强制在线。


思路:显然需要维护一个∑i=1kfi(x)\sum_{i=1}^kf_i(x)∑i=1k​fi​(x)
考虑到将f(x)f(x)f(x)稍加改动:
f(x)=0x+y1,0≤x≤x1f(x)=0x+y1,0\le x\le x_1f(x)=0x+y1,0≤x≤x1​
f(x)=ax+b,x1&lt;x≤x2f(x)=ax+b,x_1&lt;x\le x_2f(x)=ax+b,x1​<x≤x2​
f(x)=0x+y2,x2&lt;xf(x)=0x+y2,x_2&lt;xf(x)=0x+y2,x2​<x
这启发我们最后答案等于Ax+BAx+BAx+B,因此我们只需要维护A,BA,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=75005,M=N*120;
int rt[N],n;
struct data{ll a,b;data(ll a=0,ll b=0):a(a),b(b){}friend inline data operator+(const data&a,const data&b){return data(a.a+b.a,a.b+b.b);}friend inline data operator-(const data&a,const data&b){return data(a.a-b.a,a.b-b.b);}
};
namespace SGT{#define lc (son[p][0])#define rc (son[p][1])#define mid (l+r>>1)data sum[M];int son[M][2],tot=0;inline void update(int&p,int o,int l,int r,int ql,int qr,data v){p=++tot,lc=son[o][0],rc=son[o][1],sum[p]=sum[o];if(ql<=l&&r<=qr){sum[p]=sum[p]+v;return;}if(qr<=mid)update(lc,son[o][0],l,mid,ql,qr,v);else if(ql>mid)update(rc,son[o][1],mid+1,r,ql,qr,v);else update(lc,son[o][0],l,mid,ql,mid,v),update(rc,son[o][1],mid+1,r,mid+1,qr,v);}inline data query(int&p,int l,int r,int k){return !p?data(0,0):(l==r?sum[p]:sum[p]+(k<=mid?query(lc,l,mid,k):query(rc,mid+1,r,k)));}#undef lc#undef rc#undef mid
}
int main(){n=read();int lim=200001;for(ri i=1,x1,x2,y1,a,b,y2;i<=n;++i){x1=read(),x2=read(),y1=read(),a=read(),b=read(),y2=read();rt[i]=rt[i-1];SGT::update(rt[i],rt[i],0,lim,0,x1,data(0,y1));SGT::update(rt[i],rt[i],0,lim,x1+1,x2,data(a,b));SGT::update(rt[i],rt[i],0,lim,x2+1,lim,data(0,y2));}ll lastans=0;data tmp;for(ri l,r,x,tt=read();tt;--tt){l=read(),r=read(),x=(lastans+read())%1000000000;tmp=SGT::query(rt[r],0,lim,min(x,lim))-SGT::query(rt[l-1],0,lim,min(x,lim));cout<<(lastans=tmp.a*x+tmp.b)<<'\n';}return 0;
}

转载于:https://www.cnblogs.com/ldxcaicai/p/10582372.html

Codeforces 837 简要题解相关推荐

  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 1089 简要题解

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

  4. CodeForces 878 简要题解

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

  5. Codeforces 1065 简要题解

    文章目录 A题 B题 C题 D题 E题 F题 G题 传送门 GGG题略难,膜了一波 zhouyuyang{\color{red} zhouyuyang}zhouyuyang巨佬的代码. 其余都挺清真的 ...

  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. IT行业老程序员的经验之谈:爬虫学到什么程度可以找到工作?
  2. 基于单目摄像头的BEV实例预测(ICCV 2021)
  3. Redis的API调用工具类
  4. 青龙羊毛——最美阅读
  5. JeecgBoot 单表数据导出多sheet实例
  6. redis数据库操作(3)
  7. vue-cli 2.x 项目优化之:引入本地静态库文件
  8. 用Lucene[1].net对数据库建立索引及搜索+
  9. 【总结】动态规划 or 组合数学解决棋盘(迷宫)路径问题(持续更新中)
  10. 提交辞职申请时,领导极力挽留,还答应加薪,要不要留下来?
  11. 使用photoshop批量处理大量照片(1000张以上)方法介绍
  12. Vue 倒计时插件 vue2-countdown
  13. Python-Cartopy制图学习01-中国区域SPEI空间制图
  14. Cocos Creator方向与角度转换
  15. 兆比特每秒和兆字节每秒_bit ( 比特 )和 Byte(字节)的关系 以及 网速怎么算
  16. php执行fastlane,fastlane教程
  17. PRCS-1016 : Failed to resolve Single Client Access Name
  18. 解决fatal: could not get a repository handle
  19. Bootstrap4从入门到精通视频教程
  20. 2018年常见的13种APP推广方法 最后一种运营者必看

热门文章

  1. python并发循环_在Python中模拟一个并发循环?
  2. php限制上传类型,php 上传类型限制的简单示例
  3. djangosave保存数据太慢_PaddlePaddle从入门到炼丹八——模型的保存与使用
  4. 报时功能_拥有自鸣等20种复杂功能的百达翡丽6300G 连日期都可以用打簧报时听出来...
  5. Python数据结构与算法(1.1)——数据结构与算法导论
  6. oracle内连接时列的值是null,Oracle SQL - 比较空值时的JOIN性能
  7. mac安装rstudio_在Windows / Linux / Mac OS上安装R和RStudio入门
  8. string字符串转xml_Java将字符串转换为XML文档和将XML文档转换为String
  9. Java Hello World程序
  10. Java StringBuilder