做题小结

https://codeforces.com/contest/2047/problem/A

这题简单翻译就是包含
还真挺麻烦的 作为一个A题

一个规律 就是 第一层1 第二层包含的话需要8块 凑成一个3*3 接着是16块。。。
其实就是52-32=16 72-52=24块就是这样一个规律
1 8 16 24 32

https://codeforces.com/contest/2040/problem/C

这题 是一个很好的题 我题目还看错了 以为所有的p了 其实是最大值的p里
先翻译下 就是 给你一个n 然后你要按照题目sp那样算 全排列里中挑那些最大值的
排列中出来 这一部分就是我们要操作的对象 让给你一个k 问你这一部分中第k个是谁
如果k大了就输出-1

就这样 首先我们要明白怎么才能弄出最大值的排列 那些要满足什么特性

首先我们考虑一个数的放置问题
理论上来说一个数都需要用到(n-i+1)次 比如1 2 3 4 中 2是可以被计算 2可以算3次 3两次 但是4 1 2 3 就少算了2的次数 才两次 而且3也才1次 很明显sum综合变小了
那么怎么样才能像1 2 3 4 一样一个排列可以算出最大值呢

其实只需要从小到头放 一个数每次放在(头尾向内的队列)的最外侧(头或者尾)就行
这里和以前做过的题目有误区 别以为是放置的一个排列头或者尾巴放数 他是一个向内缩的队列 具体看下图 文字不好描述
这是一个需要时时刻刻保持敏感的知识

比如2来说 如果你发在最外层 比如尾巴的那个方向的外面 后面的所有数都肯定只好放你前面了 一定刚好够n-i+1次
如果是头后面都在你后面 所以同理

所以理论这个放置有多少种呢 你肯定会想2^N次方

错啦 是2^(N-1)
你肯定又说 噢 肯定是1一开始没地方放 所以他放哪都一样 所以他不算
说出这一句话 那你肯定我之前说的你全都没理解
我说的最外侧是什么样子呢

是这一个 是一个往内部缩减的队列 所以1一开始可以放头或者尾 比如n=4我们可以得到8个最大值排列

1xxx 1xxx 1xxx 1xxx xxx1 xxx1 xxx1 xxx1 手打没复制(——sb——)
这个1放置是很关键的 是一个分水岭 待会你就能理解了1放后面的就是 一半

那回到正题 为什么是n-1 是因为对于最大的那个数 他没得选了 因为他是哪里有位置去哪里的
毕竟是向内缩的 而且放哪他都是算一次

好 所以最多2^n-1次 那么k大于他肯定就不行了 这是-1的判断

回到k 我们怎么确定呢 注意题目排列是从小到大的 所以k=1 反而是指1 2 3 4 这种

刚才讲了那个1是一个分水岭对吧 1放后面的话 第一个就是 是2^n-1 /2+1
所以我们怎么确定呢 轮到某一个数的时候 如果他放前了 注定会使得排列的字典序变的比之后的放置都小
放后的话就可以让更大的数可以放前 增大排列的rank

所以我们抓住这一个特点去解题

轮到一个i时 我们看此时还剩多少排列 应该是2^(N-1-i)的排列这么多
我的理解其实是这个值表示的是分水岭的值
比如你k大于这个值 证明你是越过了分水岭 否则不然

比如你k=8 是4 3 2 1

k-=4 k=4 1放最右边 xxx1
k-=2 k=2 2放最右边 xx21
k-=1 k=1 3放最右边 x321枚举到n-1就挺
如果你k=7

k-=4 k=3 1放最右边 xxx1
k-=2 k=1 2放最右边 xx21
此时k==1的 那么请注意4 3 1 2 是不可能是最大sp的 hhh 不满足我们的结论
那么此时是3 4 2 1 是第二大的 rank=7 放最左边去了 所以按照这个思路就可以码了 只要等于分水岭
都不算越过分水岭 都在他左边

	int r=n;
	int l=1;
	while(step<=n-1)
	{
		 if(k<=0)break;
		int w=n-step-1;
		if(n-step-1>=60)w=60;//防止炸ll 反正k不可能大于2的60次 这一步也需要想一会的 
		int x=qpow(2,w);
		if(k<=x){
			ans[l++]=step;	
		}
		else 			
		ans[r--]=step,k-=x;
		step++;		
	}

https://codeforces.com/contest/2049/problem/B

这个题我做红温了 以至于我去看题解看了还是一直wa 彻底红温

都不想看交了多少发

这题的话s只能出现在p之后 然后不能sp都在中间 前后都有点那种 也是不行的 所以点只能没有或在只在一端
然后还有一个点 也是我没想到的
我举个例子 ssp.你觉得可能吗 很明显不可能对于第二个s与p他们形成一个一体的那么前后的东西

这2个黄的矛盾的 认识到这一点不容易啊
所以对于.spp也是同理 注意到

也就是说 只能是什么情况可以呢 头s剩下全是p或者点 spppp.是可以的 s.p.也行 都没什么 把.当作p就行
或者尾巴是p前面全是sss也是可以的 .只能在p后面sssp.. 这样才行 还有少了s或者p或者都没有 别的都是不行的
这题就做完了 我的评价是

posted @ 2025-01-23 00:44  LteShuai  阅读(34)  评论(0)    收藏  举报