题目背景

由于出题人赶时间所以没办法编故事来作为背景。

题目描述

一开始有\(n\)个苹果,\(m\)个人依次来吃苹果,第\(i\)个人会尝试吃\(u_i\)或\(v_i\)号苹果,具体来说分三种情况。

• 1、两个苹果都还在,那么这个人将随便选一个苹果吃了。

• 2、只有一个苹果,那么这个人将吃掉这个苹果。

• 3、都不在了,这个人吃不到苹果就走了。

请问有多少对苹果\((i,j)\)(\(i<j\))满足它们两个都幸存下来的概率\(>0\)。

输入输出格式

输入格式

第一行两个数\(n,m\)。

接下来\(m\)行,每行两个数\(u_i,v_i\)。

输出格式

一个数表示答案。

数据范围

对于测试点 1 ∼ 5: \(n, m \le 20\)。

对于测试点 5 ∼ 8:若把苹果看做点,人看做边,那么会形成一棵树。

对于测试点 9 ∼ 15: \(m \le 400\)。

对于测试点 16 ∼ 25:无特殊限制。

对于所有的数据, \(n \le 400\); \(m \le 5 \times 10^4\)。


牛 逼 题 !

通过手玩,我们可以发现一些简单但没有什么用的结论。

一些很自然的想法是,从第二个点给出的提示着手,或者是对每个点分开统计(毕竟点不多)之类的

但是直接出正解还是很困难,不接触过这种类型基本不可能吧。

考虑一个可存活的苹果集合\(S\)是否可以在\(k\)时间段合法

设\(f_k(S)\)表示\(k\)时间段集合\(S\)是否合法,考虑它的递推式

若\(k\)时间的边为\(E(u,v)\)

则当\(u \in S \ and \ v \in S\)时,\(f_k(S)=0\)

当\(u \in S \ or \ v \in S\)时,\(f_k(S)=f_{k-1}(S \bigcup \{v\}) \ or \ f_{k-1}(S \bigcup \{u\})\)

当\(u \notin S \ and \ v \notin S\)时,\(f_k(S)=f_{k-1}(S)\)

然而这有什么用呢,集合的状态如此多。

我们再次回到题目,要求我们统计点对是否合法,如果对点对\((u,v)\),它的\(f_m(\{u\})=1,f_m(\{v\})=1\)是否意味着它合法呢?

如果这个终止状态合法,那么包含这个终止状态的集合是否需要考虑呢?

第二个问题比较显然,贪心的去想,我们只需要讨论最后的一个最小的集合作为终止状态就一个不会更差了。

如果我们去思考第二个问题,可以发现它是不一定的,于是似乎又陷入了僵橘。

考虑终止状态唯一,想到每次期望\(DP\)都是倒着做的,这个题是否可以从终止状态往回推呢?

考虑回推

初始:\(f_m\{i\}=1\)

当\(u \in S \ and \ v \in S\)时,此时推不回去了,说明没有情况可以推回去

当\(u \in S \ or \ v \in S\)时,\(f_k(S \bigcup \{v\} \ or \ S \bigcup \{u\})=f_{k+1}(S)\)

当\(u \notin S \ and \ v \notin S\)时,\(f_k(S)=f_{k+1}(S)\)

如果这个点在中途都回不去,说明它和谁都配不了

如果这个点搞完了所有的边并且得到了集合\(G\),则集合\(G\)包含的元素是得到它,一定要删去的点集(除了它自己)

于是这里就比较明了了,如果点对\((u,v)\)可以配对,当且仅当两者都可以推回去且推回去的\(G_u \bigcap G_v = \varnothing\)

这里这个集合用\(bitset\)维护一下

复杂度\(O(n^2m/ \omega)\)


Code:

#include <cstdio>
#include <bitset>
const int N=402;
std::bitset <N> g[N];
struct node{int u,v;}e[50010];
int n,m,f[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&e[i].u,&e[i].v);
for(int i=1;i<=n;i++)
{
g[i][i]=1;
for(int j=m;j;j--)
{
int u=e[j].u,v=e[j].v;
if(g[i][u]&&g[i][v]) {f[i]=1;break;}
if(g[i][u]||g[i][v]) g[i][u]=g[i][v]=1;
}
}
int ans=0;
for(int i=1;i<=n;i++)
if(!f[i])
for(int j=i+1;j<=n;j++)
if(!f[j]&&!(g[i]&g[j]).count())
++ans;
printf("%d\n",ans);
return 0;
}

2018.10.5

