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这伟大而又光荣 ...
随机推荐
- MDX Query - mdx的基本语法和概念
文档: https://wenku.baidu.com/view/ef14b0e1900ef12d2af90242a8956bec0975a5e7.html?rec_flag=default http ...
- 百度杯”CTF比赛 2017 二月场 没错!就是文件包含漏洞。
题目源码: 文件包含漏洞的话,看一下 你么可以使用php://input 伪协议,执行代码(参考了大佬WP)这里使用了POSTMAN, 目录下还有一个dle345aae.php文件,呢么用cat命令打 ...
- python实现压缩当前文件夹下的所有文件
import os import zipfile def zipDir(dirpath, outFullName): ''' 压缩指定文件夹 :param dirpath: 目标文件夹路径 :para ...
- 使用SpringSecurity体验OAuth2 (入门2)
本文继续使用SpringSecurity从实战角度对OAuth2进行体验,上一篇 搭建了项目环境,并对配置做了初步分析,分析发现会有两套配置可能在影响OAuth,一个是由授权服务的启动类上的注解@En ...
- 010_TCP queue的研究
先来回顾下三次握手里面涉及到的问题:1. 当 client 通过 connect 向 server 发出 SYN 包时,client 会维护一个 socket 等待队列,而 server 会维护一个 ...
- 爬取json Swaggerui界面
对一个静态的网页进行爬取. 要获取的内容分别为 paths 标签下的 1./quota/开头的路径 2. get 这样的httpmode 3 description对应的描述 4 summary 5 ...
- hdu 1241 Oil Deposits (简单搜索)
题目: The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. ...
- LeetCode 9. Palindrome Number(c语言版)
题目: Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same ...
- ueditor内容带格式回显(html字符串回显)
简单描述:项目里有个地方用到啦ueditor,用来输入XX描述就用电影film代替,保存后,获取到ueditor里的内容(html字符串),保存到数据库. 吐槽:回显的时候,无论怎么处置,就是死活不好 ...
- <!特别的一天>
<!DOCTYPE html> <html> <head> <meta charset="gb2312/"> <title&g ...