传送门

挺遗憾的一个题

考场上想到的思路是题解的退化版,可以有71pts(赛时以为只有20pts),但因为这一场的策略原因没有打……

首先发现颜色种类数很少,可以直接bitset上树剖维护,炸不了空间

所以可以先bitset上树剖处理出每个人到lca经过的颜色集合

然后问题可以转化为给定 \(c\) 个集合,求「让所有集合中剩余元素互不相同且剩余个数相同的最大保留个数」

这个考场上没什么思路,想直接用网络流二分搞,图很好建

至于正解,前面都是一样的,不同之处在于这里的网络流

这里直接建图肯定是源点向每个人建流量为 \(mid\) 的边

但考虑将每个人直接拆成 \(mid\) 个点,问题就转化成了求二分图完美匹配

  • 霍尔定理:一个二分图 \(g\) 存在完美匹配,当且仅当 \(x\) 中的任意 \(k\) 个点都至少与 \(y\) 中的 \(k\) 个点相邻
  • 霍尔定理推论:见这里,貌似很有用的样子但我没康懂

于是对于到这个题上,发现本质不同的左部点很少,而本质相同的左部点对应的相邻点集合是相同的

又有

\[| s | *ans \leqslant | to_s |
\]

移个项,

\[ans = min\{\frac{|to_s|}{|s|}\}
\]
Code:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 300010
#define ll long long
//#define int long long char buf[1<<21], *p1=buf, *p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf, 1, 1<<21, stdin)), p1==p2?EOF:*p1++)
inline int read() {
int ans=0, f=1; char c=getchar();
while (!isdigit(c)) {if (c=='-') f=-f; c=getchar();}
while (isdigit(c)) {ans=(ans<<3)+(ans<<1)+(c^48); c=getchar();}
return ans*f;
} int n, m, q;
int head[N], size, val[N], id[N], rk[N], top[N], siz[N], msiz[N], mson[N], fa[N], tot, dep[N];
bitset<1001> to[6], rec;
struct edge{int to, next;}e[N<<1];
inline void add(int s, int t) {e[++size].to=t; e[size].next=head[s]; head[s]=size;}
int tl[N<<2], tr[N<<2]; bitset<1001> dat[N<<2];
#define tl(p) tl[p]
#define tr(p) tr[p]
#define dat(p) dat[p]
#define pushup(p) dat(p)=dat(p<<1)|dat(p<<1|1)
void build(int p, int l, int r) {
tl(p)=l; tr(p)=r;
if (l==r) {dat[p][val[rk[l]]]=1; return ;}
int mid=(l+r)>>1;
build(p<<1, l, mid);
build(p<<1|1, mid+1, r);
pushup(p);
}
void query(int p, int l, int r, bitset<1001>& ans) {
//cout<<"query1 "<<p<<' '<<l<<' '<<r<<endl;
if (l<=tl(p) && r>=tr(p)) {ans|=dat(p); return ;}
int mid=(tl(p)+tr(p))>>1;
if (l<=mid) query(p<<1, l, r, ans);
if (r>mid) query(p<<1|1, l, r, ans);
} void dfs1(int u) {
siz[u]=1;
for (int i=head[u],v; ~i; i=e[i].next) {
v = e[i].to;
dep[v]=dep[u]+1, fa[v]=u, dfs1(v);
siz[u]+=siz[v];
if (siz[v]>msiz[u]) msiz[u]=siz[v], mson[u]=v;
}
}
void dfs2(int u, int t) {
top[u]=t;
id[u]=++tot;
rk[tot]=u;
if (!mson[u]) return ;
dfs2(mson[u], t);
for (int i=head[u],v; ~i; i=e[i].next) {
v = e[i].to;
if (v!=mson[u]) dfs2(v, v);
}
}
int lca(int a, int b) {
while (top[a]!=top[b]) {
if (dep[top[a]]<dep[top[b]]) swap(a, b);
a=fa[top[a]];
}
if (dep[a]>dep[b]) swap(a, b);
return a;
}
void query(int a, int b, bitset<1001>& ans) {
//cout<<"query2 "<<a<<' '<<b<<endl;
while (top[a]!=top[b]) {
if (dep[top[a]]<dep[top[b]]) swap(a, b);
query(1, id[top[a]], id[a], ans);
a=fa[top[a]];
}
if (dep[a]>dep[b]) swap(a, b);
query(1, id[a], id[b], ans);
} signed main()
{
memset(head, -1, sizeof(head));
n=read(); m=read(); q=read();
for (int i=2; i<=n; ++i) add(read(), i);
for (int i=1; i<=n; ++i) val[i]=read();
dep[1]=1; dfs1(1); dfs2(1, 1); build(1, 1, n);
int t[10];
for (int i=1,c,g; i<=q; ++i) {
c=read();
for (int j=1; j<=c; ++j) t[j]=read();
g=t[1];
for (int j=2; j<=c&&g!=1; ++j) g=lca(g, t[j]);
//cout<<"lca: "<<g<<endl;
for (int j=1; j<=c; ++j) {to[j].reset(); query(g, t[j], to[j]);}
//cout<<1<<endl;
int lim=1<<c, ans=INF;
for (int s=1,s2,cnt; s<lim; ++s) {
s2=s; cnt=0; rec.reset();
do {s2&=s2-1; ++cnt;} while (s2) ;
for (int j=0; j<c; ++j) if (s&(1<<j))
rec|=to[j+1];
//cout<<"upd: "<<rec.count()<<' '<<cnt<<endl;
ans = min(ans, int(rec.count())/cnt);
}
printf("%d\n", ans*c);
} return 0;
}

