杂题练习10.15

本文深入解析了AtCoder和CodeForces平台上的三道经典算法题目,包括操作序列规律分析、最长上升子序列问题及树形结构的二分搜索算法。通过代码实现展示了高效的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Atcoder3958

手画几步就发现规律了,操作奇数次就是b-a,偶数就是a-b

#include <bits/stdc++.h>
#define LL long long
#define db double
using namespace std;

template <typename T> inline void read(T &x) {
	char c = getchar();
	bool f = false;
	for (x = 0; !isdigit(c); c = getchar()) {
		if (c == '-') {
			f = true;
		}
	}
	for (; isdigit(c); c = getchar()) {
		x = x * 10 + c - '0';
	}
	if (f) {
		x = -x;
	}
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
	return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
	return a > b ? a = b, true : false;
}

int main() {
	int a, b, c;
	LL k;
	read(a), read(b), read(c), read(k);
	if (k & 1) {
		printf("%d\n", b - a);
	} else {
		printf("%d\n", a - b);
	}
	return 0;
}

Atcoder3959

考虑将问题变成将两边的数插入到中间来排序

明显n-最长上升子序列就是答案

#include <bits/stdc++.h>
#define LL long long
#define db double
using namespace std;

const int MAXN = 200200;
const int INF = 0x3f3f3f3f;

template <typename T> inline void read(T &x) {
	char c = getchar();
	bool f = false;
	for (x = 0; !isdigit(c); c = getchar()) {
		if (c == '-') {
			f = true;
		}
	}
	for (; isdigit(c); c = getchar()) {
		x = x * 10 + c - '0';
	}
	if (f) {
		x = -x;
	}
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
	return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
	return a > b ? a = b, true : false;
}

int n, a[MAXN];
int cnt;
#define ls lower_bound
#define us upper_bound

signed main() {
	read(n);
	for(int i = 1, x; i <= n; i++) read(x), a[x] = i;
	int ans = 0;
	for(int i = 1, len = 0; i <= n; i++) {
		if(a[i] > a[i - 1]) {
			CheckMax(ans, ++len);
		}
		else len = 1;
	}
	printf("%d\n", n - ans);
	return 0;
}

Gym101773D

有点毒

一看求最大最小,二分答案!

然后就想这个Check怎么写

明显如果一个节点x的子节点v能接受的最大范围是[L, R]

那么x能接受的最大范围就是[L - ans, R - ans]

在所有儿子中L - ans取max, R - ans取min,如果最后R < L就不行

*的节点特判一下

#include <bits/stdc++.h>
#define LL long long
#define db double
using namespace std;

const int MAXN = 100100;
const int MAXE = 200200;
const int INF = 0x3f3f3f3f;
const double eps = 1e-7;

template <typename T> inline void read(T &x) {
	char c = getchar();
	bool f = false;
	for (x = 0; !isdigit(c); c = getchar()) {
		if (c == '-') {
			f = true;
		}
	}
	for (; isdigit(c); c = getchar()) {
		x = x * 10 + c - '0';
	}
	if (f) {
		x = -x;
	}
}

template <typename T> inline bool CheckMax(T &a, const T &b) {
	return a < b ? a = b, true : false;
}

template <typename T> inline bool CheckMin(T &a, const T &b) {
	return a > b ? a = b, true : false;
}

struct Edge {
	int to, nxt;
	Edge() {}
	Edge(int _to, int _nxt) : to(_to), nxt(_nxt) {}
}E[MAXE];

int h[MAXN], fa[MAXN], dep[MAXN], cnt;

inline void add_edge(int u, int v) {
	E[++cnt] = Edge(v, h[u]), h[u] = cnt;
	E[++cnt] = Edge(u, h[v]), h[v] = cnt;
}

bool isv[MAXN];
double L[MAXN], R[MAXN];
int v[MAXN], n;
bool cpy[MAXN];
double mid;

bool dfs(int x) {
	if(isv[x]) cpy[x] = 1;
	else cpy[x] = 0, L[x] = R[x] = v[x];
	for(int i = h[x]; i; i = E[i].nxt) {
		int to = E[i].to;
		if(to == fa[x]) continue;
		fa[to] = x;
		if(!dfs(to)) return 0;
		if(!cpy[to]) {
			if(cpy[x]) {
				cpy[x] = 0, L[x] = L[to] - mid, R[x] = R[to] + mid;
			}
			else {
				CheckMax(L[x], L[to] - mid);
				CheckMin(R[x], R[to] + mid);
			}
		}
	}
	return cpy[x] || (L[x] < R[x] + eps);
}

signed main() {
	read(n);
	for(int i = 1; i <= n; i++) {
		char s[20];
		scanf("%s", s);
		if(s[0] == '*') isv[i] = 1;
		else sscanf(s, "%d", &v[i]);
	}
	for(int i = 1; i < n; i++) {
		int x, y;
		read(x), read(y);
		add_edge(x, y);
	}
	double l = 0, r = 2000000;
	while(r - l > eps) {
		mid = (l + r) / 2;
		if(dfs(1)) r = mid;
		else l = mid;
	}
	printf("%.7lf\n", l);
	return 0;
}

CodeForces 1060E

明显的如果两个节点之间的距离是个奇数odd,新图中的距离就是odd / 2 + 1, 是偶数even就是even / 2,那么想一下,将a, b两点间距离表示为dep[a] + dep[b] - 2 * dep[lca(a, b)],因为2 * dep[lca(a, b)]是个偶数,所以只有dep[a], dep[b]中的一个是奇数,一个是偶数时它们之间的距离才是奇数

原图中的答案可以对每条边分别考虑贡献(类似于hdu6446)来求解,将答案乘2,加上距离为奇数的点对数再除以2就是新图中的答案,距离为奇数的点对就是dep为奇数的点数 * dep为偶数的点数

#include <bits/stdc++.h>
#define LL long long
#define db double
using namespace std;

const int MAXN = 200200;
const int MAXE = 400400;
const int INF = 0x3f3f3f3f;

template<typename T> inline void CheckMax(T &A, T B) {
    A < B ? A = B : A;
}

template<typename T> inline void CheckMin(T &A, T B) {
    A > B ? A = B : A;
}

template <typename T> inline void read(T &x) {
    int c = getchar();
    bool f = false;
    for (x = 0; !isdigit(c); c = getchar()) {
        if (c == '-') {
            f = true;
        }
    }
    for (; isdigit(c); c = getchar()) {
        x = x * 10 + c - '0';
    }
    if (f) {
        x = -x;
    }
}

int n;
struct Edge {
    int to, nxt;
    Edge() {}
    Edge(int _to, int _nxt) : to(_to), nxt(_nxt){}
}E[MAXE];

int h[MAXN], cnt, dep[MAXN], fa[MAXN];
LL sz[MAXN], col[2];
LL ans;

inline void add_edge(int u, int v) {
    E[++cnt] = Edge(v, h[u]), h[u] = cnt;
    E[++cnt] = Edge(u, h[v]), h[v] = cnt;
}

void dfs(int x) {
    dep[x] = dep[fa[x]] + 1, sz[x] = 1;
    for(int i = h[x]; i; i = E[i].nxt) {
        int v = E[i].to;
        if(v == fa[x]) continue;
        fa[v] = x;
        dfs(v);
        sz[x] += sz[v];
    }
}

signed main() {
    read(n);
    dep[0] = -1;
    for(int i = 1; i < n; i++) {
        int a, b;
        read(a), read(b);
        add_edge(a, b);
    }
    dfs(1);
    for(int i = 1; i <= n; i++) {
        ans += sz[i] * (n - sz[i]);
        col[dep[i] & 1] ++;
    }
    ans = ((ans + col[1] * (col[0])) >> 1);
    printf("%I64d\n", ans);
    return 0;
}

 

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值