- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 读入挂
static inline int Rint() { struct X{ int dig[256]; X() { rep(i,'0','9'){ dig[i]=1;dig['-']=1; } } }; static X fuck; int s
2017-03-29 09:14:05
578
原创 中国(北方)大学生程序设计训练赛(第一周)
Problem D: 数学题题目链接:DDDDDD 取个倒数就可以变成乘法了… 二分答案 然后chick的时候 双指针 卡精度…要用 long double#include <bits/stdc++.h>#define rep(i,a,n) for (int i=a;i<=n;i++)#define per(i,a,n) for (int i=n;i>=a;i--)#define pb p
2017-03-06 13:13:41
586
原创 求组合数
const int maxn=2e5+10;ll fac[maxn],inv[maxn];void init(){ fac[0]=1; for(int i = 1; i <= maxn-10; ++i) fac[i]=fac[i-1]*i%mod; inv[maxn-10]=powmod(fac[maxn-10],mod-2); for(int i = maxn
2017-03-03 09:48:35
489
原创 O(N)求1~N逆元
ll inv[N];void init(){ inv[1] = inv[0] = 1; for(int i = 2;i < N;i++) inv[i] = inv[mod%i]*(mod-mod/i)%mod;}
2017-03-01 15:46:14
391
原创 组合数取模(待补充)
const ll M=1e5+3;ll fac[100005]; //阶乘ll inv_of_fac[100005]; //阶乘的逆元ll qpow(ll x,ll n){ ll ret=1; for(; n; n>>=1) { if(n&1) ret=ret*x%mod; x=x*x%mod;
2016-12-18 12:35:46
358
原创 UVa11525 康托展开+二分+树状数组
n其实就是排列的康托展开形式s[i]就是未出现的数中 第s[i]+1小的数树状数组存小于x的数的个数#include<bits/stdc++.h>using namespace std;int c[50010],k;inline int lowbit(int x){ return x&(-x);}int sum(int x){ int ans=0; whil
2016-11-20 22:32:35
542
原创 UVA1492 LA5694 线段树扫描线(矩形面积合并)
我们考虑 每个新机器往右放的起始点(1*1的块)那么我们只要求出哪些位置不可以放就可以了,比如说 3*3 的矩阵 新机器长为2 旧机器在2 2 那么 1 1这个点就不可以放新机器(考虑机器往右放的起始点)再考虑右边界,右边界左边m-1个位置也不可以放再考虑往下放的起始点,同理了综上我们只要分别求出 哪些点不可以放 再用所有点减去就可以了其实这就转化成了求矩形面积合并的问题了注意特判m=
2016-11-20 22:26:10
575
原创 LA4730 UVA1455 线段树+并查集
以y轴建线段树 把坐标*2 初始化各节点 洲,城市 数目为0 并查集维护每一个连通块的 y坐标最大值最小值(x坐标没用)城市数目 合并时 如果是一个洲(城市数大于1) 线段树对应区间减掉该洲城市数 然后将两个洲合并,再在线段树对应区间增加大洲的城市数 (区间城市数不等于子区间城市数之和)#include <bits/stdc++.h>using namespace std;const in
2016-11-20 22:14:02
352
原创 LA4108&UVA1232 线段树
大体思路 维护区间最大值最小值,当新建的建筑物高度大于等于区间最大值时更新同时更新答案,小于最小值忽略. (x+1是因为 区间1~5可以看成 2,3,4,5 四个点 只写x 更新会出错 是因为 更新1~10更新一遍10 更新10~15又会更新一遍10事实上只要更新一遍)#include<bits/stdc++.h>using namespace std;const int maxn=1e5+
2016-11-20 21:56:47
393
原创 POJ 3321 树状数组,树转化为线性结构
题目链接 测试数据中边是 从上往下给的,也就是从根往叶子给的大体思路 将树形结构变为线性结构 后序遍历整棵树,记录下遍历这个点的时间和结束遍历的时间,那么[a,b]就可以代表这棵子树。 我们用一个节点的结束时间来标识树状数组中的c[]。即sum(i)表示 所有 遍历结束的时间小于i的节点的权值和#include <iostream>#include<cstdio>#include<cst
2016-11-16 22:14:32
412
原创 CF722C倒序并查集
题目大意 给你n个正数以及一个排列 让你按照排列中的顺序依次摧毁这n个数 每摧毁一次求一下连通块的最大和 思路 倒着并查集:先将所有点摧毁,再倒序连接,维护最大和。#include <bits/stdc++.h>using namespace std;typedef long long ll;const int Max=1e5+10;ll a[Max],ans[Max]
2016-10-31 16:18:38
980
原创 CF 721D贪心
——————题目链接——————题目大意 n个数 k次操作 每次可以将n个数中任意一个数加或减x 使得k次操作后这n个数乘积最小 求每个数 思路 贪心,每次取出绝对值最小的数,如果当前负数个数为奇数个,那就将这个数背离0前进,如果负数个数为偶数个,那就将这个数朝0前进#include <bits/stdc++.h>using namespace std;typedef lo
2016-10-30 21:58:22
386
原创 CF723E 欧拉回路
题目大意 将无向图转为有向图,并且出度等于入度的点的数目最大。无重复边有孤立点 题解 将度数为奇数的点连接 跑欧拉回路 将 原来的边输出#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#include <vector>using namespace std;const int maxn=2
2016-10-27 15:44:11
498
原创 LA6910Cutting Tree 逆向并查集
先拆边,再倒着加边保存答案 注意记录某条边拆了几次就可以了#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;int f[20010],a[20010];int ans[5010];struc
2016-10-20 21:28:27
278
原创 UVA11732 左儿子右兄弟 Trie
tot[i]记录每个以i为根的树的叶子节点的数目注意插入的时候要插入‘\0’ 为了分辨 前缀和相同的串对于叶子节点 ans+=tot[u]*(tot[u]-1)/2*2*depth;即相同的串两两一对的对数 *(2*深度)对于非叶子节点 统计以其为根节点的串 两两一对的对数 for(int v=head[u];v;v=next[v]){
2016-10-05 20:30:09
629
原创 UVA11488 Trie
组织一棵Trie记录每个节点有多少串经过统计最大值#include #include#include#includeusing namespace std;const int maxn=50010*2+10;typedef long long ll;struct Trie{ int ch[maxn][2]; int tot[maxn]; int
2016-10-05 20:26:56
368
原创 UVA1401&LA3942 Trie+DP
题目大意将给定长度为L的字符串S 用字典中单词分解 单词可重复使用 问有多少分解方案数大体思路dp[i]表示从i开始的字符串(后缀)的分解方案数 dp[i]=∑dp[i+len(x)] x为字符串S[i...L]的前缀 将单词组成Trie 然后在Trie中查找前缀 找到后递推dp[i]即可#include #include#include#include#includ
2016-10-05 10:14:15
315
原创 UVA12232加权并查集 加点
#include #include #include #include #include #include #include #include #include #define INF 0x3f3f3f3f #define MAXN 20010 #define MAXM 3010 using namespace std; int N,Q,bug,
2016-10-05 00:29:12
357
原创 UVA11987 并查集
第一、三个操作 直接带权并查集就可以解决关键是第二个第二个问题在于合并两个节点的时候 第一个节点的子节点会跟着合并到第二个节点中 这提示我们 只要1~n都不作为父节点就可以了所以初始化的时候将 每个节点的父亲节点设为 n+i 这样无论怎样合并节点1~n都不可能成为父节点 那么进行第二个操作的时候只要 将p节点合并到q节点父节点下就可以了具体看代码 第一个操作和第二个操作合并
2016-10-05 00:27:45
322
原创 LA2191&UVA12086树状数组
裸树状数组……不能再裸了……更改值得时候 别忘了该原数组就可以了#include #include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int maxn=200010
2016-10-05 00:12:40
294
原创 LA5902&UVA1513 树状数组
题目大意:将n个物品从上到下编号,放置 每次询问第i个物品上面有几个物品 并且将第i个物品放到最上面。大体思路树状数组的应用将物品重新编号 n~1 c[i]为树状数组的辅助数组,所求前缀和是当前点到底端的距离 每次将取出的物品重新编号 pos[a]=++tot;
2016-10-05 00:06:33
416
原创 UVA11992 线段树
因为行数最多20行,所以可以每行建造一颗线段树update时 set操作要清除add标记但add操作不需要清楚set标记maintain函数(用于维护节点)先考虑set再考虑addquery操作要综合考虑add和set{CSDN:CODE:1909506}
2016-10-01 08:40:44
511
2
原创 UVA1400&LA3938 线段树
构造线段树每个节点维护三个值 max_pre 满足当前线段最大前缀和的右端点编号 max_suf 满足当前线段最大后缀和的左端点编号 max_sub 用pair维护满足当前线段最大连续和的两个端点编号 维护max_sub 有三种情况 左右端点都在 左子节点 max_sub等于左子节点的max_sub 左右端点都在 右子节点 max_sub等于右子节点的max_sub 左端点在 左子
2016-09-30 10:30:41
348
原创 UVa 11235 RMQ
题目说非降序排列 所以把相同的数合并成段 v[i]和cnt[i]表示第i段的数值和出现的次数 num[i]表示第i个数所在的段的编号 left[i]表示第i个数所在段的左端点 right[i]表示第i个数所在段的右端点 查询[st,ed]答案分为三部分 点st到right[st]的距离和ed到left[ed]的距离还有num[st]+1~num[ed]-1之间的cnt最大值(用RMQ求
2016-09-29 17:00:13
344
原创 UVa1632 dp 滚动数组 紫书习题9-8
dp[i][j][0]表示 走完区间[i,j]并且最后在i点的最小时间 dp[i][j][1]表示 走完区间[i,j]并且最后在j点的最小时间 dp(i,j,0)=min(dp(i+1,j,0)+t(i+1)-t(i),dp(i+1,j1,)+t(j)-t(i)) dp(i,j,1)=min(dp(i,j-1,0)+t(j)-t(i),dp(i,j-1,1)+t(j)-t(j-1))。 递推
2016-09-20 11:24:57
565
原创 O(nlog(n)) LCS 白书 P66例题27 UVa10635
ab两个字符串,将a字符串重新编号为 则b字符串可根据a字符串编号 例如: a={1,7,5,4,8,3,9} b={1,4,3,5,6,2,8,9} a编号为{1,2,3,4,5,6,7} b重新编号为{1,4,6,3,0,0,5,7} (第二个编号为4是因为原来b中的4在a中位置为4) 0表示在a中没有出现过 然后用nlogn复杂度的LIS解决#include <iostre
2016-09-19 18:57:02
590
原创 UVA 10723 LCS变形 dp 紫书习题9-6
<php> echo “hello world";</php>算出ab串的LCS长度 再用ab长度之和减去LCS长度 相当于ab合并减去共有的元素 注意 数量要用 long long 数据中有空字符串 if( a[i]==a[j])dp[i][j]=dp[i-1][j-1]+1 ; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]) #
2016-09-18 22:14:09
313
原创 UVA242 背包问题&紫书dp习题9-5
紫书描述的题意跟原题有出入……醉了///这代码写的哭瞎了#include <iostream>#include <cstdio>#include<cstring>#include<cstdlib>#include<algorithm>using namespace std;#define N 200005int s,n;int a[15][105],num[15],sum[15],
2016-09-18 22:02:02
383
原创 51nod1065 最小正子段和
51nod1065 最小正子段和#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<string>#include<set>using namespace std;typedef long long ll;ll a[50010];struct
2016-09-14 15:12:17
454
原创 51nod1100斜率最大
51nod1100斜率最大按照x坐标从小到大排序 斜率最大的肯定是相邻的两个坐标#include<iostream>#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstring>#include<string>#include<set>using namespace std;typedef long lon
2016-09-13 22:55:50
429
原创 UVA 10118 Free Candies 记忆化搜索 dp紫书9-2
UVA 10118 紫书P304习题9-2#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>using namespace std;const int maxn=50;int a[4][maxn],n;int d[maxn][ma
2016-09-13 22:39:10
388
原创 拓展欧几里得/乘法逆元
d=gcd(a,b)=ax+by 先看代码void extend_gcd(int a,int b,int& d,int& x,int& y){ if(!b) { d=a; x=1; y=0; } else { extend_gcd(b,a%b,d,y,x); y-=x*(a/b)
2016-04-20 20:30:33
463
原创 HDU4790 Just Random
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4790 训练的时候被这题坑惨了啊,看题解也看了半天才懂,所以准备详细的写一个题解,以便以后复习。 题目意思是:从区间[a,b]选取一个数字x,区间[c,d]选取一个数字y,使得(x+y)%p=m。问你几率有多大。最简分式输出(除gcd就可以)。 总的事件总数就是(b-a+1)*(d-c+1)。 关
2016-03-21 17:34:53
472
原创 LIS O(nlogn)
题目:51nod 1134 http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 2 <= N <= 50000 N^2肯定要超时的。 动态规划思想,dp[i]表示长度为i的LIS的最小结尾。 如一组数:5 1 6 8 2 4 5 10 初始dp[1]=5,因为1<5, 更新dp[1]=1。6>1,更新dp[2
2016-03-11 12:17:40
757
原创 contor expansion
康托展开:公式:X=a[n](n-1)!+a[n-1](n-2)!+…+a[i]*(i-1)!+…+a[1]*0! 其中a[i]为当前未出现的元素中是排在第几个(从0开始)。 用于将一组排列映射为一个值。 例如一个字符串 s=”dbac”。 a[4]=3.d>b,d>a,d>c. 从0开始它排第三。 同理 a[3]=1,a[2]=0,a[1]=0。 X(s)=3*3!+1*2!+0*1!
2016-03-09 21:47:00
366
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人