memset

将INF设置为0x3f3f3f3f

南笙酒味 提交于 2019-11-30 06:19:27
在算法竞赛中,我们常常需要用到一个“无穷大”的值,对于我来说,大多数时间我会根据具体问题取一个99999999之类的数(显得很不专业啊!) 在网上看别人代码的时候,经常会看到他们把INF设为0x7fffffff,奇怪为什么设一个这么奇怪的十六进制数,一查才知道,因为这是32-bit int的最大值。如果这个无穷大只用于一般的比较(比如求最小值时min变量的初值),那么0x7fffffff确实是一个完美的选择。 但是更多情况下,0x7fffffff并不是一个好的选择,比如在最短路径算法中,我们使用松弛操作: if (d[u]+w[u][v]<d[v]) d[v]=d[u]+w[u][v]; 如果u,v之间没有边,那么w[u][v]=INF,如果我们的INF取0x7fffffff,那么d[u]+w[u][v]会溢出而变成负数,我们的松弛操作便出错了! 准确来说,0x7fffffff不能满足“无穷大加一个有穷的数依然是无穷大”这个条件,它会变成了一个很小的负数。 更进一步的,如果有一个数能够满足“无穷大加无穷大依然是无穷大”,那么就更好了! 前阵子无意中看到了一个不一样的取值,INF=0x3f3f3f3f,这时我又郁闷了,这个值又代表的是什么?于是我去寻找答案,发现这个值的设置真的很精妙! 0x3f3f3f3f的十进制是1061109567,是10^9级别的

P2604 [ZJOI2010]网络扩容

耗尽温柔 提交于 2019-11-30 03:26:47
题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求: 1、 在不扩容的情况下,1到N的最大流; 2、 将1到N的最大流增加K所需的最小扩容费用。 输入格式 输入文件的第一行包含三个整数N,M,K,表示有向图的点数、边数以及所需要增加的流量。 接下来的M行每行包含四个整数u,v,C,W,表示一条从u到v,容量为C,扩容费用为W的边。 输出格式 输出文件一行包含两个整数,分别表示问题1和问题2的答案。 输入输出样例 输入 #1 复制 5 8 2 1 2 5 8 2 5 9 9 5 1 6 2 5 1 1 8 1 2 8 7 2 5 4 9 1 2 1 1 1 4 2 1 输出 #1 复制 13 19 说明/提示 30%的数据中,N<=100 100%的数据中,N<=1000,M<=5000,K<=10 思路 有点暴力。先跑一遍dinic,求出第一问的解,再重新建图,讲扩容记为容量inf,费用的边,最后新建t点,容量为maxflow+k,跑最大流最小费用,即可得到ans。 代码 #include<bits/stdc++.h> #define N 10700 #define M 107000 #define inf 1<<29 using namespace std; struct node{ int x,y,z,p,next; }e

How to memset char array with null terminating character?

风格不统一 提交于 2019-11-30 01:08:41
问题 What is the correct and safest way to memset the whole character array with the null terminating character? I can list a few usages: ... char* buffer = new char [ARRAY_LENGTH]; //Option 1: memset( buffer, '\0', sizeof(buffer) ); //Option 2 before edit: memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH ); //Option 2 after edit: memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH ); //Option 3: memset( buffer, '\0', ARRAY_LENGTH ); ... Does any of these have significant advantage over other(s)?

bzoj 2208 //2208: [Jsoi2010]连通数

大憨熊 提交于 2019-11-29 23:44:36
bzoj 2208 //2208: [Jsoi2010]连通数 //在线测评地址 https://www.lydsy.com/JudgeOnline/problem.php?id=2208 更多题解,详见 https://blog.csdn.net/mrcrack/article/details/90228694 BZOJ刷题记录 //2208: [Jsoi2010]连通数 //在线测评地址https://www.lydsy.com/JudgeOnline/problem.php?id=2208 //第一个思路,Floyd算法,求最短路径,算法的时间复杂度O(n^3),看了数据范围 N不超过2000,只好作罢 //统计 连通数 时,采用O(n^2)算法即可 //问题是,如何确认2点连通,这个算法的时间复杂度,如何降下来。 //多点的连通问题。 //强连通分量及缩点tarjan算法解析https://blog.csdn.net/acmmmm/article/details/16361033可看此文,手绘图。 //初探tarjan算法(求强连通分量) https://www.luogu.org/blog/styx-ferryman/chu-tan-tarjan-suan-fa-qiu-qiang-lian-tong-fen-liang-post 此文值得一看 /

P1398 [NOI2013]书法家

