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这伟大而又光荣 ...
随机推荐
- css 修改placeholder的颜色
input::-webkit-input-placeholder { color: #ff0000; } input::-moz-input-placeholder { color: #ff0000; ...
- 扩展欧几里得(exgcd)与同余详解
exgcd入门以及同余基础 gcd,欧几里得的智慧结晶,信息竞赛的重要算法,数论的...(编不下去了 讲exgcd之前,我们先普及一下同余的性质: 若,那么 若,,且p1,p2互质, 有了这三个式子, ...
- SimpleDateFormat 线程不安全及解决方案
SimpleDateFormat定义 SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类.它允许进行格式化(日期 -> 文本).解析(文本 -> 日期 ...
- Exp1:PC平台逆向破解 20164314 郭浏聿
一.实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getS ...
- python-类对象以字典模式操作
#类对象以字典模式操作 class Person: def __init__(self): self.cache={} def __setitem__(self, key, value): #增加或修 ...
- java aes CBC的填充方式发现
如下的java代码,手动对block进行填充后,使其为16的整数倍后,加密的时候竟然强行再填充了16位,我在尝试用golang实现这段加密时,反复修改了很久,发现golang版的总是比java加密出来 ...
- axios formData提交数据 && axios设置charset无效???
但是这样会出现一个问题,什么问题呢? 我设置了请求头编码utf-8,但是没生效 content-type里面没有出现utf-8???????查了很多资料,说这是axios固有的bug,我....... ...
- Excel如何快速统计一列中相同数值出现的个数--数据透视表
excel如何快速统计一列中相同数值出现的个数_百度经验 --这里介绍了两种解决方式,用第一种https://jingyan.baidu.com/article/9113f81b2c16822b321 ...
- Centos安装Git、DotNet、Docker
1.安装Git yum install git 可通过下面的命令查看Git版本 git --version 2.安装Dotnet sudo yum install libunwind libicu 导 ...
- jmeter知识总结(一)
Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工 ...