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这伟大而又光荣 ...
随机推荐
- 提交变更(git commit)
当所有的变更都进入暂存区,就可以使用git commit进行提交了 $ git commit 执行这句话后,会弹出文本编辑区(自己配置的或默认的),文本编辑器可能会显示如下内容 # Please en ...
- Python文件格式 .py .pyc .pyw .pyo .pyd的主要区别
Python是一种面向对象.解释型计算机程序设计语言.Python 语法简洁.清晰,具有丰富和强大的类库.Python源代码遵循 GPL (GNU General Public License) 协议 ...
- 多个Fragment在一个activity中通过按钮的展示方法
fragment使用方法 1. 创建主Mainactivity extends AppCompatActivity 2. Oncreate & setContentView 3. 完成XML的 ...
- 【转】Oracle之索引
简介 1.说明 1)索引是数据库对象之一,用于加快数据的检索,类似于书籍的目录.在数据库中索引可以减少数据库程序查询结果时需要读取的数据量,类似于在书籍中我们利用目录可以不用翻阅整本书即可找到想要的信 ...
- 【easy】141. Linked List Cycle
非常简单的题:判断链表有没有环(用快慢指针) /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...
- xPath Helper插件
xPath Helper插件 xPath helper是一款Chrome浏览器的开发者插件,安装了xPath helper后就能轻松获取HTML元素的xPath,程序员就再也不需要通过搜索html源代 ...
- eclipse导入maven时,html页面引入js的路径出现红色波浪线
用eclipse导入一个springboot项目时,html页面引入js以及css时出现如下图所示情况,html页面用了 thymeleaf模板引擎.另外js文件与css文件路径也是正确无误的. 原来 ...
- Ajax 统一处理token失效
complete:function ajax 请求完成激活本事件.这个方法很方便完成ajax 异常的处理. $.ajaxSetup({ contentType:"application/x- ...
- linux工具-journalctl查询日志
有时候,当linux服务启动失败的时候,系统会提示我们使用journalctl -xe命令来查询详细信息,定位服务不能启动的原因. journalctl 用来查询 systemd-journald 服 ...
- springboot整合mybatis开发
1创建项目,在启动类上添加映射扫描注解 2导入依赖,添加mybatis generator自动生成代码插件 <!-- mybatis generator 自动生成代码插件 --> < ...