折月煮酒 提交于 2019-11-29 23:18:38
传送门 就是个普及组 $dp$ 合集,把 $NOI$ 从左到右拆成 $9$ 个部分,每个部分都可以分别 $dp$ 除了 $N$ 的中间部分比较恶心以外其他都还好,自己推一下然后就知道转移,就 $N$ 的中间优化转移比较不好写 随便吧,反正 $9$ 个 $dp$ 都挺简单的, 量变导致质变 ,我在想那一年的选手是不是都被恶心到了...反正我是被恶心死了 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; 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<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } const int N=157,M=507; int n,m,sum[N][M],ans; int f[2][M][N][N],mx[M][N][N],mxx,mxxx[N][N]; inline

What is the correct way to clear sensitive data from memory in iOS?

六眼飞鱼酱① 提交于 2019-11-29 18:03:31
问题 I want to clear sensitive data from memory in my iOS app. In Windows I used to use SecureZeroMemory. Now, in iOS, I use plain old memset, but I'm a little worried the compiler might optimize it: https://buildsecurityin.us-cert.gov/bsi/articles/knowledge/coding/771-BSI.html code snippet: NSData *someSensitiveData; memset((void *)someSensitiveData.bytes, 0, someSensitiveData.length); 回答1: Paraphrasing 771-BSI (link see OP): A way to avoid having the memset call optimized out by the compiler is

The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

只谈情不闲聊 提交于 2019-11-29 18:03:25
The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门: https://nanti.jisuanke.com/t/41400 题意: 给你三个数组a,b,c,要你求有多少个三元组(i,j,k),使得 \[ \begin{array}{l}{\left|A_{i}-B_{j}\right| \leq C_{k}, \text { and }} \\ {\left|B_{j}-C_{k}\right| \leq A_{i}, \text { and }} \\ {\left|A_{i}-C_{k}\right| \leq B_{j}}\end{array} \] 题解: 上面的不等式经过化简,我们可以得到 我们需要求有多少个三元组,使得 \(A_i,B_j,C_k\) 可以组成一个三角形 这样组成三角形的题目类似于HDU4609 ( https://www.cnblogs.com/buerdepepeqi/p/11236100.html ) 但是不同的是 我们需要从三个数组中选择 所以这里就涉及到了选择重复的问题,我们考虑去重 假设拿a+b做一遍卷积,得到长度为a+b的木棍的数量, 我们假设 c是三角形的最长边,那么a,b,c三根木棍不能组成三角形的情况就是c的长度大于a+b的数量 我们枚举(a

Do I have to call memset after I allocated new memory using malloc

大憨熊 提交于 2019-11-29 17:47:33
问题 #include "stdlib.h" #include "stdio.h" #include "string.h" int main(int argc, char* argv[]) { int *test = malloc(15 * sizeof(int)); for(int i = 0;i < 15 ;i ++ ) printf("test is %i\n",test[i]); memset(test,0,sizeof(int) * 15); for(int i = 0 ; i < 15; i ++ ) printf("test after memset is %i\n",test[i]); return 0; } The output I get is very weird: test is 1142126264 test is 32526 ... test is 1701409394 test is 1869348978 test is 1694498930 test after memset is 0 test after memset is 0 test after

how to set pointer to a memory to NULL using memset?

淺唱寂寞╮ 提交于 2019-11-29 11:19:41
I have a structure typedef struct my_s { int x; ... } my_T; my_t * p_my_t; I want to set the address of p_my_t to NULL and so far this is how I've tried to do this: memset (&p_my_t, 0, sizeof(my_t*)) This doesn't not look right to me though. What is the correct way of doing this? Amendment to question - asking a radically more complex question : Here is what I am trying to do: Two processes, A and B malloc p_my_t in A, B has N threads and can access it Start deleting in A but I can not simply free it since threads in B may still using it. So I call a function, pass address of p_my_t to B to

Educational Codeforces Round 72 (Rated for Div. 2)

不想你离开。 提交于 2019-11-29 07:31:58
四题就可以当大爷了,一共才六道题。 A、你有一个角色,a点力量b点智力,你现在有c点经验值,1点经验值可以把力量或智力增加1 你现在需要用掉所有的经验值,问你有多少种使用经验值的方案,使得最后力量大于智力 首先如果力量一开始小于智力,先消耗经验值增加力量直到力量大于智力 然后考虑方程组: (a+x)>(b+y) (x+y)=c x和y分别是增加的力量和智力 稍微改动一下: (a+x)>=(b+y+1) 这样可以求的最小的x满足上述方程组 那么得到2x>=c+b-a+1 注意一下(c+b-a+1)不一定是偶数,所以实际上x=((c+b-a+1)+1)/2 即向上取整。 最后解出y=c-x,总方案数就是[0,y]这个区间中的数字个数,每一个y都可以满足条件 似乎做完了,但是有个坑点需要特判: 如果(b+c)<a,说明不管怎么加一定满足条件,此时应当输出c+1 代码: #include <bits/stdc++.h> #define int long long #define sc(a) scanf("%lld",&a) #define scc(a,b) scanf("%lld %lld",&a,&b) #define sccc(a,b,c) scanf("%lld %lld %lld",&a,&b,&c) #define schar(a) scanf("%c",&a) #define