A
#include
#include
#include
using namespace std;
int T;
int getEven(int x)
{
int cnt = 0;
int t = x;
while (t) {
t/= 10;
cnt++;
}
int pos = -1;
t = x;
int i = 1;
while (t) {
int b = t % 10;
if (b % 2 == 0) pos = i;
t /= 10, i++;
}
if (pos == -1) return -1;
else return cnt - pos + 1;
}
int main()
{
cin >> T;
while (T--)
{
int x;
cin >> x;
if (x % 2 == 0) cout << 0 << 'n';
else {
int pos = getEven(x);
if (pos == 1) cout << 1 << 'n';
else if (pos == -1) cout << -1 << 'n';
else cout << 2 << 'n';
}
}
return 0;
}
B
#include
#include
#include
using namespace std;
int T;
int a, b;
bool check(int x)
{
if (x > a || x > b) return false;
int sum = a + b - 2*x;
return sum / 2 >= x;
}
int main()
{
cin >> T;
while (T--){
cin >> a >> b;
int r = min((a+b)/4, min(a, b));
int l = 1;
if (a == 0 || b == 0 || l > r) cout << 0 << 'n';
else {
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l << 'n';
}
}
return 0;
}
C
D
#include
#include
#include
using namespace std;
const int N = 200010;
int T;
int n;
int fa[N], w[N], dep[N];
bool check()
{
for (int i=1; i<=n; i++)
{
// cout << " i, fa[i], dep[i], dep[fa[i]] : " << i << ' ' << fa[i] << ' ' << dep[i];
// cout << ' ' << dep[fa[i]] << endl;
if (dep[fa[i]] > dep[i]) return true;
}
return false;
}
int main()
{
cin >> T;
while (T--)
{
memset(fa, 0, sizeof fa);
scanf("%d", &n);
for (int i=1; i<=n; i++)
scanf("%d", &fa[i]);
for (int i=1; i<=n; i++)
{
int x;
scanf("%d", &x);
dep[x] = i;
}
if (check()) {
cout << -1 << 'n';
continue;
}
for (int i=1; i<=n; i++) {
if (fa[i] == i) cout << 0 << ' ';
else cout << 10 * (dep[i] - dep[fa[i]]) << ' ';
}
}
return 0;
}
E-1
#include
#include
#include
#include
using namespace std;
const int N = 200010, M = 400010;
typedef pair PII;
int T;
int n, k;
int a[N], v[M], nex[M], tot;
int f[N]; // 每个点最早出现朋友的时刻
int dep[N];
int d[N];
void addEdge(int fr, int to) {
v[++tot] = to, nex[tot] = a[fr], a[fr] = tot;
}
int dfs(int u, int fa)
{
dep[u] = dep[fa] + 1;
if (f[u] == 0) return f[u] + 1;
for (int i=a[u]; i; i=nex[i]) {
int to = v[i];
if (to == fa) continue;
int temp = dfs(to, u);
f[u] = min(f[u], temp);
}
return f[u] + 1;
}
bool find(int u, int fa)
{
//cout << "u, dep[u]:" << u << ' ' << dep[u] << endl;
if (d[u] == 1 && dep[u] > 0) return true;
for (int i=a[u]; i; i=nex[i]) {
int to = v[i];
if (f[to] <= dep[to] || to == fa) continue;
if (find(to, u)) return true;
}
return false;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &k);
memset(f, 0x3f, sizeof f);
memset(a, 0, sizeof a);
memset(d, 0, sizeof d);
memset(dep, 0, sizeof dep);
for (int i=1; i<=k; i++) {
int x;
scanf("%d", &x);
f[x] = 0;
}
for (int i=1; i
E-2
#include
#include
#include
#include
using namespace std;
const int N = 200010, M = 400010;
typedef pair PII;
int T;
int n, k;
int a[N], v[M], nex[M], tot;
int f[N]; // 每个点最早出现朋友的时刻
int dep[N];
int d[N];
int fri; // 最少的朋友数量
void addEdge(int fr, int to) {
v[++tot] = to, nex[tot] = a[fr], a[fr] = tot;
}
int dfs(int u, int fa)
{
dep[u] = dep[fa] + 1;
if (f[u] == 0) return f[u] + 1;
for (int i=a[u]; i; i=nex[i]) {
int to = v[i];
if (to == fa) continue;
int temp = dfs(to, u);
f[u] = min(f[u], temp);
}
return f[u] + 1;
}
bool find(int u, int fa)
{
if (d[u] == 1 && dep[u] > 0) return true;
for (int i=a[u]; i; i=nex[i]) {
int to = v[i];
if (f[to] <= dep[to]) {
fri++;
continue;
}
if (to == fa) continue;
if (find(to, u)) return true;
}
return false;
}
int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &k);
memset(f, 0x3f, sizeof f);
memset(a, 0, sizeof a);
memset(d, 0, sizeof d);
memset(dep, 0, sizeof dep);
for (int i=1; i<=k; i++) {
int x;
scanf("%d", &x);
f[x] = 0;
}
for (int i=1; i
F
G