您当前的位置: 首页 > 

minato_yukina

暂无认证

  • 1浏览

    0关注

    138博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

6.14训练日记

minato_yukina 发布时间:2022-06-14 20:07:48 ,浏览量:1

床睡得还不是很习惯,起晚了点. 12点开始训练(未吃饭),先打开cf逛一逛.

一 :C. Manipulating History(思维)

链接 题意:一开始你有一个长度为1的字符串.第i次操作中,可以把 t 2 i − 1 t_{2i-1} t2i−1​替换成 t 2 i t_{2i} t2i​.然而现在给你的是一堆 t i t_i ti​,和最终得到的字符串 S S S.问你最开始的字符串是哪个?保证这个答案是唯一的. 思路:非常重要的观察,一开始只有一个字母,我们也只需要找到这个字母就可以.让我们思考一下,我们需要把长度为1最开始的字符串逐个替换得到这个最终字符串S. s->S1->S2->…S 当S的长度为1时,又由于答案是唯一的,肯定是逐个字符替换,每个非答案的字母出现了偶数次,只有一个字母出现了奇数次.那个就是最终的答案(除了最后一个) 比如说长度为1,n=4 a b b c,c 那么答案就一定是a. a->b,b->c这样变化,然后最后的c会重复出现在n+1个 当S长度不是1的时候,情况是类似的.当某个字母中间需要替换(或者最后)时,它一定会导致偶数次的出现情况.又因为答案是唯一的,所以答案是出现次数为奇数次的字母. 代码:

#include
using namespace std;
const int maxn = 1e6+5;
const int INF = 1e9+7;
typedef long long ll;
typedef pair pii;
int main(){
    ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int T;cin>>T;
	while(T--){
		int n;cin>>n;
		map cnt;
		for(int i=1;i>s;
			for(auto x : s) cnt[x]++;
		}
		for(auto [x,y]:cnt){
			if(y%2==1){
				coutn>>k;
		vector a(n+1,0);
		ll sum=0;
		for(int i=1;i>a[i],sum+=a[i];
		if(n==k){
			cout>k;
		ll sum = 0;
		vector a(n+1,0);
		for(int i=1;i>a[i];sum+=a[i];
		}
		if(k>=n){
			cout            
关注
打赏
1663570241
查看更多评论
0.0557s