bzoj 4874: 筐子放球

4874: 筐子放球

Time Limit: 10 Sec  Memory Limit: 256 MB

Description

小N最近在研究NP完全问题,小O看小N研究得热火朝天,便给他出了一道这样的题目:

有 n 个球,用整数 1 到 n 编号。还有 m 个筐子,用整数1到m编号。

每个球只能放进特定的两个筐子之一,第 i 个球可以放进的筐子记为 Ai 和 Bi 。

每个球都必须放进一个筐子中。

如果一个筐子内有奇数个球,那么我们称这样的筐子为半空的。

求半空的筐子最少有多少个。

小N看到题目后瞬间没了思路,站在旁边看热闹的小I嘿嘿一笑:"水题!"

然后三言两语道出了一个多项式算法。

小N瞬间就惊呆了,三秒钟后他回过神来一拍桌子:

"不对!这个问题显然是NP完全问题,你算法肯定有错!"

小I浅笑:"所以,等我领图灵奖吧!"

小O只会出题不会做题,所以找到了你--请你对这个问题进行探究,并写一个程序解决此题。

Input

第一行两个整数 n,m

接下来 n 行,第 i + 1 行有两个整数 Ai , Bi ,表示第 i 个球可以放的两个筐子。保证 Ai 不等于 Bi

1 <= n,m <= 2 * 10^5,1 <= Ai,Bi <= m

Output

第一行一个整数表示半空的筐子的最小值。

Sample Input

4 3
1 2
2 3
1 3
1 2

Sample Output

0
1,3 号球都放在 1 号筐子,2,4 号球都放在 2 号筐子。

HINT

各位不妨考虑下,如果要求输出方案应该怎么写.

Source

好巧妙的思维题

我们可以把筐子看成点,球当边

然后求一下连通块,含奇数条边的连通块个数即为答案

