5.19 省选模拟赛 小B的图 最小生成树 LCT
LINK:小B的图
这道题就比较容易了。
容易想到将询问离线 然后 从小到大排序 那么显然是优先放正图(x+k)的边。
考虑随着x的增大 那么负图上的边会逐渐加进来 一条边被加进来当且仅当 其权值小于其能影响到的某条边的权值.
这样 随便列一个不等式就可以解出下界.
值得注意的是 加边的时候 肯定是x较小的先加 所以这个也要排序。
一个需要证明的地方是:虽然x较小的先加 但事实上可能x较大的先加上去了.
这个时候 是否会影响到x较小的加边情况呢?
答案是否定的 考虑较大的可以先加进来 当且仅当 其影响到的边的权值更大 且较小的没有被影响到.
那么加小的时候 和大的如果不存在交集那么无影响 如果存在交集那么判断的形态也不会改变 证毕.
综上 可以利用LCT来维护这个过程 复杂度nlogn.
值得注意的是 LCT维护的时候 一个比较简单的写法是 把边化点做.
当然LCT本身有很多的细节 小心死循环...
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 2100000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define S second
#define F first
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define ull unsigned long long
#define ui unsigned
#define EPS 1e-8
#define mod 998244353
#define max(x,y) ((x)>(y)?(x):(y))
#define sq sqrt
#define IV inline void
using namespace std;
char buf[1<<15],*fs,*ft;
inline char getc()
{
return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline int read()
{
RE int x=0,f=1;RE char ch=getc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}
return x*f;
}
const int MAXN=200010,maxn=500010;
int n,Q,A,B,top,sum;ll ans,ans1[maxn];
int fa[maxn];
struct wy{int x,y,z;}t[maxn],g[maxn],w[maxn];
inline int cmp(wy a,wy b){return a.z<b.z;}
int f[maxn],mx[maxn],b[maxn],s[maxn],re[maxn],c[maxn][2];
inline int getfather(int x){return x==fa[x]?fa[x]:fa[x]=getfather(fa[x]);}
inline int pd(int x){return c[f[x]][1]==x||c[f[x]][0]==x;}
IV reversal(int x)
{
swap(c[x][0],c[x][1]);
re[x]^=1;
}
IV pushup(int x)
{
mx[x]=x;
if(b[mx[c[x][0]]]>b[mx[c[x][1]]]){if(b[mx[c[x][0]]]>b[x])mx[x]=mx[c[x][0]];}
else if(b[mx[c[x][1]]]>b[x])mx[x]=mx[c[x][1]];
}
IV pushdown(int x)
{
if(re[x])
{
if(c[x][0])reversal(c[x][0]);
if(c[x][1])reversal(c[x][1]);
re[x]=0;
}
}
IV rotate(int x)
{
int old=f[x],oldf=f[old],k=c[old][1]==x;
c[old][k]=c[x][k^1];c[x][k^1]=old;
if(pd(old))c[oldf][c[oldf][1]==old]=x;
if(c[old][k])f[c[old][k]]=old;
f[x]=oldf;f[old]=x;pushup(old);
}
IV splay(int x)
{
int y=x;top=0;
s[++top]=y;
while(pd(y))s[++top]=y=f[y];
while(top)pushdown(s[top--]);
while(pd(x))
{
int old=f[x],oldf=f[old];
if(pd(old))rotate(((c[old][1]==x)^(c[oldf][1]==old))?x:old);
rotate(x);
}
pushup(x);
}
IV access(int x)
{
for(int y=0;x;x=f[y=x])
splay(x),c[x][1]=y,pushup(x);
}
IV make_root(int x)
{
access(x);
splay(x);
reversal(x);
}
IV Link(int x,int y)
{
make_root(x);
f[x]=y;
}
inline int ask(int x,int y)
{
make_root(x);access(y);
splay(y);return mx[y];
}
IV cut(int x,int y)
{
make_root(x);access(y);
splay(y);f[x]=c[y][0]=0;
}
int main()
{
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
get(n);get(A);get(B);get(Q);
rep(1,A,i)
{
int get(x),get(y),get(z);
t[i]=(wy){x,y,z};
}
sort(t+1,t+1+A,cmp);
rep(1,B,i)
{
int get(x),get(y),get(z);
g[i]=(wy){x,y,z};
}
sort(g+1,g+1+B,cmp);b[0]=-INF-1;
rep(1,n,i)b[i]=-INF,fa[i]=i,mx[i]=i;
rep(1,A,i)b[i+n]=t[i].z,mx[i+n]=i+n;
rep(1,B,i)b[i+n+A]=-INF,mx[i+n+A]=i+n+A;
rep(1,A,i)
{
int xx=getfather(t[i].x);
int yy=getfather(t[i].y);
if(xx!=yy)
{
fa[xx]=yy;
Link(t[i].x,i+n);
Link(t[i].y,i+n);
ans+=t[i].z;
}
}
sum=n-1;
rep(1,B,i)//对于每个B求出v
{
int x=g[i].x;int y=g[i].y;
if(x==y){w[i].z=INF;w[i].x=0;continue;}
int ww=ask(x,y);
if(b[ww]==-INF){w[i].z=INF;w[i].x=0;continue;}
else
{
w[i].z=(g[i].z-b[ww]-1)/2+1;
w[i].x=b[ww];
w[i].y=g[i].z;
cut(t[ww-n].x,ww);
cut(t[ww-n].y,ww);
Link(x,i+n+A);
Link(y,i+n+A);
}
}
sort(w+1,w+1+B,cmp);
int flag=1;
rep(1,Q,j)t[j]=(wy){j,0,read()};
sort(t+1,t+1+Q,cmp);
rep(1,Q,j)
{
ll v=t[j].z;
while(w[flag].z<=v&&flag<=B)
{
--sum;ans-=w[flag].x;
ans+=w[flag].y;++flag;
}
ans1[t[j].x]=ans-(n-1-2*sum)*v;
}
rep(1,Q,i)putl(ans1[i]);
return 0;
}
5.19 省选模拟赛 小B的图 最小生成树 LCT的更多相关文章
- 5.19 省选模拟赛 小B的夏令营 概率 dp 前缀和优化dp
LINK:小B的夏令营 这道题是以前从没见过的优化dp的方法 不过也在情理之中. 注意读题 千万不要像我这个sb一样 考完连题意都不知道是啥. 一个长方形 要求从上到下联通的概率. 容易发现 K天只是 ...
- 5.19 省选模拟赛 T1 小B的棋盘 双指针 性质
LINK:小B的棋盘 考试的时候没有认真的思考 导致没做出来. 容易发现 当k>=n的时候存在无限解 其余都存在有限解 对于30分 容易想到暴力枚举 对称中心 然后 n^2判断. 对于前者 容易 ...
- 「HGOI#2019.4.19省选模拟赛」赛后总结
t1-Painting 这道题目比较简单,但是我比较弱就只是写了一个链表合并和区间DP. 别人的贪心吊打我的DP,嘤嘤嘤. #include <bits/stdc++.h> #define ...
- 6.10 省选模拟赛 小C的利是 高斯消元 矩阵行列式
LINK:小C的利是 想起来把这道题的题解写了 .一个常识:利是在广东那边叫做红包. 关于行列式的题目 不过我不太会23333..口胡还是可以的. 容易想到10分的状压.不过没什么意思. 仔细观察要求 ...
- 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解
今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...
- Java 第十一届 蓝桥杯 省模拟赛 小明植树(DFS)
小明植树 题目 问题描述 小明和朋友们一起去郊外植树,他们带了一些在自己实验室精心研究出的小树苗. 小明和朋友们一共有 n 个人,他们经过精心挑选,在一块空地上每个人挑选了一个适合植树的位置,总共 n ...
- ZROI 19.08.07模拟赛
传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "正睿从来没有保证,模拟赛的题目必须原创." "文案不是我写的,有问题找喵老师去."--蔡老师 ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
随机推荐
- 给大家分享一下less的使用几个技巧
1.层级关系 让这个box范围内的全部包进来,这样的话就完美的进行调节,再也不用到处找第几行第几个,我刚才在哪个位置给覆盖了.一看便知! .box{ width: %; height: 300px; ...
- Mysql查询语句执行过程
Mysql查询语句执行过程 Mysql分为server层和存储引擎两部分,或许可以再加一层连接层 连接层(器) Mysql使用的是典型的C/S架构.连接器通过典型的TCP握手完成连接. 需要注 ...
- 区间dp(能量项链)
[题目大意] 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记 ...
- Buy a Ticket,题解
题目连接 题意: 没个位置有一个点权,每个边有一个边权,求对于每个点u的min(2*d(u,v)+val[v])(v可以等于u) 分析: 我们想这样一个问题,从u到v的边权*2再加一个点权就完了,我们 ...
- day40 线程
目录 一.开启线程的两种方式 二.用进程和线程分别实现tcp 三.线程对象实现join方法 四.同一个进程下的多个线程数据是共享的 五.线程对象属性及其他方法 六.守护线程 七.线程互斥锁 八.GIL ...
- 3dTiles 数据规范详解[4.1] b3dm瓦片二进制数据文件结构
B3dm,Batched 3D Model,成批量的三维模型的意思. 倾斜摄影数据(例如osgb).BIM数据(如rvt).传统三维模型(如obj.dae.3dMax制作的模型等),均可创建此类瓦片. ...
- 【IDEA】创建maven项目,webapp没有被标识,无法识别
问题描述 新建maven项目模块后,webapp目录未被标识,也就是没有小蓝点的图标显示. 解决方法 点击"File"下的"Project Strucure", ...
- 1.对Java平台的理解。“Java是解释执行”对吗
Java本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“书写一次,到处运行”,能够非常容易地获得跨平台能力: 另外就是垃圾收集(GC),Java通过垃圾收集器(Garbage Colle ...
- TCP 进阶
转自: https://www.cnblogs.com/caoyusongnet/p/9087633.html 一. 端口号 标准的端口号由 Internet 号码分配机构(IANA)分配.这组数字被 ...
- J.U.C体系进阶(四):juc-sync 同步器框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-sync 同步器框架 同步器名称 作用 CountDownLatch 倒 ...