不妨设$a\le b\le c$,那么相当于要找到两个大小至少为$a$和$b$的连通块(连通块可以通过删除度最小的点变小)
以一个点为根建出dfs树并对以下情况分类讨论:
1.存在一个节点满足$\max(\max_{son}(sz[son]),n-sz[k]+s)<a$(其中$sz[k]$表示k子树大小,$s$表示删除$k$后仍然与根联通的点个数),那么必然无解(两个连通块必然都需要经过$k$)
2.不存在,那么必然有解,且可以通过以下方法构造:
(1)找到任意一个满足$sz[k]\ge a$且$\max_{son}(sz[son])<a$的点$k$
(2)若$n-sz[k]+s\ge b$,将在$k$子树中且删去$k$后无法与根联通的$x$加入$S_{a}$,对于剩下的子树不断加入$S_{a}$直到$S_{a}$大小不小于$a$,然后剩下的点归入$S_{b}$
由于$\max_{son}(sz[son])<a$,因此$S_{a}$的大小最多为$2a$,那么$|S_{b}|=n-2a\ge n-a-c=b$
(3)若$n-sz[k]+s<b$,由于$b\le \lfloor \frac{n}{2}\rfloor$,因此$sz[k]>\lceil \frac{n}{2}\rceil+s>b$,同时$n-sz[k]+s\ge a$(否则无解),那么交换$a$和$b$后用同样的方法即可
(代码中有一些小问题,可以通过随机根解决QAQ)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 struct ji{
5 int nex,to;
6 }edge[N<<2];
7 pair<int,int>a[11];
8 int E,r,n,m,x,y,flag,head[N],sz[N],dfn[N],low[N],tot[N],ans[N];
9 void add(int x,int y){
10 edge[E].nex=head[x];
11 edge[E].to=y;
12 head[x]=E++;
13 }
14 void update(int k,int p){
15 if ((!a[p].first)||(ans[k]))return;
16 a[p].first--;
17 ans[k]=a[p].second;
18 for(int i=head[k];i!=-1;i=edge[i].nex)
19 if (edge[i].to)update(edge[i].to,p);
20 }
21 void dfs(int k,int fa){
22 int mx=0,s=0;
23 sz[k]=1;
24 dfn[k]=low[k]=++x;
25 for(int i=head[k];i!=-1;i=edge[i].nex)
26 if (!sz[edge[i].to]){
27 dfs(edge[i].to,k);
28 if (flag)return;
29 sz[k]+=sz[edge[i].to];
30 low[k]=min(low[k],low[edge[i].to]);
31 if (low[edge[i].to]<dfn[k])s+=sz[edge[i].to];
32 }
33 else{
34 if (edge[i].to!=fa)low[k]=min(low[k],dfn[edge[i].to]);
35 edge[i].to=0;
36 }
37 if ((mx<a[1].first)&&(sz[k]>=a[1].first)){
38 flag=2;
39 if (n-sz[k]+s<a[1].first){
40 flag=1;
41 return;
42 }
43 if (n-sz[k]+s<a[2].first)swap(a[1],a[2]);
44 ans[k]=a[1].second;
45 a[1].first--;
46 for(int i=head[k];i!=-1;i=edge[i].nex)
47 if ((edge[i].to)&&(low[edge[i].to]>=dfn[k]))update(edge[i].to,1);
48 for(int i=head[k];i!=-1;i=edge[i].nex)
49 if ((edge[i].to)&&(low[edge[i].to]<dfn[k]))update(edge[i].to,1);
50 update(r,2);
51 for(int i=1;i<=n;i++)
52 if (!ans[i])ans[i]=a[3].second;
53 }
54 }
55 int main(){
56 srand(time(0));
57 scanf("%d%d",&n,&m);
58 r=rand()%n+1;
59 for(int i=1;i<=3;i++){
60 scanf("%d",&a[i].first);
61 a[i].second=i;
62 }
63 sort(a+1,a+4);
64 memset(head,-1,sizeof(head));
65 for(int i=1;i<=m;i++){
66 scanf("%d%d",&x,&y);
67 add(x+1,y+1);
68 add(y+1,x+1);
69 }
70 dfs(r,0);
71 for(int i=1;i<=n;i++)printf("%d ",ans[i]);
72 }

