首页 > 其他分享 >「杂题乱写」AGC 001

「杂题乱写」AGC 001

时间:2023-06-06 11:45:02浏览次数:45  
标签:return 乱写 ll AGC ++ 001 ans inline rnt

「杂题乱写」AGC 001

点击查看目录

目录

A | BBQ Easy

排序奇数项求和,贪心正确性显然。

B | Mysterious Light

发现可以分割成若干个等边三角形,考虑计算等边三角形的边长之和。

发现边长就是 \(n - x\) 与 \(x\) 不断更相减损,其和为 \(n - \gcd(n, x)\)。

那么答案就是 \(3(n - \gcd(n, x))\)。

C | Shorten Diameter

枚举直径中心,判断多少个点与这个中心距离小于等于 \(\left\lfloor\frac{k}{2}\right\rfloor\) 即可得知需要扔几个点。\(k\) 为奇数中心是条边,是偶数中心是个点。

D | Arrays and Palindrome

有趣的构造题。

不难发现把每个数看成一个点,那么要求一个子串为回文可以转化为一堆点连边,两个点联通说明这两个数相等,如下图:

从官方题解贺的

一个合理的构造是直接错排一位,如上图。

但是注意一个长度为奇数的回文的中心不会连边,如果这样的回文数量大于 \(2\),用 \(b\) 数组是无法解决的,否则需要特殊处理一下。

点击查看代码
const ll N = 1e5 + 10;
namespace SOLVE {
	ll n, m, a[N], c1, ans, b[N];
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline ll cmp (ll x, ll y) { return (x & 1) > (y & 1); }
	inline void In () {
		n = rnt (), m = rnt ();
		_for (i, 1, m) a[i] = rnt (), c1 += a[i] & 1;
		return;
	}
	inline void Solve () {
		if (m == 1) {
			ans = 2, b[1] = 1, b[2] = a[1] - 1;
			return;
		}
		if (c1 > 2) { ans = -1; return; }
		std::sort (a + 1, a + m + 1, cmp);
		_for (i, 3, m) std::swap (a[i], a[i - 1]);
		b[++ans] = a[1] + 1;
		_for (i, 2, m - 1) b[++ans] = a[i];
		b[++ans] = a[m] - 1;
		return;
	}
	inline void Out () {
		if (ans == -1) { puts ("Impossible"); return; }
		if (!b[ans]) --ans;
		_for (i, 1, m) printf ("%lld ", a[i]);
		printf ("\n%lld\n", ans);
		_for (i, 1, ans) printf ("%lld ", b[i]);
		puts ("");
		return;
	}
}

E | BBQ Hard

这个 trick 我是真想不到。jjdw 说这个 trick 是类似「来自学长的馈赠 1」的,看了一下确实,越学越倒退是吧。

一个比较经典的东西是 \(\dbinom{x + y}{x}\) 可表示从 \((0, 0)\) 出发只能向右或向上走走到 \((x, y)\) 的方案数。

那么 \(\dbinom{a_i + b_i + a_j + b_j}{a_i + a_j}\) 的组合意义就是从 \((-a_i, -b_i)\) 出发只能向右或向上走走到 \((a_j, b_j)\) 的方案数。

那么设 \(f_{x, y}\) 表示共有多少种方案可以走到 \((x, y)\),初始所有 \(f_{-a_i, -b_i}\) 为 \(1\)。转移方程:\(f_{i, j} \leftarrow f_{i, j} + f_{i - 1, j} + f_{i, j - 1}\)。

注意到会把从 \((-a_i, -b_i)\) 走到 \((a_i, b_i)\) 给算上,这一部分是多余的。同时还要求 \(i < j\),因此答案要除二。那么最后统计答案为 \(\dfrac{1}{2}\sum_{i = 1}^{n}(f_{a_i, b_i} - \dbinom{2a_i + 2b_i}{2a_i})\)。

