Codeforces Round 923 (Div. 3)E. Klever Permutation 找规律,有共同区间

2024-02-08 10:36

本文主要是介绍Codeforces Round 923 (Div. 3)E. Klever Permutation 找规律,有共同区间,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Problem - E - Codeforces

目录

Source of idea:

思路:

代码:

另一个up的找规律的解法:


Source of idea:

Codeforces Round 923(A-F题解) - 哔哩哔哩 (bilibili.com)

 

思路:

上面up分析的很好。两个相邻区间也就端点不一样,加1减1循环或者减1加1循环即可。

1.明确每个区间是什么,发现区间有交集。
2.区间差距是1,区间差异也就是非交集的两个数的差,所以差1。
3.所有区间都要只差1,线性看的话,加1减1即可。

 //题目的组数是n-k+1组        (n-k+1个首) 


//我们用来构造的组数是n/k+1组:        a, b, c, d, a + 1, b - 1, c + 1, d - 1, a + 2, b - 2

所以我们找出第一组,后面对前面加减即可。

 小的数绝对够加,大的数绝对够减,我们的组的组数可能不是整数,也就是说有个别值会比其他值多加一次,比如上面例子两个半组,前两个数a ,b就要加减2次,而其他的c ,d只加减1次。

代码:

void solve()
{int n, k;cin >> n >> k;int g = n / k;int d = n % k;int maxo = n;//最大值int mino = 1;//一加一减//顺序无所谓//那就小的加,大的减吧vector<int>group;int flag = 1;//我们确定的是第一组就够了for (int i = 0; i < d; i++)//多出来非整一组,需多加一次{if (flag == 1){group.push_back(mino);mino += g+1;flag = 0;}else{group.push_back(maxo);maxo -= g+1;flag = 1;}}int tmpg = k-d;for (int i = 0; i < tmpg; i++){if (flag == 1){group.push_back(mino);mino += g;flag = 0;}else{group.push_back(maxo);maxo -= g;flag = 1;}}for (int i = group.size(); i < n; i++){if (flag == 1){group.push_back(group[i - k] + 1);flag = 0;}else{group.push_back(group[i - k] - 1);flag = 1;}}for (auto x : group)cout << x << " ";cout << endl;return;
}signed main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t = 1;cin >> t;for (int i = 1; i <= t; i++){solve();}return 0;
}

另一个up的找规律的解法:

 冬权九暮的动态-哔哩哔哩 (bilibili.com)

 

(第一组是这几个划分的第一个数的集合,可以看出也是一加一减,其实没有上面那个分析的系统,但这种做题想法值得学习。)

这篇关于Codeforces Round 923 (Div. 3)E. Klever Permutation 找规律,有共同区间的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统

hdu 1754 I Hate It(线段树,单点更新,区间最值)

题意是求一个线段中的最大数。 线段树的模板题,试用了一下交大的模板。效率有点略低。 代码: #include <stdio.h>#include <string.h>#define TREE_SIZE (1 << (20))//const int TREE_SIZE = 200000 + 10;int max(int a, int b){return a > b ? a :

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

hdu4267区间统计

题意:给一些数,有两种操作,一种是在[a,b] 区间内,对(i - a)% k == 0 的加value,另一种操作是询问某个位置的值。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import

hdu4417区间统计

给你一个数列{An},然后有m次查询,每次查询一段区间 [l,r] <= h 的值的个数。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamRead

hdu3333区间统计

题目大意:求一个区间内不重复数字的和,例如1 1 1 3,区间[1,4]的和为4。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja