首页 > 其他分享 >CF 1714 F

CF 1714 F

时间:2022-09-29 21:46:09浏览次数:61  
标签:rt nxt emplace 1714 int back CF ans

我来力!(喜)
本题作为比赛中最难的题,其地位堪比 Igallta 。(什

题面

这里空空如也,什么也没有哦 ~

思路

设 $ x = d_{12}, y = d_{31}, z = d_{23} $,解三元一次方程组

\[\begin{cases} a + b = x \\ a + c = y \\ b + c = z \end{cases} \]

$ a, b, c $ 分别代表 $ 1 $ 到根的距离,$ 2 $ 到根的距离,$ 3 $ 到根的距离。
设根为 $ r $ 。

  • 如果 $ a = 0 $ ,则 $ r = 1 $;
  • 如果 $ b = 0 $ ,则 $ r = 2 $;
  • 如果 $ c = 0 $ ,则 $ r = 3 $;
  • 如果每个都不成立,则 $ r = 4 $。

接着,我们从 $ r $ 开始,不断连一个空闲节点,最后把最后一个用的节点连到 $ 1 $ ,$ 2 $ 或 $ 3 $ 。
完成。

#include <bits/stdc++.h>
using namespace std;

vector<pair<int, int> > ans;

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		ans.clear();
		int n, x, y, z;
		scanf("%d %d %d %d", &n, &x, &z, &y);
		bool flag = 1;
		int abc = (x + y + z) / 2;
		if (abc * 2 != x + y + z) {
			flag = 0;
		}
		int a = abc - z, b = abc - y, c = abc - x;
		if (a + b + c >= n) {
			flag = 0;
		}
		int rt;
		if (a == 0) rt = 0;
		else if (b == 0) rt = 1;
		else if (c == 0) rt = 2;
		else rt = 3;
		int nxt = (rt == 3) ? (3) : (2);
		
		flag &= ((a >= 0) && (b >= 0) && (c >= 0));
		
		if (a) {
			if (a == 1) {
				ans.emplace_back(rt, 0);
			} else {
				ans.emplace_back(rt, ++nxt);
				for (int i = 1; i < a - 1; i++) {
					ans.emplace_back(nxt, nxt + 1);
					nxt++;
				}
				ans.emplace_back(nxt, 0);
			}
		}
		
		if (b) {
			if (b == 1) {
				ans.emplace_back(rt, 1);
			} else {
				ans.emplace_back(rt, ++nxt);
				for (int i = 1; i < b - 1; i++) {
					ans.emplace_back(nxt, nxt + 1);
					nxt++;
				}
				ans.emplace_back(nxt, 1);
			}
		}
		if (c) {
			if (c == 1) {
				ans.emplace_back(rt, 2);
			} else {
				ans.emplace_back(rt, ++nxt);
				for (int i = 1; i < c - 1; i++) {
					ans.emplace_back(nxt, nxt + 1);
					nxt++;
				}
				ans.emplace_back(nxt, 2);
			}
		}
		
		while (nxt < n - 1) {
			ans.emplace_back(rt, ++nxt);
		}
		
		if (flag) {
			puts("YES");
			for (auto edge : ans) {
				printf("%d %d\n", edge.first + 1, edge.second + 1);
			}
		} else {
			puts("NO");
		}
	}
	return 0;
}

Bye!!!

标签:rt,nxt,emplace,1714,int,back,CF,ans
From: https://www.cnblogs.com/AProblemSolver/p/16743178.html

相关文章

  • 【luogu CF618G】Combining Slimes(矩阵乘法)(DP)
    CombiningSlimes题目链接:luoguCF618G题目大意有一个长度为n的栈,如果栈顶两个值都是x就会合并成x+1,一开始没有东西。你有p的概率放进去一个1,1-p的概率放入2......
  • CF149D Coloring Brackets
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglongclasssolve{ public: chars[777]; intf[1000][1000][3][3]; intmod; intothers[1000......
  • CF#460 E Congruence Equation
    求满足\[n\cdota^n\equivb\pmod{p}\]的\(n(1<n<x)\)的个数,令\(n=(p-1)t+k(0\lek<q-1)\),那么\[n\equivb\cdota^{-k}\pmod{p}\]那么枚举\(k\),求满足条件的\(......
  • 题解【CF1632E1 Distance Tree (easy version)】
    CF1632E1DistanceTree(easyversion&hardversion)解题报告。不一定更好的阅读体验。E2没有地方交了所以就交到E1了。震撼挺大的一道题,钦定\(1\)为根。先......
  • CF1182E 名字太长不想打 题解
    题解区都是用矩阵直接算封闭形式中\(f_1,f_2,f_3\)的系数的,这里给个更偏MO风格的做法。首先先想办法用\(f_x\cdotk(x)\)代\(f_x\)以消掉\(c^{2x+6}\)这个不好......
  • CF1526E Oolimry and Suffix Array 组合数学
    看起来是后缀数组,但是看到求方案数就是dp,计数啥的了问满足后缀数组的字符串方案有多少观察样例,发现rk相邻的所在位置,字母要么是相等,要么是比其大大的话条件直接满足了,相......
  • CF1693E
    考虑到一个结论就是\(a_i\)会变成两种操作变成的数的最小值。看着就很对啊,感性理解就好了。我们从大到小考虑每一个值。当访问一个值时,我们将其所有位置都标记成“未......
  • CF1693F
    首先可以假定整个序列\(c_0\gec_1\),否则我们把\(0\)变成\(1\),\(1\)变成\(0\),并翻转序列。新序列答案与原序列相同。结论:仅操作\(c_0=c_1\)的区间的最小答案和原......
  • CF1730B Meeting on the Line
    题目链接https://codeforces.com/contest/1730/problem/B题意简述\(x\)轴上有\(n\)个人,他们的位置分别是\(x_i\),现在他们想要聚会,需要找一个位置(可以为小数),......
  • 【CF468D】 Tree
    CF468DTree以树的重心为根i和pi不能在同一个子树中贪心求出方案点击查看代码</details>#include<set>#include<stdio.h>#include<string.h>#include<alg......