getchar

学点 C 语言(34): 函数 - 关于变量(auto、static、register、extern、volatile、restrict)

妖精的绣舞 提交于 2020-02-28 06:16:43
1. 局部变量: 局部变量也叫自动变量, 它声明在函数开始, 生存于栈, 它的生命随着函数返回而结束. #include <stdio.h> int main(void) { auto int i = 9; /* 声明局部变量的关键字是 auto; 因可以省略, 几乎没人使用 */ printf("%d\n", i); getchar(); return 0; } 2. 全局变量: 全局变量声明在函数体外, 一般应在函数前; 每个函数都可以使用它, 不过全局变量应尽量少用. #include <stdio.h> void add(void); void mul(void); int gi = 3; /* 全局变量 */ int main(void) { printf("%d\n", gi); /* 3 */ add(); printf("%d\n", gi); /* 5 */ mul(); printf("%d\n", gi); /* 10 */ getchar(); return 0; } void add(void) { gi += 2; } void mul(void) { gi *= 2; } 全局变量会被初始化为空, 而局部变量在没有赋值前是一个垃圾值: #include <stdio.h> int gi; /* 全局变量 */ int main(void) { int

第8章 字符输入/输出和输入验证

我只是一个虾纸丫 提交于 2020-02-27 15:59:54
8.1  单字符i/o:getchar()和putchar() 8.2  缓冲区 无缓冲输入:用户输入字符后,立即打印 缓冲输入:用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter后,程序才可以使用用户输入的字符。 缓冲分为:完全缓冲I/O和行缓冲I/O。 完全缓冲I/O:缓冲区被填满时才刷新缓冲区。 行缓冲I/O:出现换行符时刷新缓冲区。 8.3  结束键盘输入 8.3.1  文件、流、键盘输入 文件:存储器中储存信息的区域。 流:实际输入/输出映射的一个理想化数据流。 8.3.2  文件结尾 1:以ctrl+z字符来标记文件结尾。 2:储存文件大小的信息。 c语言中getchar()读取到文件检测到文件结尾时将返回一个特殊的值即EOF(end of file)scanf()函数检测到结尾也返回EOF。 通常EOF定义在stdio.h文件中: #define EOF (-1) 使用键盘输入EOF:要使用Ctrl+Z或Ctrl+D 8.4  重定向和文件 8.4.1  unix、linux、dos重定向 1.重定向输入 例:echo_eof<word echo_eof是一个可执行文件,word是一个文本文件。该目的是用文件替换键盘输入。 2.重定向输入 例:echo_eof>word 该目的是键盘读取的数据输出到word文件中。 3.组合重定向 echo

ACM卡常数(各种玄学优化)

