JOISC2019 游记
JOISC2019 游记
Day 1:
試験 (Examination)
题目大意:
有\(n(n\le10^5)\)个人,每个人有两种属性\(s_i,t_i\)。\(q(q\le10^5)\)次询问,每次给出\((a_i,b_i,c_i)\),询问同时满足\(s_i\ge a_i\),\(t_i\ge b_i\)和\(s_i+t_i\ge c_i\)的人数。
思路:
三维偏序裸题,CDQ分治即可。
源代码见LibreOJ上的提交记录。
試験 (Examination)
不保证数据随机,但保证结点度数\(\le18\),询问限制从\(25000\)改为\(40000\)。由于不满足数据随机的条件,因此链上第二个端点\(y\)需要随机。
源代码见LibreOJ上的提交记录。
Day 4:
合併 (Mergers)
题目大意:
一个\(n(n\le5\times10^5)\)个结点的树,每个结点有一个颜色\(c_i\),不同的结点可能有相同的颜色。
你可以进行若干次操作,每次将所有拥有颜色\(x\)的结点染成另一种颜色\(y\)。问至少需要几次这样的操作,使得最后的树满足:无论从树上删去哪一条边,形成的两个子树中,一定存在共同的颜色。
思路:
对于每种颜色\(c\),将能包含所有颜色为\(c\)的结点的最小子树缩成一个点。显然被缩掉的边已经合法,而剩下的都是不合法的。进行若干次操作相当于用最少的可相交链覆盖剩下的树,答案就是\(\frac{\text{剩下叶子结点的个数}+1}2\)。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
#include<numeric>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=5e5+1,logN=19;
struct Edge {
int u,v;
};
std::vector<Edge> edge;
std::vector<int> e[N],v[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
int anc[N][logN],dfn[N],dep[N],cnt[N],bel[N],deg[N];
inline int lg2(const float &x) {
return ((unsigned&)x>>23&255)-127;
}
void dfs(const int &x,const int &par) {
dfn[x]=++dfn[0];
anc[x][0]=par;
dep[x]=dep[par]+1;
for(register int i=1;i<=lg2(dep[x]);i++) {
anc[x][i]=anc[anc[x][i-1]][i-1];
}
for(int y:e[x]) {
if(y==par) continue;
dfs(y,x);
}
}
inline int lca(int x,int y) {
if(dep[x]<dep[y]) std::swap(x,y);
for(register int i=lg2(dep[x]-dep[y]);i>=0;i--) {
if(dep[anc[x][i]]>=dep[y]) {
x=anc[x][i];
}
}
for(register int i=lg2(dep[x]);i>=0;i--) {
if(anc[x][i]!=anc[y][i]) {
x=anc[x][i];
y=anc[y][i];
}
}
return x==y?x:anc[x][0];
}
inline void cover(const int &x,const int &y) {
const int z=lca(x,y);
cnt[x]++;
cnt[y]++;
cnt[z]-=2;
}
struct DisjointSet {
int anc[N];
void reset(const int &n) {
std::iota(&anc[1],&anc[n]+1,1);
}
int find(const int &x) {
return x==anc[x]?x:anc[x]=find(anc[x]);
}
void merge(const int &x,const int &y) {
anc[find(x)]=find(y);
}
};
DisjointSet djs;
void dfs(const int &x) {
for(int y:e[x]) {
if(y==anc[x][0]) continue;
dfs(y);
if(cnt[y]) djs.merge(x,y);
cnt[x]+=cnt[y];
}
}
int main() {
const int n=getint(),k=getint();
for(register int i=1;i<n;i++) {
const int u=getint(),v=getint();
edge.push_back((Edge){u,v});
add_edge(u,v);
}
dfs(1,0);
for(register int i=1;i<=n;i++) {
v[getint()].push_back(i);
}
for(register int i=1;i<=k;i++) {
std::sort(v[i].begin(),v[i].end(),
[](const int &x,const int &y) {
return dfn[x]<dfn[y];
}
);
for(register unsigned j=0;j<v[i].size();j++) {
cover(v[i][j],v[i][(j+1)%v[i].size()]);
}
}
djs.reset(n);
dfs(1);
for(register int i=1;i<=n;i++) {
bel[i]=djs.find(i);
}
for(auto e:edge) {
const int u=e.u,v=e.v;
if(bel[u]==bel[v]) continue;
deg[bel[u]]++;
deg[bel[v]]++;
}
int tot=0;
for(register int i=1;i<=n;i++) {
tot+=deg[i]==1;
}
printf("%d\n",(tot+1)/2);
return 0;
}
JOISC2019 游记的更多相关文章
- 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记
先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...
- 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记
先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...
- NOIp2016 游记
DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...
- NOIP2016游记
只是游记而已.流水账. Day0:忘了. Day1:看完T1,本以为T2一如既往很简单,结果看了半天完全没有思路.然后看了一眼T3,期望,NOIP什么时候要考期望了,于是接着看T2.一开始我推的限制条 ...
- CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>
挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...
- 游记——noip2016
2016.11.18 (day 0) 呆在家. 悠闲地呆在家.. 明后天可能出现的错误: 1)没打freopen.打了ctime: 2)对拍程序忘记怎么写了...忘记随机化种子怎么写了: 3)不知道厕 ...
- 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记
我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...
- ZJOI2016二试+游记
...excited.... 一场打回原形爽哦. T1莫名爆到了10分,T2T3均没交,一个小时过后就没再拿任何分数,perfectly狗带了... 总之没有给自己充足的时间去敲暴力,ZJOI啊..拿 ...
- NOIP2015游记——一次开心又失望的旅行
啊,一年一度的NOIP终于是结束了 以前的大神都有写自己的感受 然而我居然给忘了!!!! 吓得我赶紧来写一份游记 Day.-INF--出发前一个星期 机智的我选择了停课 就是为了OIER这伟大而又光荣 ...
随机推荐
- Eclipse——如何设置代码字体大小
eclipse默认字体太小,1920*1080下分辨不清楚,接下来介绍一下如何更改默认字体大小: 1.window-Preferences 2.General-Appearance-Colors an ...
- JAVA使用HttpClient时报错:Algorithm constraints check failed on signature algorithm: MD5withRSA
今天使用httpClient.executeMethod时抛出异常:java.security.cert.CertPathValidatorException: Algorithm constrain ...
- 20175315 实验二《Java面向对象程序设计》实验报告
20175315 实验二<Java面向对象程序设计>实验报告 一.实验内容及步骤 1.初步掌握单元测试和TDD 单元测试 任务一:三种代码 用程序解决问题时,要学会写以下三种代码: 伪代码 ...
- C++多态、虚函数、纯虚函数、抽象类、虚基类
一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...
- go语言熟知的开源项目
go语言在国内是比较火的,并且好多公司都用go语言进行重构之前的系统,今天来看下基本大家都知道的go语言的开源项目 1.Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用 ...
- js 刷新父业面
window.opener.location.reload() 2个方法都是刷新父窗口,但是其中还是有奥妙的哦.window.opener.location.reload();这个方法在强迫父窗口的时 ...
- 5G到来,App的未来,是JavaScript,Flutter还是Native ?
Native App React Native(RN)发布于2015年,也是使用JavaScript语言进行跨平台APP的开发.与H5开发不同的是,它使用JS桥接技术在运行时编译成各个平台的Nativ ...
- 无法获得VMCI驱动程序的版本:句柄无效
解决方法: 查找到 vmci0.present="TRUE" 代码,将TRUE更改为FALSE保存即可
- MapReduce词频统计
自定义Mapper实现 import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; impor ...
- git增加子模块
要拉取GIT代码时,有时候需要拉取多个GIT模块,一起配合使用: 1.下载主模块: git clone -b master http://username:passwd@git.wondershare ...