点击查看代码
const ll N = 2e5 + 10, M = 4e3 + 10, P = 1e9 + 7;
namespace SOLVE {
	ll n, a[N], b[N], f[M][M], ans;
	ll fac[M << 1], inv[M << 1];
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline ll FastPow (ll a, ll b) {
		ll ans = 1;
		while (b) {
			if (b & 1) ans = ans * a % P;
			a = a * a % P, b >>= 1;
		}
		return ans;
	}
	inline ll C (ll x, ll y) { return fac[x] * inv[y] % P * inv[x - y] % P;}
	inline void Pre () {
		fac[0] = 1;
		_for (i, 1, 8000) fac[i] = fac[i - 1] * i % P;
		inv[8000] = FastPow (fac[8000], P - 2);
		for_ (i, 7999, 0) inv[i] = inv[i + 1] * (i + 1) % P;
		return;
	}
	inline void In () {
		n = rnt ();
		_for (i, 1, n) a[i] = rnt (), b[i] = rnt ();
		return;
	}
	inline void Solve () {
		Pre ();
		_for (i, 1, n) ++f[2001 - a[i]][2001 - b[i]];
		_for (i, 1, 4001) _for (j, 1, 4001) f[i][j] = (f[i][j] + f[i - 1][j] + f[i][j - 1]) % P;
		_for (i, 1, n) {
			ll qwq = f[a[i] + 2001][b[i] + 2001];
			ll awa = C (2 * (a[i] + b[i]), 2 * a[i]);
			ans = (ans + qwq - awa + P) % P;
		}
		return;
	}
	inline void Out () {
		printf ("%lld\n", ans * FastPow (2, P - 2) % P);
		return;
	}
}

F | Wide Swap

首先转化,定义一个序列 \(Q\) 使得 \(Q_{p_i} = i\)。然后发现交换条件变成了相邻两个数绝对值大于等于 \(k\) 时可以交换。

那么考虑使用一些特殊方法排序,注意到对于一个数对 \((Q_i, Q_j)(i < j)\),当 \(\min_{k = i}^{j - 1}Q_k \ge Q_j + k\) 时两者可以交换过来且对答案作正贡献。

那么考虑归并排序,维护前一半的后缀最小值。

点击查看代码
const ll N = 5e5 + 10;
namespace SOLVE {
	ll n, k, a[N], b[N], mn[N], ans[N];
	inline ll rnt () {
		ll x = 0, w = 1; char c = getchar ();
		while (!isdigit (c)) { if (c == '-') w = -1; c = getchar (); }
		while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();
		return x * w;
	}
	inline void Merge (ll l, ll r) {
		if (l == r) return;
		bdmd; Merge (l, mid), Merge (mid + 1, r);
		ll po = l - 1, pl = l, pr = mid + 1;
		mn[mid] = a[mid];
		for_ (i, mid - 1, l) mn[i] = std::min (mn[i + 1], a[i]);
		while (pl <= mid && pr <= r) {
			if (mn[pl] >= a[pr] + k) b[++po] = a[pr++];
			else b[++po] = a[pl++];
		}
		while (pl <= mid) b[++po] = a[pl++];
		while (pr <= r) b[++po] = a[pr++];
		_for (i, l, r) a[i] = b[i];
		return;
	}
	inline void In () {
		n = rnt (), k = rnt ();
		_for (i, 1, n) a[rnt ()] = i;
		return;
	}
	inline void Solve () {
		Merge (1, n);
		_for (i, 1, n) ans[a[i]] = i;
		return;
	}
	inline void Out () {
		_for (i, 1, n) printf ("%lld\n", ans[i]);
		return;
	}
}

整了个好玩的:

这是官方题解。

标签:return,乱写,ll,AGC,++,001,ans,inline,rnt
From: https://www.cnblogs.com/Keven-He/p/AGC001.html