旧街凉风 提交于 2020-02-26 21:33:09
首先声明,本博文部分内容仅仅适用于ACM竞赛,并不适用于NOIP与OI竞赛,违规使用可能会遭竞赛处理,请慎重使用!遭遇任何情况都与本人无关哈=7= 我也不想搞得那么严肃的,但真的有些函数在NOIP与OI竞赛中有相关规定不能使用,详细我也不知道各位要了解请自行去找比赛要求咯,当然在ACM竞赛中,没有限制函数,所以所有内容都适用于ACM竞赛。 那么什么是卡常数呢,简单来说就是你和某神犇算法思路一样,结果他的AC了,你的TLE,复杂来说就是程序被卡常数,一般指程序虽然渐进复杂度可以接受,但是由于实现/算法本身的时间常数因子较大,使得无法在OI/ACM等算法竞赛规定的时限内运行结束。 下面就是介绍各种各样的非(花)常(里)实(胡)用(哨)的优化方法的,若本文某些地方有错误或不明确的地方还请指出。=7= 优化I/O 网上有很多说关于cin和scanf的介绍,以及关闭流输入等等优化方法,但这些都还是有可能成为卡常数的地方,那么这个时候,我们就可以自己写输出输出函数了。 下面一个简单的对读入数字的优化: 1 inline void read(int &sum) { 2 char ch = getchar(); 3 int tf = 0; 4 sum = 0; 5 while((ch < '0' || ch > '9') && (ch != '-')) ch = getchar(); 6 tf =

NOI 模拟赛

若如初见. 提交于 2020-02-26 20:53:07
三道大原题,我就直接写了 T1 scoi2016 背单词 建一个 Trie 树,递推出每个点子树里单词节点的数量,把单词节点拿出来建个树形结构,所有单词节点向他上面最近的单词节点连边,每次贪心往比较小的那边走就可以了 不建树是错的,因为会把不同的单词节点算成一个 例如: 比如左边四个单词节点就被算到了一起,应该先从左边一个一个走,镘走了右边(#上香 #include<bits/stdc++.h> #define LL long long #define rep(i, s, t) for(register int i = (s), i##end = (t); i <= i##end; ++i) #define dwn(i, s, t) for(register int i = (s), i##end = (t); i >= i##end; --i) using namespace std; inline int read() { int x = 0, f = 1; char ch = getchar(); for(;!isdigit(ch);ch=getchar())if(ch == '-') f=-f; for(;isdigit(ch);ch=getchar())x = 10 * x + ch - '0'; return x * f; } const int maxn =

LOJ #2537. 「PKUWC 2018」Minimax (线段树合并 优化dp)

那年仲夏 提交于 2020-02-25 05:38:34
题意 小 \(C\) 有一棵 \(n\) 个结点的有根树,根是 \(1\) 号结点,且每个结点最多有两个子结点。 定义结点 \(x\) 的权值为: 1.若 \(x\) 没有子结点,那么它的权值会在输入里给出, 保证这类点中每个结点的权值互不相同 。 2.若 \(x\) 有子结点,那么它的权值有 \(p_x\) 的概率是它的子结点的权值的最大值,有 \(1-p_x\) 的概率是它的子结点的权值的最小值。 现在小 \(C\) 想知道,假设 \(1\) 号结点的权值有 \(m\) 种可能性, 权值第 \(i\) 小 的可能性的权值是 \(V_i\) ,它的概率为 \(D_i(D_i>0)\) ,求: \[\displaystyle \sum _{i=1} ^ {m} i \cdot V_i \cdot D_i^2\] 你需要输出答案对 \(998244353\) 取模的值。 对于 \(40\%\) 的数据,有 \(1\leq n\leq 5000\) ; 对于 \(100\%\) 的数据,有 \(1\leq n\leq 3\times 10^5, 1\leq w_i\leq 10^9\) 。 题解 首先考虑 \(O(n^2)\) 的 dp , 令 \(dp_{u,i}\) 为 \(u\) 号点 , 取到排名为 \(i\) 权值的概率 . 这个应该比较容易转移 , 考虑枚举一个儿子取的值

逼近法(例 poj3208、poj1037)

冷暖自知 提交于 2020-02-24 20:13:19
​ 逼近法是一种很奇妙的算法,以为“逼近”这一种思想在很多的算法中都有体现。诸如:像我们的二分答案,不断地排除决策集合的一半以接近我们的最终答案;我们的树上倍增求 $ LCA $ 算法,一次次的减小我们跳的距离以确定祖先的准确位置;我们的模拟退火需要用一个温度,每次操作后这个温度一定会下降,逼近正确答案;再如我们大多数函数的收敛性,在多次计算后会趋向某一定值;还有我们DP的拼凑与试填的思想也有逼近的味道。 我们逼近的前提就在于我们是否可以在每一次操作后排除一些决策集合,并且是高效的排除。就像:银河系 -> 太阳系 -> 太阳系 -> 地球 -> 中国 -> 湖南 -> 长沙。还有我做出来的第一道逼近题:存在很多长度为 $ n $ 的有26个字母组成的字符串,我们将他们按字典序排序,现在给出序号或字符串,要求输出它对应的序号或字符串。这是一道傻逼题,我们可以试填第一个字母,然后它后面剩余的位置有很多种填法,我们看这么多填法是否大于我们的序号,然后我们从小到大填,这样可以确定第一个字母,紧接着可以推出第二个第三个.....然后就是答案。 虽然写的都是些浅显的东西,但如果这个思想和其他东西串联起来就不见得简单了。好了说白了就是来写题解的,不管这么多了。。。。。。。。。。。。。。。。。。。。 Poj 1037 A decorative fence 大致题意:我们要构建长度为 $ N $

codeforces724G Xor-matic Number of the Graph

此生再无相见时 提交于 2020-02-23 08:57:00
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ 转载请注明出处,侵权必究,保留最终解释权! 题目链接: codeforces724G 正解:线性基 解题报告:   一道线性基好题…   是不是感觉和$WC2011$的那道题有相通之处呢?首先搞出一棵$dfs$树,并且得到树上每个环的$xor$值。   我们发现,两点间就是本来的$dis$ $xor$ 某些环的$xor$值,即可组合得到一些新的异或值。位运算的题目,我们显然按位来做。   首先,对于两个这一位同时为$1$或者同时为$0$的,我们考虑若要有贡献,必须是从环上得到一个这一位为$1$的$xor$值,如果线性基这一位都是$0$则无贡献,否则我们可以考虑,假设线性基中有$r$个向量,那么我们把这一位为$1$的一个向量排除在外,剩下的随便选,任意组合,也就是$2^{r-1}$,得到一个权值,再根据得到的权值这一位是$1$还是$0$,来决定被排除在外的这个向量选不选,所以贡献就是$2^{r-1}$。   同理,如果一个是$1$一个是$0$,那么我同样是分类讨论,向量中有无这一位是$1$的,分别算贡献即可。 //It is made by ljh2000 #include

What does scanf REMOVES from input after scanning?

匆匆过客 提交于 2020-02-23 07:09:32
问题 I have gone through many questions and blogs and books, but I guess I'm just not able to relate things properly. What does scanf do after scanning? It reads everything except space, tab and newline, but what does it do to newline?? I'm unable to remove newline any way after scanning input. For example, consider this as input:- 5 Abcdefgh Now, I have scanned 5 as integer, scanf("%d", &i); but how do I remove '\n' in order to read everything ahead one character at a time? I want to use:- while(

FHQ treap板子

。_饼干妹妹 提交于 2020-02-22 12:43:27
感觉这个玩意就是拆来拆去,所以没啥可学习的 粘一下两个题的代码吧 LGOJ 普通平衡树 #include <bits/stdc++.h> using namespace std; #define int long long namespace yspm { inline int read() { int res = 0, f = 1; char k; while (!isdigit(k = getchar())) if (k == '-') f = -1; while (isdigit(k)) res = res * 10 + k - '0', k = getchar(); return res * f; } const int N = 1e6 + 10, inf = 1e15 + 10; int base = 12344, tot, rt; int val[N], ls[N], rs[N], sz[N], rk[N]; inline int random() { return (base *= 102394) %= 239402, base; } inline int add(int valn) { sz[++tot] = 1; ls[tot] = rs[tot] = 0; val[tot] = valn; rk[tot] = random(); return tot; }

LOJ #2718. 「NOI2018」归程(Dijkstra + Kruskal重构树 + 倍增)

别等时光非礼了梦想. 提交于 2020-02-21 14:32:51
题意 给你一个无向图,其中每条边有两个值 \(l, a\) 代表一条边的长度和海拔。 其中有 \(q\) 次询问(强制在线),每次询问给你两个参数 \(v, p\) ,表示在 \(v\) 出发,能开车经过海拔 \(> p\) 的边,其中 \(\le p\) 的边只能步行,步行后不能继续开车了。 询问它到 \(1\) 号点最少要步行多远。 多组数据。 \(n \le 200000~~ m,q \le 400000\) 。 题解 一个直观的想法,对于每次询问,我们保留 \(>p\) 的边,然后求出联通块。 求出它所在联通块到 \(1\) 距离最小的那个点,就是这次询问的答案。 到 \(1\) 距离的就是把 \(1\) 当做起点跑一遍单源最短路就行了,注意要用 \(Dijkstra\) , \(Spfa\) 可以被卡掉。 复杂度就是 \(O((n + m) \log n)\) 的。 这下我们只需要询问每个点所在联通块的最小值就行了。 不难想到,把边按海拔从大到小加入,然后用并查集维护联通块最小值。 这样的话就可以离线实现这个过程了。 由于强制在线,我们可以用 可持久化并查集 实现这个过程。但这样其实不好写,常数其实还有一点大。 我就介绍原题正解的做法,也就是 Kruskal重构树 。 \(Kruskal\) 重构树: 参考这个讲解。 考虑求 \(Kruskal\) 最小生成树的过程