【CF套题】 Educational Codeforces Round 58
【前言】
组队CF之帮wyl上橙,我和sc打小号上紫。
结果sc成功FST两题,wyl成功skipped。
我的小号幸存了qwq。
【题目】
原题地址
A.Minimum Integer
特判一下ddd是不是在[l,r][l,r][l,r]中,如果是那么答案就是x∗(rx+1)x*(\frac r x +1)x∗(xr+1)
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}int main()
{#ifndef ONLINE_JUDGEfreopen("A.in","r",stdin);freopen("A.out","w",stdout);
#endifint T=read();while(T--){int l=read(),r=read(),x=read();if(x<l || x>r){printf("%d\n",x);}else printf("%d\n",(r/x+1)*x);}return 0;
}
B.Accordion
模拟。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f,N=1e6+10;
int p[10],ans;
char s[N];int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}int main()
{#ifndef ONLINE_JUDGEfreopen("B.in","r",stdin);freopen("B.out","w",stdout);
#endifscanf("%s",s);;int n=strlen(s);memset(p,-1,sizeof(p));for(int i=0;i<n;++i) if(s[i]=='[') {p[1]=i;break;}for(int i=n-1;~i;--i) if(s[i]==']') {p[2]=i;break;}if(p[1]>p[2] || p[1]==-1 || p[2]==-1){puts("-1");return 0;}for(int i=p[1]+1;i<p[2];++i) if(s[i]==':'){p[3]=i;break;}for(int i=p[2]-1;i>p[1];--i) if(s[i]==':'){p[4]=i;break;}if(p[3]==-1 || p[4]==-1 || p[3]==p[4]) {puts("-1");return 0;}for(int i=p[3]+1;i<p[4];++i) if(s[i]=='|') ++ans;printf("%d\n",ans+4);return 0;
}
C.Division and Union
按左端点排序,判断和上一条线段位置关系分组。
若一条线段被另一条包含在过程中可以判掉。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f,N=1e5+10;
int n,bl[N];int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}struct seg
{int l,r,id;seg(int _l=0,int _r=0,int _id=0):l(_l),r(_r),id(_id){}
}a[N];
bool cmp(const seg&a,const seg&b)
{return a.l<b.l || (a.l==b.l && a.r<b.r);
}int main()
{#ifndef ONLINE_JUDGEfreopen("C.in","r",stdin);freopen("C.out","w",stdout);
#endifint T=read();while(T--){n=read();for(int i=1;i<=n;++i) a[i].l=read(),a[i].r=read(),a[i].id=i;sort(a+1,a+n+1,cmp);for(int i=1;i<=n;++i) bl[i]=-1;int las=0;for(int i=1;i<=n;++i) {//cerr<<a[i].l<<" "<<a[i-1].r<<endl;if(a[i].l>=a[las].l && a[i].r<=a[las].r) {bl[a[i].id]=bl[a[las].id];continue;}if(a[i].l>a[las].r) bl[a[i].id]=bl[a[las].id]^1;else bl[a[i].id]=bl[a[las].id];las=i;}bool fg=0;for(int i=1;i<=n;++i) if(bl[a[i].id]==0){fg=1;break;}if(!fg){puts("-1");}else {for(int i=1;i<=n;++i)printf("%d ",bl[i]+1);puts("");}}return 0;
}
D.GCD Counting
枚举质因子,bfs\text{bfs}bfs直径。注意多余的边和点什么的不要经过。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f,N=2e5+10;
int tot,n,pnum,rt,ans;
int bo[N],head[N],pri[N],dis[N],a[N];
map<int,bool>mp;
queue<int>q;int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}struct Tway{int v,w,nex;}e[N<<1];
void add(int u,int v,int w)
{e[++tot]=(Tway){v,w,head[u]};head[u]=tot;e[++tot]=(Tway){u,w,head[v]};head[v]=tot;
}
int gcd(int x,int y){return y?gcd(y,x%y):x;}void init()
{for(int i=2;i<N;++i){if(!bo[i]) pri[++pnum]=i;for(int j=1;j<=pnum && i*pri[j]<N;++j){bo[i*pri[j]]=1;if(!(i%pri[j])) break;}}
}
int bfs(int x,int p)
{q.push(x);mp.clear();mp[x]=1;dis[x]=1;int res=1;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].nex){int v=e[i].v,w=e[i].w;//cerr<<u<<" "<<v<<" "<<endl;if(mp[v] || gcd(p,w)==1) continue; dis[v]=dis[u]+1;rt=v;res=dis[v];mp[v]=1;}}return res;
}void findtree(int x,int p)
{//cerr<<x<<" "<<p<<endl;rt=0;bfs(x,p);int res=bfs(rt,p);ans=max(ans,res);
}int main()
{#ifndef ONLINE_JUDGEfreopen("D.in","r",stdin);freopen("D.out","w",stdout);
#endifn=read();init();for(int i=1;i<=n;++i) a[i]=read();for(int i=1;i<n;++i){int u=read(),v=read();add(u,v,gcd(a[u],a[v]));}for(int p=1;p<=pnum;++p){memset(dis,0,sizeof(dis));for(int i=1;i<=n;++i) if(!dis[i] && gcd(a[i],pri[p])>1) findtree(i,pri[p]);}printf("%d\n",ans);return 0;
}
E.Polycarp’s New Job
将短边放前面,记录最大值判断一下。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
int m,mxx,mxy;int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}int main()
{#ifndef ONLINE_JUDGEfreopen("E.in","r",stdin);freopen("E.out","w",stdout);
#endifm=read();while(m--){char op[2];int x,y;scanf("%s%d%d",op,&x,&y);if(x>y) swap(x,y);if(op[0]=='+') mxx=max(mxx,x),mxy=max(mxy,y);else puts((mxx<=x && mxy<=y)?"YES":"NO");}return 0;
}
F.Trucks and Cities
我们设fi,j,kf_{i,j,k}fi,j,k表示从iii城市到jjj城市,加油kkk次,需要跑的最远一段路程。
显然fi,i+1,1=ai+1−aif_{i,i+1,1}=a_{i+1}-a_ifi,i+1,1=ai+1−ai
若我们固定了iii,当kkk越大,最后一次加油的位置一定单调右移。
于是我们可以枚举这一阶段最后一次加油是在什么地方,随着这个位置右移,上一阶段最后一次加油位置一定也右移。
这个东西相当于将行程拆成了两部分i−>j,j−>ki->j,j->ki−>j,j−>k。
转移也没什么好说的。
复杂度就是O(n3+m)O(n^3+m)O(n3+m)的了。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f,N=405;
int n,m,a[N],f[N][N][N];
ll ans;int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}int main()
{#ifndef ONLINE_JUDGEfreopen("F.in","r",stdin);freopen("F.out","w",stdout);
#endifn=read();m=read();for(int i=1;i<=n;++i) a[i]=read();for(int i=1;i<n;++i) {for(int j=i+1;j<=n;++j) f[i][j][1]=a[j]-a[i];for(int t=2;t+i<=n;++t){int las=i+t-1;for(int j=i+t;j<=n;++j){while(las+1<j && max(f[i][las][t-1],a[j]-a[las])>max(f[i][las+1][t-1],a[j]-a[las+1])) ++las;f[i][j][t]=max(f[i][las][t-1],a[j]-a[las]);}}}for(int i=1;i<=m;++i) {int s=read(),t=read(),c=read(),r=read();ans=max(ans,(ll)f[s][t][min(t-s,r+1)]*c);}printf("%lld\n",ans);return 0;
}
G.(Zero XOR Subset)-less
这是一道线性基裸题。
首先无解当且仅当所有数异或为0,否则显然可以构造出解。
我们只需要先让所有数先做一个前缀异或,然后按顺序插入线性基即可。
最后线性基中的基底个数就是答案。
#include<bits/stdc++.h>
#define mkp make_pair
#define pb push_back
#define fi first
#define se second
using namespace std;typedef double db;
typedef long long ll;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f,N=3e5+10;
int n,a[N];int read()
{int ret=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=0;c=getchar();}while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return f?ret:-ret;
}
void getfail(){puts("-1");exit(0);}struct LinearBase
{int ans,b[100];void insert(int x){int i,j;for(i=30;~i;i--) if(x>>i&1){if(b[i]) x^=b[i];else break;}if(!x) return;b[i]=x;++ans;for(j=i-1;~j;j--) if(b[i]>>j&1) b[i]^=b[j];for(j=i+1;j<31;j++) if(b[j]>>i&1) b[j]^=b[i];}
}T;int main()
{#ifndef ONLINE_JUDGEfreopen("F.in","r",stdin);freopen("F.out","w",stdout);
#endifn=read();for(int i=0;i<n;++i) a[i]=read();for(int i=1;i<n;++i) a[i]^=a[i-1];if(!a[n-1])getfail();for(int i=0;i<n;++i) T.insert(a[i]);printf("%d\n",T.ans);return 0;
}
【CF套题】 Educational Codeforces Round 58相关推荐
- szu cf套题训练Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3)A~D题解报告
A. Math Problem 题目大意:就是给你n个线段,你自己再添加一个线段d使得d和所有的线段都有交点,求d这个线段的最小长度是多少 解题思路: 1.首先看d线段的左端点,就是左端点选取的是所有 ...
- 【CF比赛】Educational Codeforces Round 102 (Rated for Div. 2)
题目来源 Educational Codeforces Round 102 (Rated for Div. 2) A. Replacing Elements 只要判断最大值是否小于等于d,或者第一个值 ...
- Educational Codeforces Round 58
D. GCD Counting 题意: 给出n个点的树,每个点有一个权值,找出一条最长的路径使得路径上所有的点的gcd>1 题解: gcd>1的一定不会有很多.所以暴力搞一下就行,不需要点 ...
- Educational Codeforces Round 103 (Rated for Div. 2)前四题
Educational Codeforces Round 103 (Rated for Div. 2) 第二次被别人hack,悲 A - K-divisible Sum 题意 给定两个整数 n,kn, ...
- Educational Codeforces Round 73 (Rated for Div. 2) E. Game With String 思维博弈 好题(2500)
传送门 文章目录 题意: 思路: 题意: 思路: 我们将每一段...拿出来看成若干段,将其分成以下四种情况: (1)len<b(1)len<b(1)len<b (2)b≤len< ...
- Educational Codeforces Round 40千名记
人生第二场codeforces.然而遇上了Education场这种东西 Educational Codeforces Round 40 下午先在家里睡了波觉,起来离开场还有10分钟. 但是突然想起来还 ...
- Educational Codeforces Round 138 (Rated for Div. 2)-赛后总结
Dashboard - Educational Codeforces Round 138 (Rated for Div. 2) - Codeforces 总结一个教训就是不要心急,特别是对于一些题目, ...
- Educational Codeforces Round 36 (Rated for Div. 2) 题解
Educational Codeforces Round 36 (Rated for Div. 2) 题目的质量很不错(不看题解做不出来,笑 Codeforces 920C 题意 给定一个\(1\)到 ...
- Educational Codeforces Round 114 (Rated for Div. 2) (A ~ F)全题解
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Educational Codeforces Round 114 (Rated for Div. 2) ...
最新文章
- 频率分布直方图组距如何确定_小猿圈Python开发之绘制频率分布直方图示例
- V神最新演讲:以太坊2.0的分片交易
- 用命令行执行java代码
- 为什么嫁人就选程序员!
- 学法减分小程序可用可运营源码附带安装教程
- haneWIN搭建Win10 NFS服务器
- tp5第三方支付-支付宝
- Mac版Lync无法登陆问题(登录设置)
- 广告中的CPM、CPC、CPA解释
- Xilinx FPGA的DNA是什么?
- 【STM32H7的DSP教程】第16章 DSP功能函数-数据拷贝,数据填充和浮点转定点
- 两对等位基因控制一对相对性状的规律(基因互作)
- linux 4g 拨号,4G模块Linux PPP拨号说明
- python 需要在什么环境下运行_运行Python需要什么环境?也需要虚拟机吗?
- 【应用】1200PLC实现三层电梯模拟控制
- D3 CSV表格文件的读取详解
- Chapter5 生长因子、受体和癌症
- 88个国外音乐网站推荐
- 20ZR暑期集训 简单数据结构
- Java进击框架:Spring(一)