Codeforces Round #613 (Div. 2) 题解

Mezo Playing Zoma

[Time Limit: 1 squad Memory Limit: 256 MB ]

可以到达的最左是 (-L个数),最右是 (R个数),所以答案就是相减一下。

view
/*************************************************************** 
    > File Name        : a.cpp
    > Author           : Jiaaaaaaaqi
    > Created Time     : 2020/1/10 22:04:03
 ***************************************************************/

#include <bits/stdc++.h>
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
#define  dbg(x)     cout << #x << " = " << (x) << endl
#define  mes(a, b)  memset(a, b, sizeof a)

using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int    maxn = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;

int n, m;
int cas, tol, T;

char s[maxn];

int main() {
	// freopen("in", "r", stdin);
	scanf("%d", &n);
	scanf("%s", s+1);
	int x = 0, y = 0;
	for(int i=1; i<=n; i++) {
		x -= s[i]=='L';
		y += s[i]=='R';
	}
	printf("%d
", y-x+1);
	return 0;
}

Just Eat It!

[Time Limit: 1 squad Memory Limit: 256 MB ]

对于第二个人肯定是抛弃左边一侧或者右边一侧的若干个数字,所以只需要判断是否存在前缀或者后缀小于等于0即可。

view
/*************************************************************** 
    > File Name        : b.cpp
    > Author           : Jiaaaaaaaqi
    > Created Time     : 2020/1/10 22:07:25
 ***************************************************************/

#include <bits/stdc++.h>
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
#define  dbg(x)     cout << #x << " = " << (x) << endl
#define  mes(a, b)  memset(a, b, sizeof a)

using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int    maxn = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;

int n, m;
int cas, tol, T;

int a[maxn];

bool solve() {
	ll ans = 0;
	for(int i=1; i<=n; i++) {
		ans += a[i];
		if(ans <= 0)	return false;
	}
	ans = 0;
	for(int i=n; i>=1; i--) {
		ans += a[i];
		if(ans <= 0)	return false;
	}
	return true;
}

int main() {
	// freopen("in", "r", stdin);
	scanf("%d", &T);
	while(T--) {
		scanf("%d", &n);
		for(int i=1; i<=n; i++) {
			scanf("%d", &a[i]);
		}
		puts(solve() ? "YES" : "NO");
	}
	return 0;
}

Fadi and LCM

[Time Limit: 1 squad Memory Limit: 256 MB ]

先质因子分解,然后就得到了若干个数把他们分配到两个数字上,由于数字只会有 (11) 个,因为前 (12) 个素数相乘就超过 (1e12) 了,所以可以直接暴力状压或者暴力 (01) 背包。

view
/*************************************************************** 
    > File Name        : c.cpp
    > Author           : Jiaaaaaaaqi
    > Created Time     : 2020/1/10 22:13:23
 ***************************************************************/

#include <bits/stdc++.h>
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
#define  dbg(x)     cout << #x << " = " << (x) << endl
#define  mes(a, b)  memset(a, b, sizeof a)

using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int    maxn = 1e6 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;

ll n, m;
int cas, tol, T;

bool dp[maxn];

int main() {
	// freopen("in", "r", stdin);
	scanf("%lld", &n);
	vector<ll> g;
	for(ll i=2; i*i<=n; i++) {
		if(n%i==0) {
			ll res = 1;
			while(n%i==0) {
				res *= i;
				n /= i;
			}
			g.pb(res);
		}
	}
	if(n!=1)	g.pb(n);
	g.pb(1);
	sort(g.begin(), g.end());
	tol = g.size();
	ll ans = 1;
	for(int i=0; i<tol; i++)	ans *= g[i];
	ll n = 0;
	for(; n*n<=ans; n++);
	mes(dp, 0);
	dp[1] = 1;
	for(int i=0; i<tol; i++) {
		for(ll j=n-1; j>0; j--) {
			if(j%g[i]==0)	dp[j] |= dp[j/g[i]];
		}
	}
	for(ll i=n-1; i>0; i--) {
		if(dp[i])	return 0*printf("%lld %lld
", i, ans/i);
	}
	return 0;
}

Dr. Evil Underscores

[Time Limit: 1 squad Memory Limit: 256 MB ]

先建 (01) 字典树,然后从高位到低位开始贪心,如果字典树某个节点同时存在 (0)(1) 的边,那么不管 (X) 这一位是 (0) 或者 (1),总会与一个数字 (xor) 出来后,这一位为 (1),其他情况都可以使这一位为 (0),一直贪心到根即可。

view
/*************************************************************** 
    > File Name        : d.cpp
    > Author           : Jiaaaaaaaqi
    > Created Time     : 2020/1/10 22:53:46
 ***************************************************************/

#include <bits/stdc++.h>
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
#define  dbg(x)     cout << #x << " = " << (x) << endl
#define  mes(a, b)  memset(a, b, sizeof a)

using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int    maxn = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;

int n, m;
int cas, tol, T;

int a[maxn];
int node[maxn*30][2];

void insert(int x) {
	int root = 0;
	for(int i=30; i>=1; i--) {
		int k = x&(1ll<<(i-1)) ? 1 : 0;
		if(node[root][k]==0) {
			mes(node[++tol], 0);
			node[root][k] = tol;
		}
		root = node[root][k];
	}
}

ll dfs(int root, int deep) {
	if(deep == 0)	return 0;
	ll ans = 0;
	if(node[root][0] && node[root][1])	
		ans += (1ll<<(deep-1));
	ll tmp = INF;
	if(node[root][0])	tmp = min(tmp, dfs(node[root][0], deep-1));
	if(node[root][1])	tmp = min(tmp, dfs(node[root][1], deep-1));
	return tmp+ans;
}

int main() {
	// freopen("in", "r", stdin);
	tol = 0;
	scanf("%d", &n);
	for(int i=1; i<=n; i++) {
		scanf("%d", &a[i]);
		insert(a[i]);
	}
	ll ans = dfs(0, 30);
	printf("%lld
", ans);
	return 0;
}
原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/12184716.html