2023牛客多校第七场 - C M

比赛地址:传送门
赛时过了 2 题,菜死了
C 思维签到题
M 思维签到题

C Beautiful Sequence - 还在理解

题意
你需要求出字典序第 k 小的长度为 n 的非递减序列 $A = (A_1, A_2, ..., A_n) $,满足:

  • 对于每一个 \(A_i (1 \le i \le n)\)\(0 \le A_i < 2^{30}\)
  • 对于每一个 \(1 \le i < n\) 都满足 \(A_i \oplus A_{i + 1} = B_i\),其中 B 为给定序列

思路
详见代码。。。

代码

//>>>Qiansui
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x, y, sizeof(x))
#define debug(x) cout << #x << " = " << x << '\n'
#define debug2(x,y) cout << #x << " = " << x << " " << #y << " = "<< y << '\n'
//#define int long long

using namespace std;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ull, ull> pull;
typedef pair<double, double> pdd;
/*

*/
const int maxm = 2e5 + 5, inf = 0x3f3f3f3f, mod = 998244353;

void solve(){
	int n, k;
	cin >> n >> k;
	vector<int> b(n);
	vector<bool> changed(30, 0);    //判断每个位是否被锁定
	bitset<30> cur, f;              //当前数, 一开始的数
	bool ok = true;
	for(int i = 0; i < n - 1; ++ i){
		cin >> b[i];
		if(b[i] == 0) continue;
		else{
			int lg = log2(b[i]);    //b[i]的最高位 1
			if(cur[lg] != 0){       //前面的b[i]决定当前位为 1
				if(!changed[lg]){   //当前位未改变过
					cur[lg] = 0;
					f[lg] = 1; 
				}else{              //再次遇到当前位需要改变
					ok = false;
				}
			}
			changed[lg] = 1;
		}
		cur ^= b[i];
	}
	int num = 0;
	for(int i = 0; i < 30; ++ i){
		if(!changed[i]) ++ num;
	}
	if(!ok || ok && (1 << num) < k) cout << "-1\n";
	else{
		int st = 0;
		-- k;
		for(int i = 29; i >= 0; -- i){
			if(!changed[i]){
				if(k >= (1 << (-- num))){
					k -= (1 << num);
					st += 1 << i;
				}
			}else{
				if(f[i]) st += (1 << i);
			}
		}
		cout << st << ' ';
		for(int i = 0; i < n - 1; ++ i){
			cout << (st ^ b[i]) << " \n"[i == n - 2];
			st ^= b[i];
		}
	}
	return ;
}

signed main(){
	ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	int _ = 1;
	cin >> _;
	while(_ --){
		solve();
	}
	return 0;
}

M Writing Books

思路
模拟题意,累加就行了
代码

void solve(){
	ll n, ans = 0;
	cin >> n;
	for(ll i = 1, ed = 10, st = 1; 1; ++ i){
		if(st > n) break;
		ans += (min(ed - 1, n) - st + 1) * i;
		ed *= 10; st *= 10;
	}
	cout << ans << '\n';
	return ;
}
posted @ 2023-08-07 17:00  Qiansui  阅读(20)  评论(0)    收藏  举报