首页 > 其他分享 >寒假训练1/31

寒假训练1/31

时间:2024-02-03 17:11:06浏览次数:36  
标签:cnt 训练 int 31 插入 寒假 solve 序列 --

寒假训练2024/1/31

今天主要是补题。

codeforce161E - Increasing Subsequences

题意:

T 组询问,每次给你一个 X($[2, 10^{18}]$),你需要构造一个长度不超过 200,值域 $∈[−109,109]$ 的序列使得其单调上升子序列个数恰为 X(包含空子序列且不同位置的相同上升子序列算作不同的上升子序列)。

思路:

折磨死我了,想了好久,想出来又写了俩小时(我是低能儿)

看这个x和n的数据量我觉得这个题一定与二进制有关系。

然后我又推算了一下,长度为m的严格递增的序列能得到的上升子序列是$2^m - 1$个(不加空集)

把空集抠出来,X = 1 + ($2^{a1} + 2^{a2} + ...+2^{ak}$)

按照这个思路,我写了一版代码

#include <bits/stdc++.h>
using namespace std;

void solve() {
	int n;
	cin >> n;

	int t = log2(n + 1);
	if(pow(2, t) == n + 1) {
		cout << t << endl;
		for (int i = 0; i < t; i++) {
			cout << i << " ";
		}
		cout << endl;
	}
	else {
		cout << t + n - pow(2, t) << endl;
		for (int i = 1; i <= t; i++) {
			cout << i << " ";
		}
		for (int i = 0; i < n - pow(2, t); i++) {
			cout << 1 << ' ';
		}
		cout << endl;
	}

}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int T = 1;
	cin >> T;

	while(T--) {
		solve();
	}

	return 0;
}

赛后我看wa的原因:题目要求序列元素200个以内,这个就是超过了,计算一下,大约就是$(\log_2x)^2$ 个,所以会超。

我看了一下题解,其实看了半天。

”首先,一个长为 n 的递增串能贡献的数量是 $2^n$-1。但是如果直接做是 $(\log_2x)^2$的,过不了。考虑每次在前,x个数的后面插入一个比它们都大的值的贡献是 2”,所以最开始直接插入 n个数,将减去$2^n$-1.然后再将x二进制拆分即可。“

看了这个博主说的,好像有点道理。

我又看了一眼第三个样例,是image-20240131221043502

13扣除去空集就是12,12 - 7 = 5

可以推出,一开始是三个数字,3 4 5,根据5的二进制101,在后面2个元素的位置插入和后面0个元素的时候插入,正好是答案。而且注意后面插入的数一定是比之前插入的要小从高位开始看,插入的元素递减。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int unsigned long long

vector<int>pw;
void solve() {
	int n;
	cin >> n;

	vector<int>v;
	n--;
	int t = std::__lg(n + 1);
	v.push_back(t);
	t = n - pw[t] + 1;
	
	int cnt = 0;
	while(t) {
		if(t & 1) {
			v.push_back(cnt);
		}
		cnt++;
		t >>= 1;
	}

	sort(v.begin(), v.end(), greater());
	int nn = v.size() + v[0] - 1;
	cout << nn << endl;

	vector<int>ans;
	int st = nn - v.front() + 1;
	for (int i = st; i <= nn; i++) {
		ans.push_back(i);
	}

	t = v.size() - 1;
	for (int i = 1; i < v.size(); i++) {
		ans.insert(ans.end() - v[i], t--);
	}
	
	for (auto it : ans) {
		cout << it << " ";
	}

	cout << endl;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int t = 1;
	for (int i = 0; i <= 64; i++) {
		pw.push_back(t);
		t *= 2;
	}
	int T = 1;
	cin >> T;

	while(T--) {
		solve();
	}

	return 0;
}

注意两个地方:记得数据范围,会mle。还有就是别用pow,高幂会丢失精度。

标签:cnt,训练,int,31,插入,寒假,solve,序列,--
From: https://www.cnblogs.com/yyc4591/p/18004965

相关文章

  • 代码随想录算法训练营第十一天| 20. 有效的括号 1047. 删除字符串中的所有相邻重复
    20.有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。题目链接:20.有效的括号-力扣(LeetCode)思路:只......
  • 2024牛客寒假算法基础集训营1
    题目链接A.因为判断要素较少,直接条件模拟#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+10;voidsolve(){intn;cin>>n;strings;cin>>s;intD=0,F=0,S=0,d=0,f=0,ss=0;for(inti=0;i<s.size();i++){......
  • 寒假day2 2.3 ds
    讲师:杨宁远,NOI2022Au,rk20,from成都七中DSlistauto定义指针。*i访问元素。prev(i)next(i)访问前驱、后继的值。rbrgenrend含义相反。frontback放回头元素和尾元素。insert(iterator,value),会在迭代器前插入元素。erase(iterator),删除元素。a.swap(b):O(1)merge......
  • 20240202-训练赛随记
    机场检录//二分#include<bits/stdc++.h>usingnamespacestd;longlongn,m,a[100005];boolcheck(longlongx){longlongt=0;for(inti=1;i<=n;i++)t+=(x/a[i]);returnt>=m;}intmain(){cin>>n>>m;for(inti=1;i<......
  • [转帖]彻底搞明白 GB2312、GBK 和 GB18030
    https://www.zhihu.com/people/lion-89 日常工作的过程中,关于字符编码的问题经常让人头疼不已,这篇文章就来捋一捋关于GB2312、GBK、GB18030相关的知识以及它们和Unicode的关系简介GB23121980年,中国发布了第一个汉字编码标准,也即GB2312,全称《信息交换用汉字......
  • 2.2寒假每日总结24
    使用的HBuilderX版本:3.98Git插件已安装:项目结构如下:右击项目目录,在git命令中-》检查已修改,可以发现还是能检索到修改过的文件:文件是有修改过的,但是在上图中没有任何的修改标识,这些文件也没有添加到.gitignore配置中。二、问题解决......
  • 寒假NOIP突破营笔记
    Day1枚举和搜索某些题的正解其实就是暴力,但加了一些优化三连击:暴力枚举即可DNA序列:\(O(nk)\)做法可以直接过;因为字符集大小只有\(4\),也可以使用哈希转为四进制统计\(O(n)\)栅栏:二分答案+搜索+剪枝k短路:A*:启发式搜索的一种,定义起点\(s\),终点\(t\),从起点(初始状态)开始的......
  • 2024.2.2寒假每日总结24
    算法题:1686.石子游戏VI-力扣(LeetCode)最最简单的超级马里奥训练过程fromnes_py.wrappersimportJoypadSpaceimportgym_super_mario_brosfromgym_super_mario_bros.actionsimportSIMPLE_MOVEMENTimporttimefrommatplotlibimportpyplotaspltfromstable_basel......
  • 代码随想录算法训练营第十天| 堆栈理论基础 232.用栈实现队列 225. 用队列实现栈
    堆栈理论基础 代码随想录(programmercarl.com)STL中栈往往不被归类为容器,而被归类为containeradapter(容器适配器)。栈的内部结构,栈的底层实现可以是vector,deque,list都是可以的,主要就是数组和链表的底层实现。我们常用的SGISTL,如果没有指定底层实现的话,默认是以deque为缺......
  • Poj3126 Prime Path (BFS+筛素数)
    #include<iostream>#include<queue>#include<cstring>constintN=10010;intt,aa,bb,prime[N],vis[N],step[N];usingnamespacestd;voidprime_(){//埃式筛法prime[0]=prime[1]=1;for(inti=2;i<10000;i++){if(prime[i])contin......