CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)

2024-03-31 20:20
文章标签 round div rated codeton prizes

本文主要是介绍CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A. Farmer John’s Challenge

构造一个长度为n的数组a
满足循环右移数组中恰好有k个是升序的

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n,k;
void solve() {cin>>n>>k;if(k==1){for(int i=1;i<=n;i++) cout<<i<<' ';cout<<endl;}else if(n==k){for(int i=1;i<=n;i++) cout<<1<<' ';cout<<endl;}else{cout<<-1<<endl;}
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}

B. Bessie and MEX

长度为n的数组a(数[-n,n])

构造一个长度为n的排列p,使得ai=mex(p1,p2,…pi)-pi
一定有解

首先,如果a1为负数x的话,那么p1为-x
如果a1为1的话,那么p1为0

维护mex,也就是缺mex这个数
如果令pi为mex的话,那么结果是mex+1-mex=1
否则,令pi为x,则mex-x=a[i]==>x=mex-a[i]
不对

应该倒着推,mex(p1,p2,p3,…pn)=n,所以n-p[n]=a[n]>p[n]=n-a[n]
然后求出倒数第二个mex,以此类推,mex-p[i]=a[i]
>p[i]=mex-a[i]

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int p[N];
int n;
void solve() {cin>>n;set<int>s;for(int i=1;i<=n;i++) cin>>a[i];p[n]=n-a[n];s.insert(p[n]);for(int i=n-1;i>=1;i--){p[i]=*s.begin()-a[i];s.insert(p[i]);}for(int i=1;i<=n;i++) cout<<p[i]<<' ';cout<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}

C1. Bessie’s Birthday Cake (Easy Version)

边长为n的正多边形,顶点按照顺时针方向从1到n

贝西选择了x个顶点,以及还可以选择其它顶点最多y个(easy版本y为0)
然后切出不相交的对角线,问最多切成几个三角形

问分成几块问题,往往是通过数线产生的交点个数或者有效点的个数
问切成几个三角形,答案为有效的个数-2
如果两个有效点之间恰好有1个点,那么中间的那个点也是有效点

1 2 3 4 5 >2个
1 2 3
>1个
1 2 3 4 5 6==>3个

trick:

问分成几块问题,往往是通过数线产生的交点个数或者有效点的个数

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n,x,y;
void solve() {cin>>n>>x>>y;vector<int>res;for(int i=0;i<x;i++){int d;cin>>d;res.push_back(d);}int ans=x;sort(res.begin(),res.end());for(int i=1;i<(int)res.size();i++){if(res[i]==res[i-1]+2) ans++;}int len=res.size();int a=res[len-1]+2;if(a>n) a-=n;if(a==res[0]) ans++;cout<<ans-2<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}

C2. Bessie’s Birthday Cake (Hard Version)

如果两个有效的点之间的个数为奇数,记为cnt,那么只需要(cnt-1)/2个点就可以产生cnt个有效点,如果为偶数的话,那么需要cnt/2个点产生cnt个有效点

所以优先奇数

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
int n,x,y;
void solve() {cin>>n>>x>>y;vector<int>res;for(int i=0;i<x;i++){int d;cin>>d;res.push_back(d);}int ans=x;int len=res.size();sort(res.begin(),res.end());vector<int>ji,ou;int l=res[0]+n-res[len-1]-1;if(l%2&&l) ji.push_back(l);else ou.push_back(l);for(int i=1;i<len;i++){int l=res[i]-res[i-1]-1;if(l%2) ji.push_back(l);else ou.push_back(l);}sort(ji.begin(),ji.end());sort(ou.begin(),ou.end());for(int i=0;i<(int)ji.size();i++){if(ji[i]/2<=y){ans+=ji[i];y-=ji[i]/2;}else {ans+=y*2;y=0;break;}}for(int i=0;i<(int)ou.size();i++){if(ou[i]/2<=y){ans+=ou[i];y-=ou[i]/2;}else{ans+=y*2;y=0;break;}}cout<<ans-2<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--) {solve();}return 0;
}

这篇关于CodeTON Round 8 (Div. 1 + Div. 2, Rated, Prizes!)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/865253

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

创建一个大的DIV,里面的包含两个DIV是可以自由移动

创建一个大的DIV,里面的包含两个DIV是可以自由移动 <body>         <div style="position: relative; background:#DDF8CF;line-height: 50px"> <div style="text-align: center; width: 100%;padding-top: 0px;"><h3>定&nbsp;位&nbsp;

Codeforces Round 971 (Div. 4) (A~G1)

A、B题太简单,不做解释 C 对于 x y 两个方向,每一个方向至少需要 x / k 向上取整的步数,取最大值。 由于 x 方向先移动,假如 x 方向需要的步数多于 y 方向的步数,那么最后 y 方向的那一步就不需要了,答案减 1 代码 #include <iostream>#include <algorithm>#include <vector>#include <string>

CF#271 (Div. 2) D.(dp)

D. Flowers time limit per test 1.5 seconds memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/474/problem/D We s

CF #278 (Div. 2) B.(暴力枚举+推导公式+数学构造)

B. Candy Boxes time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/488/problem/B There

CF#278 (Div. 2) A.(暴力枚举)

A. Giga Tower time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output 题目链接: http://codeforces.com/contest/488/problem/A Giga To