getchar

Educational Codeforces Round 83 (Rated for Div. 2)

感情迁移 提交于 2020-03-10 19:42:52
A - Two Regular Polygons 问是否可以在一个正多边形内部内接一个正多边形,可以内接,分配给内部的多边形的每一条边的角度一样,对应的外部多边形的边数一样 #include <bits/stdc++.h> using namespace std ; typedef long long LL ; typedef unsigned long long ULL ; int Gcd(int a,int b) { if ( b == 0 ) return a ; return Gcd ( b , a%b ) ; } int Lcm(int a, int b) { return a/ Gcd ( a,b ) *b ; } inline long long read() { long long f = 1, x = 0 ; char ch = getchar ( ) ; while (ch > '9' || ch < '0') { if ( ch == '-' ) f = -f ; ch = getchar ( ) ; } while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0' ; ch = getchar ( ) ; } return x * f ; } const int maxn = 1e6 + 10 ; int

2020-2-15模拟赛题解

醉酒当歌 提交于 2020-03-06 18:24:19
前言 这场比赛我发挥欠佳,各种小失误不断,也需要我自己去反思吧,以后打模拟赛也要有选择性地去打,毕竟 一天 \(3\) 场比赛 肯定会有影响。 正文 1. 子数整数 错点 考试的时候蒟蒻把 No 打成了 NO 。 分析 这道题实际上就是个小模拟,您只要会 \(for\) 循环就可以轻松过掉此题。 答案是直接统计一下就好了。 我们可以直接从 10000 到 30000 循环,算出 s1 、 s2 、 s3 。 for(int i=10000;i<=30000;i++){ int g=i%10,s=i/10%10,b=i/100%10,q=i/1000%10,w=i/10000%10,s1=100*w+10*q+b,s2=100*q+10*b+s,s3=100*b+s*10+g;//s1,s2,s3的计算 if(s1%k==0&&s2%k==0&&s3%k==0)writen(i),f=1; } 总代码 #include <bits/stdc++.h> using namespace std; template<typename T>inline void read(T &FF){ T RR=1;FF=0;char CH=getchar(); for(;!isdigit(CH);CH=getchar())if(CH=='-')RR=-1; for(;isdigit(CH);CH

C语言之getchar()用法

非 Y 不嫁゛ 提交于 2020-03-06 13:42:24
(1)语法 int getchar(void); (2)返回值 getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键。 (3)作用 从标准输入流只读取一个字符(包括空格、回车、tab),读到回车符(’\n’)时退出,键盘输入的字符都存到缓冲区内,一旦键入回车,getchar就进入缓冲区读取字符,一次只返回第一个字符作为getchar函数的值,如果有循环或足够多的getchar语句,就会依次读出缓冲区内的所有字符直到’\n’.要理解这一点,之所以你输入的一系列字符被依次读出来,是因为循环的作用使得反复利用getchar在缓冲区里读取字符,而不是getchar可以读取多个字符,事实上getchar每次只能读取一个字符.如果需要取消’\n’的影响,可以用getchar()来清除,如:while((c=getchar())!=’\n’),这里getchar();只是取得了’\n’但是并没有赋给任何字符变量,所以不会有影响,相当于清除了这个字符。 例: 1 #include <stdio.h> 2   int main

Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem A - B

跟風遠走 提交于 2020-03-06 06:20:10
/*--> */ /*--> */ Array of integers is unimodal, if: it is strictly increasing in the beginning; after that it is constant; after that it is strictly decreasing. The first block (increasing) and the last block (decreasing) may be absent. It is allowed that both of this blocks are absent. For example, the following three arrays are unimodal: [5, 7, 11, 11, 2, 1], [4, 4, 2], [7], but the following three are not unimodal: [5, 5, 6, 6, 1], [1, 2, 1, 2], [4, 5, 5, 6]. Write a program that checks if an array is unimodal. Input The first line contains integer n ( 1 ≤  n  ≤ 100) — the number of

数位DP入门

浪子不回头ぞ 提交于 2020-03-05 06:58:54
考试考dp的时候时常会碰见有关数位dp的问题,每次考到就是一脸懵逼加吃惊,所以今天抽空看了一下有关数位dp的知识,网上有很多大神都说的很好,推荐看几篇blog。 入门经典 慢慢看,很不错 数位DP的套路 数位dp其实看了那么多篇blog感觉就是一个套路,一个记忆化搜索,方法无非是用两个端点的答案相减得到答案。dp主要考得是状态的设定和转移及其优化,对于数位dp来说,转移和优化其实是固定的,变的只是状态的设定,把状态设好了,套上板子处理下边界和正确性就好了,感觉还是要多做题,先贴两道题,之后慢慢更新,可以去vj上坐kuangbin带你飞系列的数位dp专题,题目很适合入门的人。 HDU2089 题面 统计区间 [a,b] 中不含 4 和 62 的数字有多少个。 分析 这其实是一道模板题看了上面两篇blog的做这题会很简单,部分注释写在代码里了。 /************************************************************************* > Author: Drinkwater > Created Time: 2017/8/24 21:55:11 ************************************************************************/ #include<iostream>

学点 C 语言(32): 函数 - 返回值

允我心安 提交于 2020-03-05 00:07:18
C 语言的函数可以返回数组以外(不包括数组指针)的任何类型. 不写明返回类型, 在以前的 C 语言版本中是默认返回 int, 现在 C99、C++ 已不支持. void 表示没有返回值, 也就无须 return 语句; 如果是其他语句必须有 return 语句. 在 main 函数中(只是 main 函数)若忘掉 return, 有些编译器会自动添加 return 0; 1. 每执行 return 语句函数将会退出: #include <stdio.h> int main(void) { printf("111\n"); printf("222\n"); return 0; /* 之后的语句将不会执行 */ printf("333\n"); printf("444\n"); getchar(); return 0; } 2. 如果函数没有返回值, 可以借无参数的 return 跳出: #include <stdio.h> void prn(void); int main(void) { prn(); getchar(); return 0; } void prn(void) { printf("111\n"); printf("222\n"); return; /* 无参数的 return */ printf("333\n"); printf("444\n"); } 3.

关于最大匹配,最小点覆盖,最少路径覆盖和最大独立集的总结

蹲街弑〆低调 提交于 2020-03-04 07:40:29
(1)二分图的最大匹配 匈牙利算法 (2)二分图的最小点覆盖 二分图的最小点覆盖=二分图的最大匹配 求最小点覆盖:从右边所有没有匹配过的点出发,按照增广路的“交替出现”的要求DFS。最终右边没有访问过的点和左边访问过的点组成最小点覆盖。 证明见 这里 (3)二分图的最少边覆盖 二分图的最少边覆盖=点数-二分图的最大匹配 证明: 先贪心选一组最大匹配的边放进集合,对于剩下的没有匹配的点,随便选一条与之关联的边放进集合,那么得到的集合就是最小边覆盖。 所以有:最小边覆盖=最大匹配+点数-2*最大匹配=点数-最大匹配 (4)二分图的最大独立集 二分图的最大独立集=点数-二分图的最大匹配 证明: 我们可以这样想,先把所有的点放进集合,然后删去最少的点和与之相关联的边,使得全部边都被删完,这就是最小点覆盖。所以有:最大独立集=点数-最小点覆盖 (5)有向无环图的最少不相交路径覆盖 我们把原图中的点$V$拆成两个点$Vx$和$Vy$,对于原图中的边$A->B$,我们在新图中连$Ax->By$。那么最少不相交路径覆盖=原图的点数-新图的最大匹配 证明: 一开始每个点都独立为一条路径,在二分图中连边就是将路径合并,每连一条边路径数就减一。因为路径不能相交,所以不能有公共点,这恰好就是匹配的定义。所以有:最少不相交路径覆盖=原图的点数-新图的最大匹配 友情题: bzoj1143[CTSC2008

读入读出挂

自作多情 提交于 2020-02-28 23:25:08
IO读入挂 namespace IO { const int MX = 4e7; //1e7占用内存11000kb char buf[MX]; int c, sz; void begin() { c = 0; sz = fread(buf, 1, MX, stdin); } inline bool read(int &t) { while(c < sz && buf[c] != '-' && (buf[c] < '0' || buf[c] > '9')) c++; if(c >= sz) return false; bool flag = 0; if(buf[c] == '-') flag = 1, c++; for(t = 0; c < sz && '0' <= buf[c] && buf[c] <= '9'; c++) t = t * 10 + buf[c] - '0'; if(flag) t = -t; return true; } } 超快读入挂 const int BufferSize=1<<16; char buffer[BufferSize],*head,*tail; inline char Getchar() { if(head==tail) { int l=fread(buffer,1,BufferSize,stdin); tail=(head=buffer)+l

Codeforces Round #541 (Div. 2)题解

喜你入骨 提交于 2020-02-28 15:41:59
不知道该更些什么 随便写点东西吧 https://codeforces.com/contest/1131 ABC 太热了不写了 D 把相等的用并查集缩在一起 如果$ x<y$则从$ x$往$y$连边 如果并查集内有边或边构成环则无解 否则做一遍拓扑输出答案 #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define rt register int #define ll long long using namespace std; inline ll read(){ ll x = 0; char zf = 1; char ch = getchar(); while (ch != '-' && !isdigit(ch)) ch = getchar(); if (ch == '-') zf = -1, ch = getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return x * zf; } void write(ll y){if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);} void

题解 P1503 【鬼子进村】

天涯浪子 提交于 2020-02-28 09:12:02
提供两种做法,fhq_treap和set 思路: 首先在平衡树中加入0节点和n+1节点,是左右边界 'D x':在平衡树中加入x节点(为什么是加入而不是删除,我后面会详细讲到) 'R':既然是上一个点恢复了,而样例的最后一个询问为我们贴心地考虑了连续恢复的情况,那么就是要维护一个后进先出的 栈 来保存您删除的点啦~ 'Q x'查询x点的前驱pre上一个被删除的点),和x的后继suc下一个被删除的点,那么x能到达的点的个数就是suc-pre-1个(题目给的是一条编号连续的链,那么根据编号来查找个数就很方便啦^ _ ^) fhq_treap #include<bits/stdc++.h> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;++i) #define dwn(i,a,b) for(int i=a;i>=b;--i) template <typename T> inline void rd(T &x){x=0;char c=getchar();int f=0;while(!isdigit(c)){f|=c=='-';c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}x=f?-x:x;} const int N=5e4+10;