首页 > TAG信息列表 > WC2018
「WC2018」州区划分 题解
Solution 注意到 \(n\le21\),优先考虑状压。 记全集为 \(U\),\(f_S\) 为点集 \(S\) 的所有合法的划分方案的满意度之和,\(\operatorname{Sum}(S)\) 为点集 \(S\) 的人口和,即 \(\sum_{x\in S}w_x\),\(g_S\) 为点集 \(S\) 是否合法(合法为 \(1\),否则为 \(0\))。根据题意可写出如下转移方程[WC2018]通道
luogu传送门 这是我写过最难写的之一,写到AC的总时间有8h。另外Racheal,byebye~嘿嘿 Description \(n\)个点,给三棵树,问\(x\)道\(y\)在三棵树上的路径权值和最大。 Solution 第一棵树上边分治,边权为\(w\),划分为点集S和T。令\(d1_i\)为\(i\)在T1中到边的距离。 同时令\(d_2,d_3\)分[WC2018] 通道
[WC2018] 通道 题目描述 给你三棵树,然后每条边有边权,求一个点对 \((x,y)\) ,最大化 \(dist1(x,y)+dist2(x,y)+dist3(x,y)\),输出这个最大值。 \(n\le 10^5,w\le 10^{12}\)。 题解 这道题真的是道好题。就是有点难写。 我们首先考虑一棵树的时候,我们考虑枚举 \(lca\),然后就是问每个点Luogu4220 [WC2018]通道
边分治 考虑如果是两棵树,对一棵树边分治,同时在另一棵树上建虚树统计答案,套路和[CTSC2018]暴力写挂相同。 一开始想不到好的办法,直接对第二棵树的虚树再次边分治,同时在第三棵树上建虚树,统计答案,时间复杂度\(O(n \log^2 n)\)。 结果\(T\)飞了。 \(Code:\) #include<iostream> #inclu[题解] LuoguP4221 [WC2018]州区划分
https://www.luogu.com.cn/problem/P4221 首先是一个DP,令\(dp(S)\)表示考虑了集合\(S\)内的点的满意度总和,于是有转移 \[dp(S) = \frac{1}{f(S)}\sum\limits_{T \subseteq S} dp(T)g(S - T) \]其中\(f(S)\)表示集合\(S\)内所有点\(w\)的和的\(p\)次,\(g(S) = f(S)\times [S\)内点构luoguP4220 [WC2018]通道 随机化
有一个非常暴力的做法:枚举 $u,v$ 两点中的一个点作为根,然后在 3 棵树中以这个点为根 DFS 一遍,求最大值. 然后考虑用随机化去骗分:设当前枚举的点为 $x$,下一个点 $y$ 可以是 $x$ 为根时求出的最优解. 然后每隔 8 到 9 次随机一个新的 $x$. code: #include <bits/stdc++.h>[WC2018]州区划分
#include<bits/stdc++.h> #define ll long long #define ull unsigned long long #define rep(i, s, t) for(int i = s, __ = t; i <= __; ++i) #define dwn(i, s, t) for(int i = s, __ = t; i >= __; --i) const int INF = 2147483647; const int MAXN = 31; c「WC2018」即时战略
「WC2018」即时战略 考虑对于一条链:直接随便找点,然后不断问即可。 对于一个二叉树,树高logn,直接随便找点,然后不断问即可。 正解: 先随便找到一个点,问出到1的路径 然后找别的点,考虑问出来第一个从1过来的未知位置,就可以一口气问下去了。 怎么找? logn询问次数 法一: 点分治 有点类【loj2339】【WC2018】通道
题目 三棵带边权的树,求 \[ dis1(u,v) + dis2(u,v) + dis3(u,v) \] 的最大值 \(1 \le n \le 10^5\) 题解 对\(T_1\)做边分治,把分治边的两边分别染成白色和黑色,设分治边权值为\(W\)距离变成: \[ d1(u) + d1(v) + dis2(u,v) + dis3(u,v) + \ W \] 将分治中心\(dfs\)到的所有点加入\(T2WC2018 通道
好久以前开的坑. 到今天才填上. 首先考虑队第一颗树边分,然后分成两个集合\(L,R\),在第二棵树上建出虚树,在每个路径\(lca\)处统计答案,维护点集的直径只有正权很好维护. #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> p; typedef pair<p,【WC2018】即时战略(动态点分治,替罪羊树)
【WC2018】即时战略(动态点分治,替罪羊树) 题面 UOJ 题解 其实这题我也不知道应该怎么确定他到底用了啥。只是想法很类似就写上了QwQ。 首先链的部分都告诉你要特殊处理那就没有办法只能特殊处理了QWQ。 首先听说有一种均摊\(log\)的\(LCT\)做法。 即每次随便\(explore\)一个点,如果这WC2018 即时战略
交互题 一棵树,一开始只有 1 号点是已知的,其他的都是未知的,你可以调用函数 explore(x,y) ,其中 x 必须是已知的,函数会找到 x 到 y 路径上第二个点,并把它标成已知,求最小步数使整棵树都已知 对于 30% 的数据,是一条链,操作次数 $O(n+logn)$ 剩下的数据,操作次数 $O(nlogn)$ $n \leq 300000【WC2018】即时战略
动态淀粉质即可 #include "rts.h" #include<algorithm> #include<unordered_map> #include<cstdlib> #include<ctime> #include<map> const int maxn = 300300; int per[maxn],vis[maxn]; typedef long long ll; std::map<int,int>