[loj3176]景点划分的更多相关文章

  1. <题解>[IOI2019]景点划分

    题目传送门(luogu) 题目传送门(loj) 这个题对我来说可以算是超出了我的能力范围 被学长拿来教我做构造,构造题真简单,构造题真是人,构造题真能手切... 首先对于本题,必须要知道dfs树这东西 ...

  2. world.construct(me);

    目录 0 引言 0.1 所谓构造题 0.2 重点是动机 (motivation) 1 实践出真知 1.1 「CSP-S 2021」「洛谷 P7915」回文 1.1.1 题目大意 1.1.2 解题过程 ...

  3. [LeetCode] Partition List 划分链表

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  4. SWMM模型子汇水区划分的几种方法

    子汇水区的划分是SWMM模型建模的主要步骤之一,划分的好坏对结果精度有比较大的影响.概括来讲,子汇水区的划分有以下几种思路: (1)根据管网走向.建筑物和街道分布,直接人工划分子汇水区.这个方法适用于 ...

  5. 等价类划分方法的应用(jsp)

    [问题描述] 在三个文本框中输入字符串,要求均为1到6个英文字符或数字,按submit提交. [划分等价类] 条件1: 字符合法; 条件2: 输入1长度合法; 条件3: 输入2长度合法: 条件4: 输 ...

  6. Java上等价类划分测试的实现

    利用JavaFx实现对有效等价类和无效等价类的划分: 代码: import javafx.application.Application;import javafx.event.ActionEvent ...

  7. ENode框架Conference案例分析系列之 - 上下文划分和领域建模

    前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的 ...

  8. Cesium原理篇:2最长的一帧之网格划分

    上一篇我们从宏观上介绍了Cesium的渲染过程,本章延续上一章的内容,详细介绍一下Cesium网格划分的一些细节,包括如下几个方面: 流程 Tile四叉树的构建 LOD 流程 首先,通过上篇的类关系描 ...

  9. 两种交换机配置模式,以配置基于端口划分的VLAN为例

    关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在 ...

随机推荐

  1. NOI 2017 Day1 题解

    被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...

  2. PAT (Basic Level) Practice (中文)1014 福尔摩斯的约会 (20分)

    1014 福尔摩斯的约会 (20分) 带侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hys ...

  3. 学习笔记-React的简单介绍&工作原理

    一.React简单介绍 1.React起源于Facebook内部项目,与2013年5月 2.是一个用于构建用户界面的JavaScript库 二.React特点 1.声明式设计-React采用声明范式, ...

  4. [no code][scrum meeting] Alpha 8

    项目 内容 会议时间 2020-04-14 会议主题 API文档第一版交付 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ). ...

  5. Github Actions 实践

    Github Actions 实践 Github Actions 是 Github 的持续集成服务,通过在 repo 发生特定的行为时执行指定的命令实现自动测试.自动部署等功能. 基本术语 workf ...

  6. Noip模拟30 2021.8.4

    T1 毛一琛 考场上打的稳定的$O((2^n)^2)$的暴力.其实再回忆一下上次那道用二进制枚举的题$y$ 就可以知道一样的道理,使用$\textit{Meet In the Middle}$, 按照 ...

  7. csp-s 2021

    T1 廊桥分配 当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位. 乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折. 然而,因为廊桥的数量有限,所以这 ...

  8. 一文读懂Android进程及TCP动态心跳保活

    一直以来,APP进程保活都是 各软件提供商 和 个人开发者 头疼的问题.毕竟一切的商业模式都建立在用户对APP的使用上,因此保证APP进程的唤醒,提升用户的使用时间,便是软件提供商和个人开发者的永恒追 ...

  9. (一)Mongodb学习之 Centos 7 单机部署

    学习参考:https://www.runoob.com/mongodb/mongodb-tutorial.html 一.部署环境 1.系统:Centos 7 2.mongodb: mongodb-li ...

  10. Spring Cloud Gateway实战之一:初探

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<Spring Cloud Gateway实 ...