相关文章

  • 001.对工作的一些反思
    1、田忌赛马的反思1、田忌赛马的故事告诉我们,做事的顺序不同,效果差距很大。先做什么,后做什么,顺序不可颠倒。2、关于我这个人1、从秃子来说,我有些地方,比如说:多干活少说话,多干活说明我是个勤劳的人,少说话是因为,话多容易热是非。2、为什么李林林说我飘了?宁老师一走,别......
  • 0001-虚函数和虚表笔记
    目录一个空对象至少占用1字节的空间展开查看:原因是在栈上分配2个对象时,要区分地址classObject{};voidFunction(){Objecto1,o2;//需要区分o1,o2的地址}空类有虚函数,需要占用一个指针的空间,即:编译器会插入一个虚函数表指针vptr有虚函......
  • [AGC050F] NAND Tree
    求一个计数方案奇偶性的题考虑套路的交换两个元素。考虑最开始选的两条边,如果它们没有交,那么互换顺序之后结果不变。我们只需要统计相交的情况即可。再考虑边相邻的情况。对于y---x---z,按两种顺序缩边的结果分别为\(\operatorname{NAND}(\operatorname{NAND}(y,x),z)\)和\(\op......
  • 题解:【AGC054D】 (ox)
    题目链接Larry76牛牛首先考虑没有ox怎么做,就是将括号序列调成合法。\(|S|\)不大直接模拟一遍,记录\(now\)表示一个前缀权值,当遇到一个(时\(+1\),遇到一个)时\(-1\),当\(now<0\)的时候说明序列不合法即)多了,暴力向后找到第一个(交换到当前的)前面。这样我们......
  • P1001 A+B Problem
    A+BProblem题目背景强烈推荐新用户必读帖。不熟悉算法竞赛的选手请看这里:算法竞赛中要求的输出格式中,不能有多余的内容,这也包括了“请输入整数$\bma$和$\bmb$”这一类的提示用户输入信息的内容。若包含了这些内容,将会被认为是WrongAnswer,即洛谷上的WA。在对比代码输......
  • COS20019云计算架构
    COS20019CloudComputingArchitecture-Assignment02ScalableCloudComputingArchitecture(30%)Table1.ModificationHistoryDate(created/modified)Purposes2023-04-28Createdtheassignment2023-05-06Finalizetheassignment2023-05-16Revisedassuggested......
  • bzoj1001 [BeiJing2006]狼抓兔子(网络流dinic算法||最短路spfa)
    http://www.lydsy.com/JudgeOnline/problem.php?id=10011001:[BeiJing2006]狼抓兔子TimeLimit: 15Sec  MemoryLimit: 162MBSubmit: 24017  Solved: 6068[Submit][Status][Discuss]Description现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓......
  • [AGC038E] Gachapon
    ProblemStatementSnukefoundarandomnumbergenerator.Itgeneratesanintegerbetween$0$and$N-1$(inclusive).Anintegersequence$A_0,A_1,\cdots,A_{N-1}$representstheprobabilitythateachoftheseintegersisgenerated.Theinteger$i$($0......
  • 001 数据库学习笔记
    数据库:文件和文件组组成。数据库文件==》1.主要数据文件:存放数据和数据库的初始化信息;每个数据库有且只能有一个;.mdf扩展名;2.次要数据文件:存放除了主要数据文件以为的所有数据文件;次要数据文件不是必须的,可以没有;可以是一个或多个;.ndf扩展名;3.事务日志文件:存放用于恢复数据......
  • P1001 A+B Problem
    考虑只用位运算去解决。\(a+b\)可以表示成\((a\landb)+(a\veeb)\),即把共有的\(1\)和独有的\(1\)分开。因为\((a\landb)\in(a\veeb)\),所以可以将前者左移一位,后者异或上前者,和保持不变。这样又回到了第一步,递归计算即可,边界条件为\(a=0\)。其实就是在模拟二进制加......