题解 P6688 可重集】的更多相关文章

己所欲者,杀而夺之,亦同天赐 解题思路 一定不要用自动溢出的 Hash!!!!!!! 我真的是调吐了... 思路非常简单明了 : 需要我们创新一下 Hash. 首先我们的 Hash 要满足无序性.. 因此我们可以把 Hash 值的意义更改一下. 例如: \(x\) 的 Hash 值是 \(base^x\) 在每两个区间维护两个值:原序列最小值以及 Hash 值的加和 这里不可以记录 Hash 因为取 \(\bmod\) 之后大小就不一定了.. 然后直接线段树维护就好了... 一定不要用自动溢出的…
#include <iostream> using namespace std; void printPermutation(int n, int* A, int cur) { if (cur == n) { // 递归边界 for (int i = 0; i < n; i++) { printf("%d ", A[i]); } printf("\n"); } else { for (int i = 1; i <= n; i++) { //…
非负整数可重集O(n)去重并排序 可重集是指元素可重复的集合,对于在一定区间内的正整数集,比如[1,n],我们可以在不不使用任何额外空间(包括不使用O(1)的空间)的情况下,用O(n)的时间复杂度完成集合的去重并排序,这种O(n)的算法,是理想的联机算法. 思路:本质上和桶排序类似,用数组下标来表示存在的元素,数组中的元素作为flag. 对于正整数可重集来说,打标记的方法可以是将元素变负(思考,为什么不是随便赋一个规定的值),负整数依次类推. 对于元素属于[1,n]的集合(n为元素个数),我们可…
生成1~n的排列: #include<iostream> using namespace std; void print_permutation(int n, int *A, int cur) /*n代表这个排列中的元素数*/ { if(cur == n) /*边界*/ { for(int i = 0; i < n; i++) cout << A[i] << " "; cout << endl; } else for(int i =…
传送门 Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间.  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K.Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍. 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以,他想请你帮忙写一个程序来计算答案. Input 第一行包含两个整数 N和M(0<N<…
题目链接 题目大意:给定一张$n$个点$m$条边的无向图.每条边有长度和海拔.有$Q$次询问,每次给定起点$v$和当天水位线$p$,每次终点都是$1$.人可以选择坐车或走路,车只能在海拔大于水位线的路上跑.问人步行的最小距离. ---------------------------------- 我们可以转化一下题意:在$v$到$1$的路径上寻找断点$u$,使得从$v$到$u$的路径上车都可以跑,且从$u$到$1$步行的路径是满足前置条件的最短的一条路. 显然从$v$开车出发可以到达的点路径的海…
题目链接 给定一张含$n$个点$m$条边的无向图,每个点有一个重要指数$a_i$.有两种操作:1.在$x$和$y$之间连一条边:2.求$x$所在连通块中重要程度第$k$小的点. --------------------------------- 维护第$k$小,很容易想到权值线段树.看到合并二字,可以想到用线段树合并的方法.维护连通块可以用并查集做. 注意并查集合并的方向和线段树合并的方向要一致.查询的时候要先找出并查集的根再查询. 代码: #include<bits/stdc++.h> us…
/** 题目: 链接: 题意: 思路: */ #include <iostream> #include <cstdio> #include <vector> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long LL; ; ; ; int main() { ] = {,,,,}; ; sort(a,…
具体的就不在这里说了,如果有兴趣的可以把我的工程包下载下来看,留个URL http://pan.baidu.com/s/1bnes1HX…
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int ans[6]; int book[6],a[6],n; void dfs(int cnt) { int i,j; if(cnt==n) { for(i=0;i<n;i++) if(!i) printf("%d",ans[i]); else…