6514. 「雅礼集训 2018 Day10」文明

【题目描述】

传送门

【题解】

考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会发现,所需要的点不多,所以我们可以用虚数优化。

代码如下

#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN=500005,LOG2=19;
int n,Q,K,Tim,Ans,Siz[MAXN],a[MAXN],Dep[MAXN],Fa[MAXN][20],vis[MAXN],hv[MAXN];
int cnt,IN[MAXN],OUT[MAXN],que[2*MAXN],Top,Stk[MAXN],tot;
struct Edge{int tot,lnk[MAXN],nxt[MAXN<<1],son[MAXN<<1];void Add(int x,int y){nxt[++tot]=lnk[x];lnk[x]=tot;son[tot]=y;}
}E,S;
#include<cctype>
int read(){int ret=0;char ch=getchar();bool f=1;for(;!isdigit(ch);ch=getchar()) f^=!(ch^'-');for(; isdigit(ch);ch=getchar()) ret=ret*10+ch-48;return f?ret:-ret;
}
void DFS(int x,int fa){Dep[x]=Dep[fa]+1;Fa[x][0]=fa;Siz[x]=1;IN[x]=++cnt;for(int j=E.lnk[x];j;j=E.nxt[j]) if(E.son[j]!=fa) DFS(E.son[j],x),Siz[x]+=Siz[E.son[j]];OUT[x]=++cnt;
}
void INIT(){for(int j=1;(1<<j)<=n;j++)for(int i=1;i<=n;i++) Fa[i][j]=Fa[Fa[i][j-1]][j-1];
}
void Count_Ans(int x){Ans++,vis[x]=Tim;for(int j=E.lnk[x];j;j=E.nxt[j]) if(vis[E.son[j]]!=Tim) Count_Ans(E.son[j]);
}
int LCA(int p,int q){if(Dep[p]<Dep[q]) swap(q,p);int Del=Dep[p]-Dep[q];for(int j=0;(1<<j)<=Del;j++) if(Del&(1<<j)) p=Fa[p][j];if(p==q) return p;for(int j=LOG2;j>=0;j--)if(Fa[p][j]^Fa[q][j]) p=Fa[p][j],q=Fa[q][j];p=Fa[p][0],q=Fa[q][0];return p;
}
int Jump(int p,int Del){for(int j=0;(1<<j)<=Del;j++) if(Del&(1<<j)) p=Fa[p][j];return p;}
bool cmp(int x,int y){return (x<0?OUT[-x]:IN[x])<(y<0?OUT[-y]:IN[y]);}
void Count(int x,int fa){if(hv[x]==Tim){if(LCA(x,a[1])!=x) Ans+=Siz[x];else Ans+=n-Siz[Jump(a[1],Dep[a[1]]-Dep[x]-1)];return;}for(int j=S.lnk[x];j;j=S.nxt[j])if(S.son[j]!=fa) Count(S.son[j],x);
}
int Work(){Tim++;Ans=Top=0;for(int i=2;i<=K;i++){int fa=LCA(a[1],a[i]),Len=Dep[a[1]]+Dep[a[i]]-2*Dep[fa],x;if(Dep[a[i]]-Dep[fa]>=(Len-1)/2) x=Jump(a[i],(Len-1)/2);else x=Jump(a[1],Len/2+1);if(vis[x]!=Tim) vis[x]=Tim,que[++Top]=x,hv[x]=Tim;}if(vis[a[1]]!=Tim) vis[a[1]]=Tim,que[++Top]=a[1];if(vis[1]!=Tim) vis[1]=Tim,que[++Top]=1;sort(que+1,que+1+Top,cmp);for(int i=2;i<=Top;i++){int fa=LCA(que[i],que[i-1]);if(vis[fa]!=Tim) vis[que[++Top]=fa]=Tim;}for(int i=1;i<=Top;i++) S.lnk[que[i]]=0;S.tot=0;S.lnk[0]=0;for(int i=1,END=Top;i<=END;i++) que[++Top]=-que[i];sort(que+1,que+1+Top,cmp);Stk[tot=0]=0;for(int i=1;i<=Top;i++)if(que[i]>0){if(tot) S.Add(Stk[tot],que[i]),S.Add(que[i],Stk[tot]);Stk[++tot]=que[i];}else tot--;Count(a[1],0);return n-Ans;
}
int main(){n=read(),Q=read();for(int i=1;i<n;i++){int x=read(),y=read();E.Add(x,y),E.Add(y,x);}DFS(1,0);INIT();for(int j=Q;j;j--){K=read();for(int i=1;i<=K;i++) a[i]=read();printf("%d\n",Work());}return 0;
}

真的细节多,调了我好久。

转载于:https://www.cnblogs.com/XSamsara/p/10547934.html

LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】相关推荐

  1. [LOJ6515]「雅礼集训 2018 Day10」贪玩蓝月

    Description 要求维护一个双端队列,支持: 在队尾/队头添加一个体积为w,价值为v的物品 删除队尾/队头的物品 询问从所有物品中选出若干个,满足体积和对Mod取模后在[l,r]内的价值的最大 ...

  2. [LOJ]#6515. 「雅礼集训 2018 Day10」贪玩蓝月

    Solution 离线做法很简单,就是线段树分治,不过复杂度是 q m o d log ⁡ qmod\log qmodlog. 考虑在线做法,在线段树分治中,我们并没有利用到删除以及加入都只会在两端进 ...

  3. 「雅礼集训 2018 Day10」贪玩蓝月

    大渣好,我四渣渣辉,点一下,玩一年,装备不花一分钱,说话战斗,罩杯回收,找一基友,极限到手. 0 元 VIP,3 天满级,一秒一刀 999,装备全爆 666,广告做得再牛,不如进服遛一遛! 古天乐绿了 ...

  4. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  5. 「雅礼集训 2018 Day2」农民

    传送门 Description 「搞 OI 不如种田.」 小 D 在家种了一棵二叉树,第 ii 个结点的权值为 \(a_i\). 小 D 为自己种的树买了肥料,每天给树施肥. 可是几天后,小 D 却发 ...

  6. LOJ#6048. 「雅礼集训 2017 Day10」数列(线段树)

    题面 传送门 题解 我的做法似乎非常复杂啊-- 首先最长上升子序列长度就等于把它反过来再接到前面求一遍,比方说把\(2134\)变成\(43122134\),实际上变化之后的求一个最长上升子序列和方案 ...

  7. LibreOJ#6030. 「雅礼集训 2017 Day1」矩阵

    https://loj.ac/problem/6030 如果矩阵第i列有一个黑色, 那可以用他把第i行全都染黑,也可以使任意一列具有黑色 然后就可以用第i行把矩阵染黑 染黑一列的代价最少是1 染黑一行 ...

  8. 「雅礼集训 2017 Day10」拍苍蝇

    传送门 Description 有一天,小 A 的母亲对他家里的卫生状况非常不满意,他的房间里有非常多的苍蝇.在母亲的威逼利诱下,小 A 拿起了苍蝇拍去消灭家里的苍蝇.然而,小 A 以前从来没有亲手消 ...

  9. 【loj6029】「雅礼集训 2017 Day1」市场 线段树+均摊分析

    题目描述 给出一个长度为 $n$ 的序列,支持 $m$ 次操作,操作有四种:区间加.区间下取整除.区间求最小值.区间求和. $n\le 100000$ ,每次加的数在 $[-10^4,10^4]$ 之 ...

最新文章

  1. 模拟器抓取https方法
  2. Oracle --存储过程,输入不定个数参数
  3. Android踩坑日记:FloatingActionButton的设置大小问题
  4. stm32之PVD可编程电压监测器(掉电保存数据)
  5. bootstrap学习(四)表格
  6. linux修改ip广播地址,Linux设置查看静态IP之ifconfig命令
  7. 【洛谷2986】【USACO10MAR】伟大的奶牛聚集
  8. 如何使用工具进行线上 PHP 性能追踪及分析?
  9. 以物载道,探享生活艺术,LEXUS雷克萨斯开启中国新匠精神巡展
  10. 2018-04-08椭圆曲线测试程序
  11. 远程服务器桌面配置iis6,windows 2003服务器安装 IIS6.0和IIS自带FTP服务器图文教程...
  12. 我的世界服务器发消息有符号,我的世界彩色字体符号
  13. Java到底能干什么?有哪些实际用途?
  14. PS4 Pro 拆机记
  15. 分析计算机网络的功能,分析计算机网络管理系统的功能及实现
  16. JavaSE-day22
  17. 在html登陆页面代码中添加背景图片,为什么找不到图片放置的位置
  18. Android Studio 在library中引用本地arr的办法
  19. 阿里技术专家深入浅出470页Java虚拟机设计与实现文档总结
  20. 云linux服务器备份6,云服务器 ECS Linux 系统 MySQL 备份的导入导出

热门文章

  1. python gui界面 tcp_带Tkinter GUI的Twisted TCP服务器
  2. 武汉劳务外包-武汉博智人才首页
  3. ACL2022 | 关系抽取和NER等论文分类整理
  4. lambda之reduce函数
  5. 架构模式的演变之路:从单体架构到微服务架构
  6. git将远程分支回退到相应版本
  7. Jenkins 详细部署
  8. sparkSQL之SQL风格的wordCount
  9. mysql coolshell_图解SQL的Join 转自coolshell
  10. java double 乘_java Double 进行加减乘除