题解 party?的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

    前言 Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch. Semaphore 意思就是在分布式场景下,只有 3 个凭证,也就意味着同 ...

  2. Blazor 数据绑定开发指南

    翻译自 Waqas Anwar 2021年3月21日的文章 <A Developer's Guide to Blazor Data Binding> [1] 现如今,大多数 Web 应用程 ...

  3. PYTHON 得到光标处的句柄

    import win32api import win32gui import time if __name__ == '__main__': while True: point = win32api. ...

  4. Redis 6.0 新特性:带你 100% 掌握多线程模型

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 码老湿,提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存 ...

  5. [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错

    [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错 目录 [源码解析] 深度学习分布式训练框架 horovod (17) --- 弹性训练之容错 0x00 摘要 0 ...

  6. Kafka之--python-kafka测试kafka集群的生产者与消费者

    前面两篇博客已经完成了Kafka的搭建,今天再来点稍高难度的帖子. 测试一下kafka的消息消费行为.虽然,kafka有测试的shell脚本可以直接测试,但既然我最近在玩python,那还是用pyth ...

  7. 【游记】OI 2020-2021(在更)

    [CSP-S2020初赛] [CSP-S2020] [NOIp 2020] [NOI冬令营 2021] [省选 2021] [NOI 2021]

  8. informix常用函数

    一.常用函数 1.decimal decimal(14,2):14位数,小数占两位:decimal(26,8),有效长度为26,小数位占8位. 2.cast cast:Oracle中的数据类型转换函数 ...

  9. SpringCloud升级之路2020.0.x版-1.背景

    本系列为之前系列的整理重启版,随着项目的发展以及项目中的使用,之前系列里面很多东西发生了变化,并且还有一些东西之前系列并没有提到,所以重启这个系列重新整理下,欢迎各位留言交流,谢谢!~ Spring ...

  10. 深入刨析tomcat 之---第21篇 tomcat 对jsp页面支持的实现原理

    writedby 张艳涛 web技术,以前的动态网页技术多是jsp页面,比如点击一个菜单目录,直接访问了一个LRJSDetailInput.jsp页面,这个页面 有<html><bo ...