雅礼集训 Day5 T3 题 解题报告的更多相关文章

  1. 雅礼集训 Day3 T3 w 解题报告

    w 题目背景 \(\frac 14\)遇到了一道水题,双完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607^2\)眼就切掉了这题,嘲讽了\(\frac 14 ...

  2. 雅礼集训 Day1 T3 画作 解题报告

    画作 题目描述 小\(\mathrm{G}\)的喜欢作画,尤其喜欢仅使用黑白两色作画. 画作可以抽象成一个\(r\times c\)大小的\(01\)矩阵.现在小\(\mathrm{G}\)构思好了他 ...

  3. 雅礼集训 Day2 T3 联盟 解题报告

    联盟 题目描述 \(\text{G}\) 国周边的 \(n\) 个小国家构成一个联盟以抵御 \(\text{G}\) 国入侵, 为互相支援,他们建立了\(n−1\) 条双向通路, 使得任意两个国家可以 ...

  4. 「雅礼集训 2017 Day2」解题报告

    「雅礼集训 2017 Day2」水箱 我怎么知道这种题目都能构造树形结构. 根据高度构造一棵树,在树上倍增找到最大的小于约束条件高度的隔板,开一个 \(vector\) 记录一下,然后对于每个 \(v ...

  5. 「雅礼集训 2017 Day1」 解题报告

    「雅礼集训 2017 Day1」市场 挺神仙的一题.涉及区间加.区间除.区间最小值和区间和.虽然标算就是暴力,但是复杂度是有保证的. 我们知道如果线段树上的一个结点,\(max=min\) 或者 \( ...

  6. 雅礼集训 Day3 T2 u 解题报告

    u 题目背景 \(\frac 14\) 遇到了一道水题,完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了一眼就切掉了这题,嘲讽了\(\frac 14\)一番就离开了. ...

  7. 雅礼集训 Day3 T2 v 解题报告

    v 题目背景 \(\frac 14\)遇到了一道水题,又完全不会做,于是去请教小\(\text{D}\).小\(\text{D}\)看了\(0.607\)眼就切掉了这题,嘲讽了\(\frac 14\) ...

  8. 雅礼集训 Day7 T1 Equation 解题报告

    Reverse 题目背景 小\(\text{G}\)有一个长度为\(n\)的\(01\)串\(T\),其中只有\(T_S=1\),其余位置都是\(0\).现在小\(\text{G}\)可以进行若干次以 ...

  9. 雅礼集训 Day6 T2 Equation 解题报告

    Equation 题目描述 有一棵\(n\)个点的以\(1\)为根的树,以及\(n\)个整数变量\(x_i\).树上\(i\)的父亲是\(f_i\),每条边\((i,f_i)\)有一个权值\(w_i\ ...

随机推荐

  1. udp回显客户端发送的数据

    这里让客户端给服务端发送的数据被服务端自动发回来 客户端: import socket client_socket = socket.socket(socket.AF_INET, socket.SOC ...

  2. JSONArray.fromObject不执行且不报错问题的解决

    今天在写javaweb工程的时候需要向前台传json格式的数据,用到了json-lib-2.4-jdk15.jar等一系列包,然而却出现如下状况: CityBean是一个javaBean,我们看到,控 ...

  3. JAVA实现RSA加密,非对称加密算法

    RSA.java package org.icesnow.jeasywx.util.security; import java.security.Key; import java.security.K ...

  4. 使用myeclipse创建servlet后输入地址无法访问

    问题: 使用myeclipse创建servlet后输入地址无法访问 1.首先,路径的访问地址是在web.xml里设置的,一般会自动生成(但是可能会和你自己输入的有出入) 你必须按照<url-pa ...

  5. 【Effective C++ 读书笔记】条款04:确定对象使用前已先被初始化

    永远在使用对象之前先将它初始化.对于无任何成员的内置类型,你必须手工完成此事. 至于内置类型以外的任何其他东西,初始化责任落在构造函数身上.规则很简单:确保每一个构造函数都将对象的每一个成员初始化. ...

  6. 通信服务器哈希Socket查找(Delphi)

    在Socket通信服务器的开发中,我们经常会需要Socket与某个结构体指针进行绑定.当连接量很大时,意味着需要个高效的查找方法 Delphi中提供了哈希算法类,以此类为基础,修改出Socket专用M ...

  7. elasticsearch 5.x 系列之二 线程池的设置

    1,概述 每个Elasticsearch节点内部都维护着多个线程池,如index.search.get.bulk等,用户可以修改线程池的类型和大小,以及其他的比如reflesh, flush,warm ...

  8. Python全栈day 01

    Python全栈day 01 一.计算机认识 用户 软件,类似微信.QQ.游戏等应用程序,由程序员编写,在系统中运行,完成各种活动,方便人们使用. 操作系统,主要分为windows系统.Linux系统 ...

  9. 2-安装linux7

    1.操作系统简介 操作系统: 桌面操作系统 redhat fedora slackware ubuntu debian suse linux centos 服务器操作系统 linux redhat s ...

  10. (C)spring boot读取自定义配置文件时乱码解决办法

    这是入门的第三天了,从简单的hello spring开始,已经慢慢接近web的样子.接下来当然是读取简单的对象属性了. 于是按照网上各位大神教的,简单写了个对象book,如上一篇(B),其他配置不需要 ...