C++ 多重集的使用】的更多相关文章

C++ 多重集的使用 多重集当中的数据映射关系将不是前面的一对一的关系,而是一对多,也就是可以在容器当中插入具有相同key的实例.关于组织方式,LZ进行了下面的大胆的预测. 第一.底层的数据组织方式如果是红黑树,那么就会将具有相同key的数据连续存放,也就是在红黑树的中序遍历中他们是挨着的. 第二.如果是使用hash函数,我猜测是使用了另外一种容器,将他们放到了一个链表当中,因为他们简直相同,无需对key进行排序,这里唯一有价值的是时间信息,因此使用链表足矣. 这里的多重集包括了multimap…
描述 https://vijos.org/p/1792 共n种花,第i种花有a[i]个,要摆m个,同一种花连续且花按照序号从小到大排,问共有多少种摆花方案.   描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾 客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花 需按标号的从小到大的顺序依次摆列.试编程计算,一共有多少种不同的摆花方案. 格式 输入格式 [输入] 输入…
描述 http://poj.org/problem?id=3046 n种蚂蚁,第i种有ai个,不同种类的蚂蚁可以相互区分,但同一种类的蚂蚁不能相互区分,从这些蚂蚁中取出s,s+1,s+2,...,b-1,b个,问每种取的方式的取法数之和. 原型:多重集组合数: n种物品,第i种有ai个.不同种类的物品可以相互区分,但同一种类的物品不能相互区分.从这些物品中取出m个,有多少种取法? Ant Counting Time Limit: 1000MS   Memory Limit: 65536K Tot…
Problem I: STL--多重集的插入和删除 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1729  Solved: 1258[Submit][Status][Web Board] Description 给你一个集合,一开始集合是空集,然后进行若干操作,最后你要从小到大输出集合中的元素,以空格隔开.(集合中可能会有相同元素) Input 一共有若干输入数据,开头一个n(n<=20),n=0代表输入结束. 然后有n行,每行有2种形式: &quo…
题意:给出n个电视节目的起始和结束时间  并且租一台电视需要x +y*(b-a)  [a,b]为时段 问完整看完电视节目的最小花费是多少 思路:贪心的思想 情况1 如果新租一台电视的花费<=在空闲电视上面看节目 那么肯定新租电视 情况2 否则就直接在空闲电视上看 就好 模拟难(QAQ): 这里使用多重集合模拟   先把所有时间的pair(结束时间,开始时间) 放入多重集里面 然后开一个数组以l 从小到大排序 从数组小到大 枚举  在多重集里面找离终点最近的那个点 如果符合情况1 那么就删去 找到…
https://www.luogu.org/problemnew/solution/P4778 非常好的题目,囊括了乘法加法原理和多重集合排列,虽然最后使用一个结论解出来的.. 给定一个n的排列,用最少的次数将排列变成单调递增请问这样的操作有多少种 套路:位置i向位置p[i]连单向边,最后会形成l个环 先来考虑单个环: 引理:将长度为len的环拆成len个自环至少操作len-1次 套路: 一个数对应有且仅有一个位置,且一个位置有且仅有一个数 这就意味着整个图上每个点入度出度都为1 也就意味着图上…
http://acm.hdu.edu.cn/showproblem.php?pid=6397 原问题的本质是问m个元素的多重集S,每一种类型的对象至多出现n-1次的S的k组合的个数是多少? 等价于 x1+x2+...+xm=k  0<xi<=n-1  的解的个数 当xi没有上限(xi<=n-1)时由隔板法得C(k+m-1,m-1) 而有上限时,方法是构造母函数(1+x+....+x^(n-1))^m  答案是x^k的系数 对母函数用等比数列求和再二项式展开加泰勒展开得答案.orz(解法来…
Ant Counting Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submission(s) : 3   Accepted Submission(s) : 2 Problem Description Bessie was poking around the ant hill one day watching the ants march to and fro w…
#include<bits/stdc++.h>using namespace std;const long long N=1e5+5;const long long MOD=1e9+7;long long n,x,y,ans=0;long long cost[N];pair<long long,long long>a[N];multiset<pair<pair<long long,long long>,long long> >s;int main…
#include<bits/stdc++.h>using namespace std;const int maxn=1e6+7;pair<string,int>p[maxn];int nn,n;int cmp(pair<string,int>a,pair<string,int>b){    return a.first.length()<b.first.length();}char ans[maxn];multiset<string>sst…
题目:http://poj.org/problem?id=3046 就是多重集组合数(分组背包优化): 从式子角度考虑:(干脆看这篇博客) https://blog.csdn.net/viphong/article/details/48110525 从意义的角度来考虑: 当 j<=a[i] 时,f[i][j] = f[i-1][j]  + f[i][j-1],就是分成了不选第 i 种物品和至少选一个第 i 种物品的情况,其中 f[i][j-1] 代表 j-1 后剩下的那一个物品一定是第 i 种:…
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long ans[1000007];vector<pair<int,int> >add[1000007],remv[1000007];multiset<int>s[1000007];//也可以用deque,rmq等数据结构实现,多重集自带排序int main(){ int n,w; cin>>n&…
xiaoxin juju needs help 题意:给你一个字符串,求打乱字符后,有多少种回文串.                      (题于文末) 知识点: n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! 同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n. 对于这样的n个元素进行全排列,可得不同排…
输入: n=3 m=3 a={1,2,3} M=10000 输出: 6  (0+0+3,0+1+2,0+2+1,1+0+2,1+1+1,1+2+0) 为了不重复计数,同一种类的物品最好一次性处理好.于是我们按照如下方式进行定义. dp[i+1][j]=从前i种物品中取出j个的组合总数 复杂度:O(nm) int n,m; int a[MAX]; int dp[MAX][MAX]; //数组 void solve() { //一个都不取的方法总是只有一种 ; i<=n; i++){ dp[i][]…
Ant Counting 直接翻译了 Descriptions 贝西有T种蚂蚁共A只,每种蚂蚁有Ni只,同种蚂蚁不能区分,不同种蚂蚁可以区分,记Sum_i为i只蚂蚁构成不同的集合的方案数,问Sum_k(S≤k≤B)之和.Input第一行4个整数T.A.S.B. 接下来A行,每行一个整数,代表这只蚂蚁的种类.Output输出Sum_k(S≤k≤B)之和. (数据范围见原文) Sample Input 3 5 2 3 1 2 2 1 3 Sample Output 10 题目链接 https://v…
当初学者最开始学习 dp 的时候往往接触的是一大堆的 背包 dp 问题, 那么我们在这里就不妨讨论一下常见的几种背包的 dp 问题: 初级的时候背包 dp 就完全相当于BFS DFS 进行搜索之后的记忆化查找. 背包问题 一 .   0 ~ 1 背包问题 实现一. return max ( rec ( i + 1, j ) , rec ( i + 1, j - cost[ i ]) + value[ i ]); //对第 i  件物品的选或者不选 记忆化.      这个是由于实现一产生的dp数…
题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  实际就是要解决 => 从 n 种物品中取出 m 个有多少种取法 ( 同种无法区分 ) 计数问题的 DP 定义必须保证不重复计数 这里定义 dp[i+1][j] => 从前 i 种物品中取出 j 个的组合数 根据定义为了从前 i 种物品中取出 j 个,可以从前 i-1 中取出 j-k 个并从 i…
UVa Online Judge 题意是计算给定数量的边通过串联并联两种方式,能组成多少种不同的网络.将它转化为一个树形结构,也就是求有多少不同构的树. 代码如下: #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; ; LL ans[N]; int s[N], top;…
#include <cstdio> #include <iostream> using namespace std; +; +; +; ; int n,m,M; int a[max_n]; int dp[max_M][max_M]; // dp[i][j]:从前i件商品中,选出j个的组合数 void solve() { // 初始化dp数组,无论当前有多少件,一件都不取的方法只有一种哦 ;i<=n;++i) { dp[i][]=; } // 从第一件物品开始取 ;i<=…
如果有一对时间对在某一场馆有时间重合而这一对时间对在另一场馆没有时间重合,则输出NO,否则输出YES. #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; vector<pair<pair<int,int>,pair<int,int> > >v1,v2; int check(const vector<pair<pair<int,int…
题意: 输入一个正整数N(<=1e5),接下来输入N个正整数.输出第一个独特的数(N个数中没有第二个和他相等的),如果没有这样的数就输出"None". AAAAAccepted code: #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; multiset<int>st; ]; int main(){ ios::sync_with_stdio(false);…
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[7007],b[7007];multiset<long long>st;int visit[7007];int main(){ int n; cin>>n; for(int i=1;i<=n;++i){ cin>>a[i]; st.insert(a[i]); } for(int i=1;i…
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;multiset<long long>mst;long long a[100007];int main(){ long long n; cin>>n; long long x; for(long long i=0;i<n;++i){ cin>>x; a[x]=i; } mst.insert(-1); mst.in…
前言 总括: 本文讲解了数据结构中的[集合]概念,并使用javascript实现了集合. 原文博客地址:学习javascript数据结构(三)--集合 知乎专栏&&简书专题:前端进击者(知乎)&&前端进击者(简书) 博主博客地址:Damonare的个人博客 人生多风雨,何处无险阻. 正文 集合简介 在上一篇学习javascript数据结构(二)--链表中我们说了链表这种数据结构,但归根结底,不论是栈,队列亦或是链表都是线性结构.他们都是一种很规矩的数据结构,就像幼儿园的小朋…
        题目链接详见SCNU 2015新生网络赛 1007. ZLM的扑克牌 .         其实我在想这题的时候,还想过要不要设置求最小的排列,并且对于回文数字的话,可以把扑克牌折起来(从而这个数字会变小):甚至要不要设置扑克牌旋转.翻转之后,读出的数字要改变.但这样的话好像我也不会做辣!= =|||于是这道题目最后就变成了一个简单贪心题.题目大意大概就是这样的:给出一个包含$n$个数字的多重集,要求使用集合中的元素拼凑出一个最大的数字,问最大所能拼凑出的数字是多少?       …
数学什么的....简直是丧心病狂啊好不好 引入:Q1:前n个数中最多能取几个,使得没有一个数是另一个的倍数   答案:(n/2)上取整 p.s.取后n/2个就好了 Q2:在Q1条件下,和最小为多少 答案:从n/2向前枚举,对于每个数,倍增考虑后面选的数有多少个是它的倍数,如果只有一个,就用当前数替换后面的那个 (复杂度:nloglogn) 正文: 一.gcd与exgcd gcd(a,b)=gcd(b%a,a)  exgcd:已知Ax≡B (%C) 则Ax+By=C int g=gcd(A,B,C…
Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等.而且它在STL中时间效率也很高效:几乎与数组不相上下. #include <cstdio> #include <cstdlib> #include <algorithm> #include <vector> //定义头文件 using namespace std; vector<int> v; //定义一个vector数…
找单词 题意: 中文题,考虑是不是要写个英文题意..(可惜英语水平不够  囧rz)                (题于文末) 知识点: 母函数(生成函数): 生成函数有普通型生成函数和指数型生成函数两种(本题是普通型). 形式上,普通型母函数用于解决多重集的组合问题, 指数型母函数用于解决多重集的排列问题. 母函数还可以解决递归数列的通项问题(例如使用母函数解决斐波那契数列,Catalan数的通项公式). 普通母函数: 构造母函数G(x), G(x) = a0 + a1*x + a2* + a…
题意: 有n种物品,并且知道每种物品的数量ki.要求从中选出m件物品的排数.         (全题文末) 知识点: 普通母函数 指数型母函数:(用来求解多重集的排列问题) n个元素,其中a1,a2,····,an互不相同,进行全排列,可得n!个不同的排列. 若其中某一元素ai重复了ni次,全排列出来必有重复元素,其中真正不同的排列数应为 ,即其重复度为ni! 同理a1重复了n1次,a2重复了n2次,····,ak重复了nk次,n1+n2+····+nk=n. 对于这样的n个元素进行全排列,可得…
--正文 多重集合数 + 组合数取模 首先求出没有限制的选择方法C(n+m-1,m) 然后减掉至少有一个元素选择了k+1次的方法数,加上至少有两个元素选择了k+1次的方法数...以此类推 然后是组合数的计算 C(n,m) % p= (n! / (m! * (n-m)!)) % p 由乘法逆元的性质和费马小定理可以算出 C(n,m)  % p= n! * (m!*(n-m)!)^(p-2) 后面的幂次使用快速幂可以轻松算出 #include <cstdio> #include <cstri…