hdu多校第3场C. Dynamic Graph Matching
- Problem C. Dynamic Graph Matching
- Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others)
- Total Submission(s): Accepted Submission(s):
- Problem Description
- In the mathematical discipline of graph theory, a matching in a graph is a set of edges without common vertices.
- You are given an undirected graph with n vertices, labeled by ,,...,n. Initially the graph has no edges.
- There are kinds of operations :
- + u v, add an edge (u,v) into the graph, multiple edges between same pair of vertices are allowed.
- - u v, remove an edge (u,v), it is guaranteed that there are at least one such edge in the graph.
- Your task is to compute the number of matchings with exactly k edges after each operation for k=,,,...,n2. Note that multiple edges between same pair of vertices are considered different.
- Input
- The first line of the input contains an integer T(≤T≤), denoting the number of test cases.
- In each test case, there are integers n,m(≤n≤,nmod2=,≤m≤), denoting the number of vertices and operations.
- For the next m lines, each line describes an operation, and it is guaranteed that ≤u<v≤n.
- Output
- For each operation, print a single line containing n2 integers, denoting the answer for k=,,,...,n2. Since the answer may be very large, please print the answer modulo +.
- Sample Input
- +
- +
- +
- +
- -
- -
- +
- +
- Sample Output
- Source
- Multi-University Training Contest
- Recommend
- chendu
- Statistic | Submit | Discuss | Note
装压dp
+:操作很简单就是:dp[i]+=dp[i-(1<<u)-(1<<v)];
-:操作就想象成反的: dp[i]-=dp[i-(1<<u)-(1<<v)];拿总的减去用到用到u,v
类似于背包某个物品不能放;
- #include <cstdio>
- #include <cstring>
- #include <iostream>
- //#include <algorithm>
- #include <vector>
- using namespace std;
- #define ll long long
- //#define mod 998244353
- const int mod=1e9+;
- ll dp[<<];//dp[i]:i集合内点完全匹配的方案数
- int bit[<<];//i的二进制的1个数;
- ll ans[];
- int lowbit(int x) {return x&-x;}
- int calc(int x)
- {
- int res=;
- while(x){res++;x=x-lowbit(x);}
- return res;
- }
- int main()
- {
- for(int i=;i<(<<);i++)
- bit[i]=calc(i);
- int T,n,m,u,v;
- char op[];
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&n,&m);
- memset(dp,,sizeof dp);
- memset(ans,,sizeof ans);
- dp[]=;
- while(m--)
- {
- scanf("%s%d%d",op,&u,&v);
- u--;v--;
- if(op[]=='+')
- {
- for(int i=(<<n)-;i>;i--)
- if(((<<u)&i)&&((<<v)&i))
- {
- dp[i]+=dp[i-(<<u)-(<<v)];
- ans[bit[i]]+=dp[i-(<<u)-(<<v)]; //对于i集合所有点的匹配,会对ans造成的影响
- dp[i]=dp[i]%mod;
- ans[bit[i]]=ans[bit[i]]%mod;
- }
- }
- else
- {
- for(int i=;i<<<n;i++)
- if(((<<u)&i)&&((<<v)&i))
- {
- dp[i]-=dp[i-(<<u)-(<<v)];
- ans[bit[i]]-=dp[i-(<<u)-(<<v)];
- dp[i]=(dp[i]+mod)%mod;
- ans[bit[i]]=(ans[bit[i]]+mod)%mod;
- }
- }
- for(int i=;i<=n;i=i+)
- {
- if(i!=)
- cout<<" ";
- printf("%lld",ans[i]);
- }
- cout<<endl;
- }
- }
- return ;
- }
hdu多校第3场C. Dynamic Graph Matching的更多相关文章
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- hdu多校第三场
Problem D. Euler Function 思路:打表找找规律. #include<bits/stdc++.h> #define LL long long #define fi f ...
- HDU 6321 Dynamic Graph Matching
HDU 6321 Dynamic Graph Matching (状压DP) Problem C. Dynamic Graph Matching Time Limit: 8000/4000 MS (J ...
- HDU6321 Dynamic Graph Matching【状压DP 子集枚举】
HDU6321 Dynamic Graph Matching 题意: 给出\(N\)个点,一开始没有边,然后有\(M\)次操作,每次操作加一条无向边或者删一条已经存在的边,问每次操作后图中恰好匹配\( ...
- HDU多校训练第一场 1012 Sequence
题目链接:acm.hdu.edu.cn/showproblem.php?pid=6589 题意:给出一个长度为n的数组,有m次操作,操作有3种1,2,3,问操作m次后的数组,输出i*a[i]的异或和 ...
- hdu多校第五场1005 (hdu6628) permutation 1 排列/康托展开/暴力
题意: 定义一个排列的差分为后一项减前一项之差构成的数列,求对于n个数的排列,差分的字典序第k小的那个,n<=20,k<=1e4. 题解: 暴力打表找一遍规律,会发现,对于n个数的排列,如 ...
- Harvest of Apples (HDU多校第四场 B) (HDU 6333 ) 莫队 + 组合数 + 逆元
题意大致是有n个苹果,问你最多拿走m个苹果有多少种拿法.题目非常简单,就是求C(n,0)+...+C(n,m)的组合数的和,但是询问足足有1e5个,然后n,m都是1e5的范围,直接暴力的话肯定时间炸到 ...
- 2014 HDU多校弟九场I题 不会DP也能水出来的简单DP题
听了ZWK大大的思路,就立马1A了 思路是这样的: 算最小GPA的时候,首先每个科目分配到69分(不足的话直接输出GPA 2),然后FOR循环下来使REMAIN POINT减少,每个科目的上限加到10 ...
随机推荐
- docker+kafka+zookeeper+zipkin的安装
1. 启动zookeeper容器 docker search zookeeper docker pull wurstmeister/zookeeper docker run -d --name zoo ...
- java框架之SpringBoot(2)-配置
规范 SpringBoot 使用一个全局的配置文件,配置文件名固定为 application.properties 或 application.yml .比如我们要配置程序启动使用的端口号,如下: s ...
- CSS中list-style详解
取消默认的圆点和序号可以这样写list-style:none;, list的属性如下: list-style-type:square;//正方形 list-style-position:inside; ...
- 【LeetCode每天一题】Merge Intervals(合并区间)
Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6],[8, ...
- Python基础(十二) 类私有成员和保护成员
python中的protected和private python中用 _var :变量名前一个下划线来定义,此变量为保护成员protected,只有类及其子类可以访问.此变量不能通过from XXX ...
- python进阶(二) 多进程+协程
我们大多数的时候使用多线程,以及多进程,但是python中由于GIL全局解释器锁的原因,python的多线程并没有真的实现 实际上,python在执行多线程的时候,是通过GIL锁,进行上下文切换线程执 ...
- linux关闭终端响铃
title: linux关闭终端响铃 date: 2018-01-25 15:10:14 tags: linux categories: linux 在终端输入或是直接在.bashrc里添加一行 xs ...
- DX9 DirectX 索引缓存(IndexBuffer) 代码
// @time: 2012.3.22 // @author: jadeshu // des: 索引缓存 //包含头文件 #include <Windows.h> #include < ...
- docker启动后忘记挂载nvidia-docker-volume的解决方法
进入 docker 目录 删除 volumes 下的所有文件 重新启动docker 运行nvidia-docker run XXX 来生成volume 修改所有 docker目录下containers ...
- Zeu.js
一个生成各种 GIF 动画的 JavaScript 类库,非常适合用于让你的数据展示变得更加地生动.使用起来也非常简单,有数据展示需求的同学可以尝试一下.https://shzlw.github.io ...