摘要:
原题传送:http://poj.org/problem?id=2513 字典树 + 并查集 + 欧拉路。 字典树:相当于hash的功能 并查集:判断连通 欧拉路:求答案 要存在欧拉路就要满足: 1.该图必须是一个连通图 2.该图每个点的度数要么全为偶数,要么有且仅有两个点的度数为奇数View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <queue> 4 #define N 500005 5 using namespace std; 6 7 int k, f[N],g[N]; 8 ch 阅读全文
摘要:
原题链接:http://poj.org/problem?id=2352 线段树,单点更新,区间查询,200+ms。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1 | 1) 5 #define N 32005 6 7 int tree[N << 2], ans[15001]; 8 9 void pushup(int cur)10 {11 tree[cur] = tree[lson 阅读全文
摘要:
原题链接:http://poj.org/problem?id=2182 线段树。 从后往前寻找,首先是找第a[n]大的数,找到后记录到答案数组里并删除改叶子节点,然后在剩下的数字中再找a[n - 1]大的数,直到n次寻找完成。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1 | 1) 5 #define INF 0x3f3f3f3f 6 #define N 8005 7 8 int a[N] 阅读全文
摘要:
原题传送:http://poj.org/problem?id=1328 贪心。 每个岛屿在海岸线上都有一个雷达覆盖区间[x - sqrt(r2 - y2), x + sqrt(r2 - y2)],将这些区间按左区间从小到大排序,选择第一个区间,然后在后面找能够重叠的区间,如果能够重叠,那么更新该区间的右端点(取小的),遍历一遍就完事儿了。 (ps:有时候调了精度反而会wa)View Code 1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algori 阅读全文
摘要:
原题链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=10934&courseid=0 double,二分。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <stdlib.h> 5 #define INF 1000000000.0 6 const double eps = 1e-8; 7 double a[11]; 8 int n 阅读全文
摘要:
原题传送:http://acm.hnu.cn/online/?action=problem&type=show&id=11720&courseid=0 对于这条式子: 和下面的式子是等价的: Sp = (p2 - 1) / 2 - (p - 1) / 4 那么求出Sp后有rp*Sp ≡ 1 (mod p),用扩展GCD求出rp就行了。View Code 1 #include <stdio.h> 2 #include <string.h> 3 4 typedef __int64 LL; 5 LL p, s; 6 7 LL exgcd(LL a, L 阅读全文
摘要:
原题传送:http://acm.hnu.cn/online/?action=problem&type=show&id=11722&courseid=0 给出z,求符合方程x2 + y2 = z2的个数并输出。 这个问题在二潘的《初等数论》中有很详细的阐述。简单来说就是: 如果 z = i2 + j2 那么 x = i2 - j2 y = 2 * i * jView Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #include < 阅读全文
摘要:
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4027 线段树。 一个很大的数(< 263),最多也就进行几次开平方操作就会达到1了,所以每次更新,如果区间有的点不为1,那么就直接更新它,如果,区间的值都是1了,那么必须直接返回。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <stdlib.h> 5 #define lson (cur << 1) 6 #defi 阅读全文
摘要:
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3397 线段树,区间合并。 节点记录的信息如下: int l, r, c; // 区间左端点,右端点,长度 int lsum1, rsum1, msum1; // 左连续1长度,右连续1长度,区间最长连续1长度 int lsum0, rsum0, msum0; // 左连续0长度,右连续0长度,区间最长连续0长度 int sum; // 区间1的个数 题目许多更新询问操作都是比较熟悉的了。 这道题对于01反转操作我是这样做的:从上面列出来的节点信息... 阅读全文
摘要:
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3308 线段树,区间合并。 节点记录下面变量: int l, r, c; // 区间左端点、右端点和区间长度 int lv, rv; // 区间左值,右值 int lsum, rsum, msum; // 区间左上升长度,右上升长度,区间最大上升长度View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson (cur << 1) 4 #define rson (cur << 1 阅读全文
摘要:
原题传送:http://poj.org/problem?id=3667 线段树。 线段树题目做得还是太少了。这道题对新手来说是一道坎,虽然很容易得出思路,但是一细想会觉得挺恶心的,本想参考别人的AC代码,但一看就思密达了。只能静下心来,花几个小时甚至几天来做,还是会有很大收获的。 这里有一份不错的结题报告:http://bbs.byr.cn/wForum/disparticle.php?boardName=ACM_ICPC&ID=18374&listType=1 题目大意是有一个旅馆,其中有N个房间,初始化都为空,接下来有M个操作: 操作1,形式为1 d,表示需要在旅馆中找.. 阅读全文
摘要:
原题链接:http://poj.org/problem?id=2777 水线段树,打上lazy标志,节点保存区间颜色值,如果区间颜色有多种,那么保存值为 -1。 记录颜色数的时候一定要用位运算,再不济也用个数组哈希一下。(而我一开始用STL的set,神啊,TLE了一下午啊!还以为是写线段树出的问题,没想到STL这时候慢的一逼啊!恰巧POJ的C++编译器挂了!用G++交就更慢了!慢了慢了就TLE了!)View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define lson cur << 1, l, 阅读全文
摘要:
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=1394 求逆序数。 题目上来一看,发现直接暴力可过,复杂度O(n2),300+ms,代码简短得要命:View Code 1 #include <stdio.h> 2 3 int a[5005]; 4 5 inline int min(int x, int y) 6 { 7 return x < y ? x : y; 8 } 9 10 int main()11 {12 int i, j, n, ans, m;13 while(scanf("%d", &n) 阅读全文
摘要:
原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4414 暴力? 依次扫描图形,碰到"#"的时候判断是否符合“十”条件,是的话count++,并且把该“十”图形的"#"变为"o";如果不符合,也把和最开始搜到的"#"相连的"#"全部换成"o"。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 阅读全文
摘要:
原题传送:http://poj.org/problem?id=2891 求线性同余方程组。 我对线性同余方程组的求解思路是这样的: 假设有同余方程组: x ≡ r1 (mod a1) (1) x ≡ r2 (mod a2) (2) 此方程组可转化为: x≡ a1 * t + r1 (3) x≡ a2 * u + r2 (4) 由(3)、(4)式容易得到 a1 * t + r1 = a2 * u + r2,运用扩展欧几里得求解二元一次方程可得一个解 t = x0,设d = gcd(a1, a2),m0 = a2 / d,那么 t 的剩余系为:x0 + ... 阅读全文