#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
#define N 400010
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int to[N],lj[N],fro[N],cnt;
void add(int a,int b){fro[++cnt]=lj[a];to[cnt]=b;lj[a]=cnt;}
bool vs[N];
int dfs(int x)
{
    vs[x]=1;int tp=0;
    for(int i=lj[x];i;i=fro[i])
    {
        tp++;
        if(!vs[to[i]]) tp+=dfs(to[i]);
    }
    return tp;
}
int n,m,x,y,ans;
int main()
{
    n=read();m=read();
    for(int i=1;i<=n;i++)
    {
        x=read();y=read();
        add(x,y);add(y,x);
    }
    int tp;
    for(int i=1;i<=m;i++) if(!vs[i])
    {
        tp=dfs(i)>>1;
        if(tp&1) ans++;
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-08-07 15:53:00

bzoj 4874: 筐子放球的相关文章

盒子放球

盒子放球问题 第一类: 将k个球放入n个不同的盒子中,每个盒子放球数>=0,求方法数 假设n个盒子分别放x1,x2,x3...xn,则x1+x2+x3+...+xn=k,令yi=xi+1(1<=i<=n),则yi>=1且y1+y2+...+yn=n+k,相当于求yi这个方程的解组数,可以看成插板问题,往n+k个物品中插入n-1个板,所以答案是C(n+k-1,n-1)=C(n+k-1,k) /* *输入说明:k个相同的球放入n个不同的盒子 *输入每行有两个正整数n和k */ int

盒子放球的DP

URAL1114 题目大意: 有N个盒子,有红色和蓝色两种颜色的球.红球有A个,篮球有B个.现在随意的向盒子里放球, 每个盒子可以放一种颜色的球,也可以放两种颜色的球,也可以不放球.球不必全都放进盒子里.问:总共有多少种方法. 状态dp[i][j][k] 表示向i个盒子里放j个篮球和k个红球的方案数目 状态转移方程:dp[i][j][k]=对dp[i-1][jj][kk] (0<=jj<=j,0<=kk<=k) 求和 最终结果是:在n个盒子里放  不定数目的球的种类数和即   对d

放球问题 组合数学 转自百度百科

放球问题是指把 n个球放到 m个盒子里的方案数.它是组合数学的一个非常重要的问题.根据球是否相同,盒子是否有区别,是否允许有空盒以及n与m 的大小关系,放球问题可分成 16 个子问题.不同情况总结见下表. 1,n 个球有区别,m 个盒子有区别,允许有空盒,n≥m≥1 由于可以有空盒,所以每个球可以放到m个盒子的任意一个盒子里.又因为盒子是有区别的,所以对于任意一个球有m种不同的选择. n个球是有区别的,所以总共有 种方案.比如,当n=3 时,第 1 个球有m种不同选择,第 2 个球有m种不同选择

【题解】放球游戏A

题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.每个人一次只能放1至5个球,最后面对没有空格而不能放球的人为输. 现在Red先走,问他有没有必胜的策略? 比如:N=6时,Red必败. 输入格式 一行,一个整数N(2<N<100). 输出格式 一行,一个整数.如果Red必胜输出1,否则输出0. 输入样例 9 输出样例 1 题解 先说结论,当$6|n$时,先手必输,否则先手必赢. 证明:当$6|n$时,先手放任

放球游戏B

题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.第一个人只能放1个球,之后的人最多可以放前一个人的两倍数目的球,至少放1个球.最后面对没有空格而不能放球的人为输. 现在Red先走,问他有没有必胜的策略? 比如:N=4时,Red必胜. 输入输出格式 输入格式: 一行,一个整数N(2<N<100). 输出格式: 一行,一个整数.如果Red必胜输出1,否则输出0. 输入输出样例 输入样例: 7 输出样例: 0 思

BZOJ 3294: [Cqoi2011]放棋子

3294: [Cqoi2011]放棋子 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 628  Solved: 238[Submit][Status][Discuss] Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出仅一行,即方案总数除以 1,000,000,009的余数. Sample Input

[BZOJ 4563][Haoi2016]放棋子(错排公式)

Description 给你一个N*N的矩阵,每行有一个障碍,数据保证任意两个障碍不在同一行,任意两个障碍不在同一列,要求你在这个矩阵上放N枚棋子(障碍的位置不能放棋子),要求你放N个棋子也满足每行只有一枚棋子,每列只有一枚棋子的限制,求有多少种方案. Solution 其实和给出的障碍没什么关系,可以直接上错排公式(因为一开始的障碍可以看做一个排列,然后放棋子等同于要你生成一个新的不能有和原来位置相同元素的排列) f[n]=(f[n-1]+f[n-2])*(n-1)(为什么的话上一篇里有说Qw

排列组合(盒子放球)

(1)把4个相同的球放到3个相同颜色的盒子中去,问有多少种方法?(2)把4个相同的球放到3个不同颜色的盒子中去,问有多少种方法?(3)把4个不同的球放到3个相同颜色的盒子中去,问有多少种方法?(4)把4个不同的球放到3个不同颜色的盒子中去,问有多少种方法? [解](1)4种,分别是4,0,0|3,1,0|2,2,0|2,1,1.(2)15种 [思路1] [思路2] 公式C(n+r-1,r),n~盒子数,r~球个数 (3)14种 (4)81种

【题解】二人放球

题目描述 校园里在上活动课,Red和Blue两位小朋友在玩一种游戏,他俩在一排N个格子里,自左到右地轮流放小球,每个格子只能放一个小球.每次Red放1个或2个红色的小球,Blue放1个或2个蓝色的小球,问有多少种可行的排放方案? 比如:N=4时,有10种可行的排列方案. 输入输出格式 输入格式 一行,一个整数N.(2<N<40). 输出格式 一行,一个整数M,可行的方案数. 输入输出样例 输入样例 3 输出样例 6 题解 易得这是一个类似Febonacci数列的东西,初始化时前两项乘2即可.