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)

基本同[CSAcademy]Find the Tree

不保证数据随机,但保证结点度数\(\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 游记的更多相关文章

  1. 【20161203-20161208】清华集训2016滚粗记&&酱油记&&游记

    先挖坑(这个blog怎么变成游记专用了--) 已更完 #include <cstdio> using namespace std; int main(){ puts("转载请注明 ...

  2. 【20160722-20160728】NOI2016滚粗记&&酱油记&&游记

    先挖坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.c ...

  3. NOIp2016 游记

    DAY -2 不要问我为什么现在就开了一篇博客. 本来想起个NOIp2016爆零记或者NOIp2016退役记之类的,但是感觉现在不能乱立flag了.所以就叫游记算了. 前几场模拟赛崩了一场又一场,RP ...

  4. NOIP2016游记

    只是游记而已.流水账. Day0:忘了. Day1:看完T1,本以为T2一如既往很简单,结果看了半天完全没有思路.然后看了一眼T3,期望,NOIP什么时候要考期望了,于是接着看T2.一开始我推的限制条 ...

  5. CTSC2016&&APIO2016滚粗记&&酱油记&&游记<del>(持续更新)</del>

    挖一波坑 #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs. ...

  6. 游记——noip2016

    2016.11.18 (day 0) 呆在家. 悠闲地呆在家.. 明后天可能出现的错误: 1)没打freopen.打了ctime: 2)对拍程序忘记怎么写了...忘记随机化种子怎么写了: 3)不知道厕 ...

  7. 【NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2】游记

    我第一次写游记,,,, 正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪里?正文在哪 ...

  8. ZJOI2016二试+游记

    ...excited.... 一场打回原形爽哦. T1莫名爆到了10分,T2T3均没交,一个小时过后就没再拿任何分数,perfectly狗带了... 总之没有给自己充足的时间去敲暴力,ZJOI啊..拿 ...

  9. NOIP2015游记——一次开心又失望的旅行

    啊,一年一度的NOIP终于是结束了 以前的大神都有写自己的感受 然而我居然给忘了!!!! 吓得我赶紧来写一份游记 Day.-INF--出发前一个星期 机智的我选择了停课 就是为了OIER这伟大而又光荣 ...

随机推荐

  1. 在Ubuntu/CentOS/Debian系统下,使用CPU挖Monero (XMR)币

    CentOS7(增加源) yum repolist # 查看yum源列表 yum localinstall http://dl.fedoraproject.org/pub/epel/7/x86_64/ ...

  2. go 【第二篇】包、变量、函数

    包 初试 每个 Go 程序都是由包组成的. 程序运行的入口是包 `main`. 这个程序使用并导入了包 "fmt" 和 `"math/rand"`. 按照惯例, ...

  3. springboot 共享session

    1.pom添加jar依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifact ...

  4. 在web项目启动时,执行某个方法

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  5. 使用Sales_data类

    写一段程序程序实现求两次交易相加结果的功能.程序的输入是下面这两条交易记录: 0-201-783456-X 3 20.00 0-201-783456-X 3 25.00 程序的结构如下: #inclu ...

  6. 在django admin中添加自定义视图

    来自https://blog.csdn.net/qq_35753140/article/details/84881757   django admin提供了完善的用户管理和数据模型管理,方便实用.研究 ...

  7. 使用SecureCRT做端口转发

    我的笔记本只能访问跳板机,跳板机是Linux系统,访问内网机器需要在跳板机内通过ssh命令访问,特别不方便,而且我们还需要访问Windows或web网站. 这是我们就可以做一个端口转发,通过自己的笔记 ...

  8. 使用gethostname()函数和gethostbyname()函数获取主机相关信息

    gethostname() : 返回本地主机的标准主机名. 原型如下: #include <unistd.h> int gethostname(char *name, size_t len ...

  9. Uni-app页面生命周期

    学习任何框架必须将其生命周期了然于胸. uni-app支持如下页面生命周期函数: onLoad 监听页面加载,其参数为上个页面传递的数据,参数类型为object(用于页面传参),示例中可参考 onSh ...

  10. iOS开发之HTTP与HTTPS网络请求

    HTTP是互联网中应用最为广泛的一种网络协议,在进入正文之前,先解释什么是网络协议?网络协议为计算机网络中进行数据交换而建立的规则.标准或约定的集合.网络协议是由以下三个要素组成:语义.语法.时序.国 ...