摘要:
突然发现,如果C++的类成员中存在共有的成员,则可以通过指针的偏移来访问私有的成员变量,当然前提是对内存对齐比较清楚。只要骗过了编译器就可以为所欲为了。#include #include #include #include using namespace std;struct Node {private: double a; char b;public: void display() { printf("%p %p %p\n", &a, &b, &c); } int c; Node() : a(1000.0), b('b'), c(3 阅读全文
摘要:
题意:给定N个数a1,a2,a3...aN,现在要求最小的n满足 n!/(a1!*a2!*...*aN!) 是一个正整数的最小的n。分析:这题的想法很明确,就是分解a1!*a2!*...*aN!,把其分解成质因子相乘的形式,这个都很熟悉了,然后就是对每一个质因子二分搜索出一个数字下界,最后求其中最大的一个数,问题的关键就是如何分解这样一个表达式成一个质因子相乘的形式。使用一个cnt数组来表示每一个数的在乘积中出现的次数,然后从后往前假设一个数出现了k次,那么如果这个数是素数则不用更新,如果一个数是合数则将其分解成两部分,一个是该数最小的质因子,一个是除以这个质因子之后的值,接着一直做下去,就能 阅读全文
摘要:
题意:给定一个长度为N的序列,现在要求给出一个最长的序列满足序列中的元素严格上升并且相邻两个数字的下标间隔要严格大于d。分析:1.线段树由于给定的元素的取值范围为0-10^5,因此维护一棵线段树,其中[l, r]的信息表示处理完前k个数时,序列最大元素落在[l, r]区间最长上升子序列的长度。从前往后处理给定的数组,处理到第 i 号元素时,更新第 i - d 号元素,这样就能够保证最长上升的序列间隔大于d,更新是需要更新到叶子节点的,但这里更新是单点更新,每次更新的位置是该元素的值,信息就是到该点的最长上升长度。其实仔细分析可以发现这个解法其实是经典的O(n^2)的算法的改进,那个算法需要遍历 阅读全文
摘要:
题意:如果一个数中的某一段是长度大于2的菲波那契数,那么这个数就被定义为F数,前几个F数是13,21,34,55......将这些数字进行编号,a1 = 13, a2 = 21。现给定一个数n,输出和n相差最小的数ax与n的差值的绝对值,其中下标x满足是一个菲波那契数。分析:该题所求真是九曲十八弯,说了那么多其实要解决的问题可以转化为给定一个x,求1-x之间有多少个F数,通过二分查找能够把下标是菲波那契数的序列求出来,之后就直接for循环找到那个最相近的数就可以了。关键是如何求解1-x之间有多少个F数,容易想到的是数位dp,但是这里不太好弄,因为10^11次方之内有50多个数,每个数又有一定的 阅读全文
摘要:
题意:给定一个无向图,首先判定是否成环,然后求一条最长链。分析:成环用并查集,最长链就是个最简单的树形dp了。#include #include #include #include #include #pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;const int N = 100005;int n, m, ans;int set[N];int dp[N];struct Edge { int v, f; Edge() {} Edge(int _v, int _f) : v( 阅读全文
摘要:
题意:给定N个点,现在要求出从1号点到N号点的最短路。题目给的限制条件就是对于某条路径是不能够走的,但是可以选择某段路径走,另外就是所走的路径的标号必须是递增的。分析:由于给定的是一些列的坐标点,这也就说原图其实是一个完全图。对于限制路径,其实只要限制的路径上点数超过2,那么明显可以选择从起点直接走到终点这条最短路来代替限制路径,因此该限制不起作用,而对于限制路径上点数为2的路径则需要标记一下不能够取。对于最终路径要求点坐标路径递增这一条件则直接在floyd处理的时候限制好i,j,k三者的关系即可。#include #include #include #include #include #de 阅读全文
摘要:
A.Xenia and Divisors题意:给定N个数,每个数的取值范围为1-7,N是3的倍数,判定是否能够恰好将N个数分成若干三元组,使得一个组中的元素a,b,c满足 a #include #include #include using namespace std;const int N = 100005;int n;int cnt[10];int main() { int x; bool flag = false; scanf("%d", &n); for (int i = 0; i F 同理,因此直接模拟即可。#include #include #inclu 阅读全文
摘要:
题意:给定区间[L, R]求区间内与7无关数的平方和。一个数当满足三个规则之一则认为与7有关:1、整数中某一位是7;2、整数的每一位加起来的和是7的整数倍;3、这个整数是7的整数倍;分析:初看起来确实有点麻烦,数位DP还是很容易看出来的,需要维护好三个值dp[ i ][ j ][ k ].num表示数位和为对7的余数为 j ,前面确定的数对7的余数为 k 的情况下, i 位任意与7无关的数一共有多少个;同理dp[ i ][ j ][ k ].sum 表示这些数的和为多少;dp[ i ][ j ][ k ].sqr 表示这些数的平方和为多少,这三者之间是可以递推的,详见代码。个人觉得将区间左右边 阅读全文
摘要:
题意:给定N个点,M条边,M >= N-1。已知M条边都有一个权值,已知前N-1边能构成一颗N个节点生成树,现问通过修改这些边的权值使得最小生成树为前N条边的最小改动总和为多少?分析:由于计算的最小改动且为最小生成树则显然前N-1条边肯定权值都减少,后面的边权值都增加。由于选择的边为前N-1得到最小生成树,因此首先将N-1条边构图,然后对后面的每一条边,那么这条边所构成的环中,有任意一条边的a与该边b,设原始权重为w[a],w[b],改变量为d[a],w[b],则有w[a] - d[a] = 0表现在图中就是每个点对之间连了一条权值为0的边,这样才能够保证求出来的值都是正值。简要分析其原 阅读全文
摘要:
Ubuntu 12.04常用的快捷键超级键操作1、超级键(Win键)–打开dash。 www.2cto.com 2、长按超级键– 启动Launcher。并快捷键列表。3、按住超级键,再按1,2,3等数字键–从Launcher打开一个应用程序,当你按住超级键时,每个应用程序图标上都会显示一个数字,按下对应的数字就会打开盖应用程序。4、超级键+A–从Launcher打开应用程序窗口。5、超级键+F–从launcher打开文件和文件夹窗口。6, 超级键+M–从launcher打开音乐窗口。7, 超级键+V–从Launcher打开Vedio视频窗口。8、超级键+W–伸展模式,缩小所有工作空间中的窗口。 阅读全文