05 2016 档案
摘要:/* 二分图染色版本 两个监狱对应二部图的两部分 在给定的怨气值里二分 对于每一个Ci 进行染色判断是否合法 染色的时候 如果这条边的ci > Ci 这两个人就带分开 即染成不同的颜色 如果染色到某两个点颜色相同且怨气值>Ci 这个Ci就不合法 二分直到最后答案 */ #include #include #include #include #define maxn 100010 us...
阅读全文
摘要:#include #include #include #define maxn 2010 using namespace std; int n,m,num,head[maxn],f[maxn],match[maxn],color[maxn]; struct node { int u,v,pre; }e[maxn*maxn]; void Add(int from,int to) { ...
阅读全文
摘要:/* 二分答案 这个题目要求“体力和最小的那个小组的所有人的体力和尽量大” 很明显我们二分最小体力 如果合法 逐渐放大 但是这里我们二分的是最小而不是最大 所以累加的体力>=ans时 跳过当前体力i (可以认为把他归给了上一组) 累加和=0 继续分组 */ #include #include #include #define ll long long #define maxn 30010...
阅读全文
摘要:/* 先来个倍增 */ #include #include #include #define maxn 10010 using namespace std; int T,n,num,head[maxn],st,end,anc,fa[maxn][25],dep[maxn],out[maxn],root; struct node { int u,v,t,pre; }e[maxn*2]; v...
阅读全文
摘要:/* 在我还不知道LCA之前 暴力跑的SPFA 70分 三个点TLE */ #include #include #include #include using namespace std; struct node { int u; int t; int pre; }; node a[30010*2+100]; queueq; int n,qq,x[30010],num...
阅读全文
摘要:/* 二分答案(注意精度) 对于每一个答案 有(s1+s2+s3...)/(t1+t2+t3...)>=ans 时符合条件 这时ans有变大的空间 对于上述不等式如果枚举每一条路显得太暴力 化简一下变成 :s1-t1*ans+s2-t2*ans+s3-t3*ans...>=0 差分约束跑最长路 如果dis[n]>0 或者有正环 (开始这个忘掉了)ans就合法 */ #include #incl...
阅读全文
摘要:/* 这题并没有A掉 自己电脑上运行ok提交就不对 预处理攻击范围 然后模拟 求大神看看有没有错误 Orz */ #include #include #include #define ll long long using namespace std; ll g[25][25],ans=-10000000; int n,m,f[125][125],px,py; char s; ll F(int...
阅读全文
摘要:/* 这类题的最优策略: 自己最好的干掉对方最好的 或者 自己最差的干掉对方最差的 不能的话 用自己最差的 对阵对方最好的 这样是最优的 实现嘛 搞两个队列跑一跑 */ #include #include #include #include #define maxn 100010 using namespace std; int n,q1[maxn],q2[maxn],ans1,ans2,h1...
阅读全文
摘要:/* 我觉得挺对的啊 实在是考虑不到有什么情况会判不了 70分 就这样吧 - - */ #include #include #include #include #include #define maxn 310 using namespace std; int init() { int x=0;char s=getchar(); while(s'9')s=getchar(); ...
阅读全文
摘要:#include #include #include #define maxn 2020 using namespace std; int n,m,g[maxn][maxn],ans,f[maxn],match[maxn]; int init() { int x=0;char s;s=getchar(); while(s'9')s=getchar(); while(s>=...
阅读全文
摘要:/* codevs 4163 神犇与逆序对 */ #include #define ll long long #define maxn 1000010 using namespace std; ll n,a[maxn],b[maxn],ans; ll init() { ll x=0;char s;s=getchar(); while(s'9')s=getchar(); ...
阅读全文
摘要:#include #include #include #include #define maxn 20010 using namespace std; int n,m,k,num,f[maxn],head[maxn],dis[maxn]; struct node { int u,v,t,pre; }e[maxn]; int init() { int x=0;char s=getc...
阅读全文
摘要:#include #include #include using namespace std; int T,x,y,ans,g,l1,r1,l2,r2; int init() { int x=0;char s=getchar();bool f=0; while(s'9'){if(s=='-')f=1;s=getchar();} while(s>='0'&&sr1||l2>...
阅读全文
摘要:#include #include #include #include #define maxn 100010 using namespace std; int n,m,T,num1,num2,head1[maxn],head2[maxn],dis1[maxn],dis2[maxn],f[maxn]; queueq1; queueq2; int ans[maxn],maxx; struct no...
阅读全文
摘要:/* 画矩阵找规律发现是杨辉三角 Cg (i,j)= C (i+j,i); 贪心走的话 沿着0行(列)一直走然后拐直角 拐弯后每个格子都累加 Cg (n,0) + Cg (n,1) + Cg (n,2) + ... +Cg (n,m) 有n>m 即 C(n+0,n) + C (n+1,n) + C (n+2,n) + ... +C (n+m,n) 上式 = C (n+m+1,m); 然后...
阅读全文
摘要:/* 数学题0.0 最后答案:A(n,n)*A(n+1,2)*A(n+3,m)+A(n,n)*C(m,1)*A(2,2)*C(n+1,1)*A(n+2,m-1); 简单解释一下 +之前的很显然 先排男生 然后老师插空 然后女生插空 显然符合条件 但仔细一想会发现少算了一部分 就是 老师 女生 老师 的情况 在单独考虑着一种 先选夹在中间的女生(C(m,1)) 然后老师换位置 A(2,2) 然...
阅读全文
摘要:/* 题目:给出一个数 如果是prime 输出prime 否则输出他的最小质因子 Miller Rabin +Poller Rho 大素数判定+大数找质因子 后面这个算法嘛 基于Birthday Paradox 简单点说就是 在 1到100 内去一个数 ai ai==42的概率很小 但是如果取两个数 ai bi ai-bi==42 的概率就会变大 应用到找素因子上 就不用像试除法那样一个一个的...
阅读全文
摘要:/* 直接费马小定理 */ #include #include #include #include #define ll long long using namespace std; ll slow_mul(ll a,ll b,ll c) { ll ans=0; a=a%c;b=b%c; while(b) { if(b&1) ...
阅读全文
摘要:/* Lucas定理 C(n,m)%p(p为素数) C(n,m)与C(a[n],b[n])*C(a[n-1],b[n-1])*C(a[n-2],b[-2])*....*C(a[0],b[0])模p同余 a,b 是n,m在p进制下的数 有的推公式: (C(n%p,m%p,p)*Lcs(n/p,m/p,p))%p; 关键是求 C(n%p,m%p,p) 递归会很慢 for的话会爆掉 这里用一个定理:a...
阅读全文
摘要:/* 将n个不同的球放入m个不同的盒子的方案数 m^n */ #include #include #include using namespace std; int n,m,a[1010],l; int main() { scanf("%d%d",&n,&m); int k=m; while(k) { a[++l]=k%10; ...
阅读全文
摘要:/* 暴力做法 : 从2开始枚举,然后暴力判断g^(P-1) = 1 (mod P)是否当且仅当指数为P-1的时候成立 25分0.0 */ #include #include #include #include using namespace std; long long Mi(int a,int m,int p) { if(m==0)return 1; long long x...
阅读全文
摘要:/* 扩展欧几里得 ax%b==1 -> ax-by==1 求不定方程的一组解 使x为最小正整数解 */ #include #include #include using namespace std; int x,y,gcd; int Extend(int a,int b) { if(b==0) { x=1;y=0; gcd=a...
阅读全文
摘要:#include #include #include #define maxn 30010 using namespace std; int n,m,num; struct node { int l,r,lc,rc,sum,fa;//sum是还有几个没出队的 }t[maxn*2+1000]; void Build(int ll,int rr) { int k=++num; ...
阅读全文
摘要:/* 做的不多的位数dp 暴力的话 不知道多少组数据 会T 所以写dp 思路就和数学课本上那种“不超过xxx的x位偶数有几个” 这里可以类似的维护一个前缀和模样的东西(但又不同于前缀和) 状态:f[i][j] 表示以j开头的i位数符合条件的个数 (j可以是0) 然后可以已处理一下像是10000这种整的数 注意舍去不符合条件的 然后对于一个像123456这样不整的数 就从该高位逐位找 以此类推...
阅读全文
摘要:#include #include #include #define maxn 100010 using namespace std; int n,m,num,a[maxn],tmp[maxn]; char s[100]; struct node { int l,r; int lc,rc; int s[7],bj; }t[maxn*2+100]; int init() {...
阅读全文
摘要:/* dp 如果是统计最少加多少个括号 就是区间dp 如果区间两头是匹配的 就可以用 i+1 j-1 更新 然而这题要输出方案 就类似记路径 记背包选哪几个一样 维护一个bj表示 i到j的最优解是由 分成哪两份转移来的 如果无法分 就是-1 最后递归搞输出方案 递归终点就是需要改变的点 */ #include #include #include using names...
阅读全文
摘要:/* Tarjan缩点之后 强联通分量建图 统计每个强联通分量的出入度 第一问就是入度为0的 强联通分量的个数 第二问 为了高效的使每个强联通分量都有出入度 要把出度为零的强联通分量连到入度为零的点上 这样得到的边数是最少的 ans2并不是桥的数目 这样不是最少..... */ #include #include #include #define maxn 110 #define maxm ...
阅读全文
摘要:#include #include #include using namespace std; int n,m,son[310][2],f[310][310],v[310],ans,falg; int init() { int x=0;char s;s=getchar(); while(s'9')s=getchar(); while(s>='0'&&sf[p][x])f[...
阅读全文
摘要:/* 查分约束. 给出的约束既有>= 又有=x 建边 a到b 权值为x Sb-Sa Sa-Sb>=-y 建边 b到a 权值为-y 然后跑最短路 SPFA 判断到不了终点 判断负环的死循环. */ #include #include #include #include #define maxn 20010 using namespace std; int n,m1,m2,num,head[m...
阅读全文
摘要:/* 数组开大保平安. 查分约束: 输入的时候维护st和end 设每个点取元素di个 维护元素个数前缀和s Sbi-Sai-1>=ci 即:建立一条从ai-1到bi的边 权值为ci 表示ai到bi的最小取元素个数 然后跑st到end的最长路 (建边就已经保证了最优) 最后 dis[end] 即为end的前缀和 即为st到end 符合每一个约束的最小去元素值 同时查分约束也满足性质 Sa...
阅读全文
摘要:/* Tanjar缩点后 记好每个点属于第几个强联通分量 然后维护nu数组表示每个强联通分量的出度为几(枚举割边) 只要某个强联通分量有出度而没有入度 说明并不是多有牛都认为这里面的牛牛 最后找nu为零的唯一一个强联通分量 如果有好几个nu为零的 依旧没有符合条件的牛 即图并不连通 */ #include #include #include #define maxn 50010 usin...
阅读全文
摘要:#include #include #include #include #define pa pair using namespace std; int n,num,dis[101],ans,f[101],head[101]; struct node { int u,v,pre,dis; }e[110*110]; void Add(int from,int to,int dis) { ...
阅读全文
摘要:/* - - 这题做了一天.....粗心害死人啊 题目描述恶心 数据更恶心... 先处理一下能走的边 能走的点(到这建边从终点跑一下.) 然后就是SPFA了 注意负环的判断 */ #include #include #include #include #define maxn 1110 #define maxm 10010 #define inf 999999999 using namesp...
阅读全文
摘要:#include #include #include #include #define maxn 110 #define pa pair using namespace std; int n,num,head[maxn],dis[maxn],ans,len=0x7fffffff,f[maxn]; struct node { int u,v,t,pre; }e[maxn*maxn]; vo...
阅读全文
摘要:#include #include #include #include #define ll long long using namespace std; ll n,num,ans,hou[10000000],f[10000000],c[10000000],size; struct node { ll l,r,data; }t[10000000]; void Hou(ll p) { ...
阅读全文
摘要:/* 这题实在调糊了 借鉴的题解的一些判断方法 位运算大法好 - - 因为要集齐所有的宝石所以状态压缩一下 f[i][j][s]将s化为二进制 每一0表示该宝石没有 1表示该宝石有 有:到(i,j)这个点时 宝石收集状况为s的状态是否存在 */ #include #include #include #include using namespace std; int T,n,m,k,f[21...
阅读全文
摘要:/* 和普通的迷宫问题类似只是多了一个叫传送门的东西 对于传送门的处理: 每当跑到传送门就把其余所有传送门周围的点都入队 传送门之间不花费时间并且从不是传送门的点走到传送门 也不花费时间花费时间的(好像说了句废话.) 所以判断一下 */ #include #include #include #include #include #define maxn 5010 using namespace ...
阅读全文
摘要:/* 巧妙地使用fail数组 根据fail数组的定义 fail[i] 有 长度为i的子串最长公共前后缀为fail[i] 比如样例 fail 0 0 1 2 那么我们维护一个ans[i]表示到i位置的时候 前i位置子串的匹配次数 比如 a b a ans[1]=1 ans[2]=1 到ans[3]的时候 发现 a 又出现了一边 说明之前的a子串统计少了 相应的可以根据 fail找到a的位置...
阅读全文
摘要:/* 裸地manachar */ #include #include #include #define maxn 1000010 using namespace std; int l,len[maxn]; char s[maxn],ss[maxn]; int manachar() { int ans=0; int id=-1,mx=-1; for(int i=1;i=0...
阅读全文
摘要:#include #include #include #define maxn 1010 using namespace std; int ans,an[maxn],l1,l2,fail[maxn]; char s1[maxn],s2[maxn]; void kmp_init() { for(int i=2;i<=l2;i++) { int p=fail[...
阅读全文
摘要:/* 无奈我改了那么久还是看的题解 首先跑一边kmp 几下ans[p]表示总共匹配到长度p的次数 这些不一定都是恰好到p 所以在处理一下 ans[p]通过处理变成 所有的匹配到长度p的次数 最后答案就是总共匹配到长度p+1的次数 - 总共匹配到长度p的次数 就是恰好匹配到长度p的次数 */ #include #include #include #define maxn 200010 usin...
阅读全文
摘要:/* 手打的哈希+线性的维护 第一问:hash一下 并且用个h记录某个单词要背的 第二问:线性的跑一边 开始队列里装下前一些单词使这一坨符合要求 并且记录出现次数num 然后开始从前面删 删除的条件:要么是非法的单词(h值为0) 要么num值大于1 如果删不了就在进来一个 更新num 直到跑完 这过程中每次更新l 注意这样有极端数据 如果第一问答案为 0 需要特判...
阅读全文
摘要:/* n*n的算法 比较容易想到 特判的好cena的 70分 */ #include #include #include using namespace std; int a[40005],f[40005]; int main() { //freopen("cleanup.in","r",stdin); //freopen("cleanup.out","w",stdout)...
阅读全文
摘要:#include #include #include #include #define maxn 100010 using namespace std; int n,m,num; struct node { int lc,rc; int l,r; int sum,bj; }t[maxn*2+100]; void Build(int ll,int rr) { int...
阅读全文
摘要:/* 线段树开到*4 *4 *4 *4 ! 维护 4个值 区间最大值 区间最小值 从左往右跑最大收益 从右往左跑最大收益 */ #include #include #include #define maxn 200010 #define inf 0x7fffffff using namespace std; int n,m,num,a[maxn]; struct node { int ...
阅读全文
摘要:/* b本树较弱 支持插入+查询(删除太麻烦0.0) 复杂度 对于随机数据O(n*logn) 特殊的 如果一条链下来 O(n*n) (升级版:平衡树. ) */ #include #include #include #define maxn 100010 using namespace std; struct node { int lch; int rch; int ...
阅读全文
摘要:/* 差分序列 b[i]=a[i]-a[i-1] 支持多次区间+ / - 最后输出原序列 区间+ 只需要修改 b[l] b[r+1] */ #include #include #define maxn 200010 using namespace std; int n,a[maxn],b[maxn],m; int init() { int x=0; int f=0; ...
阅读全文
摘要:/* 树状数组前缀和 虽然只资词单点修改 区间查询 但是好写 pos&(-pos) 很神奇的东西 求前缀和 负数的二进制表示用补码(对应整数的反码+1) */ #include #include #include using namespace std; int tree[100010],n,m; void Add(int pos,int data) { while(pos>n; ...
阅读全文
摘要:/* 本字典树较弱 只支持插入单词 查询单词. 特殊的 bool变量w 标记此字母是不是某个单词的结束 (然而这个题并没卵用) */ #include #include #include #define maxn 300010 #define maxm 1010 using namespace std; char s[maxm]; struct node { int next[27];...
阅读全文
摘要:/* 区间修改 区间查询 可以用线段树搞 但是一般的标记下放对这个题好像不合适 只能改叶子 然后更新父亲(虽然跑的有点慢) 小优化:如果某个点是1 就不用再开方了 所以搞一个f[i]标记 i 这个点还需不需要处理下去 注意用longlong 还有就是数组开大 */ #include #include #include #include #define LL long long #defin...
阅读全文
摘要:/* ST表多次查询区间最小值 设 g[j][i] 表示从第 i 个数到第 i + 2 ^ j - 1 个数之间的最小值 类似DP的说 ans[i][j]=min (ans[i][mid],ans[mid+1][r])mid=(l+r)/2 but 数太大装不下 所以改一个g数组出来就好了 接下来考虑 g[i][j]由谁转移来(不漏下就好 因为是去min 可以重复 同理gcd也可以 其他的...
阅读全文

浙公网安备 33010602011771号