摘要:
卧槽。。。。困了我一年的扩展欧几里得终于做出了,好吧我承认我特别水,关于扩展欧几里得可以看我的博客有介绍这里主要讲一下具体求解过程,a*x+b*y=c, r=gcd(a,b), 如果c可以整除r则x,y有整数解否则没有,然后整个式子除以r得a`*x+b`*y=c`, 此时gcd(a`,b`)=1,然后通过扩展欧几里得求出a`*x+b`*y=gcd(a`,b`)=1的一组解(x`,y`),整个式子乘以c`得a`*(x`*c`)+b`*(y`*c`)=c`,有x=x`*c`+t*b`,y=y`*c`-t*a`,(t位整数),此题要求解最小非负的x,可以利用%运算(a%b)的到最靠近0的数字(符号取 阅读全文
摘要:
Dilworth定理对偶定理:(x,<=)是一个有限偏序集,r为最大链的长度,则x可被分为r个但不能再少的反链证明请看组合数学P95poj3636,:一看就是求最少上升划分数,将上升作为关系,由dilworth定理可知其反链就是不上升,即求最长不上升子序列长度,利用最长下降子序列的二分求法加速(即在二分查找时==情况不返回下标)(不上升) t=(a+b)>>1; if(v[t]<key) b=t; else a=t+1; (下降) if(v[t]==key) return t; else if(v[t]<key) b=t; else a=t+1;观察上述代码。也可 阅读全文
摘要:
dilworth定理应用#include <stdio.h>#include <algorithm>using namespace std;int a,b,v[20000];struct node{ int w,h;}m[20000];bool cmp(node a,node b){ if(a.w==b.w) return a.h>b.h; else return a.w<b.w;}int f(){ int cnt=0; for(int i=0;i<b;++i) if(!v[i]) { v[i]=1; ... 阅读全文
摘要:
贪心,这里提一下dilworth定理很厉害(http://www.lxlsosi.tk/2011/05/26/%E5%81%8F%E5%BA%8F%E9%9B%86-dilworth-%E5%AE%9A%E7%90%86-poj-1065-3636-1548/)@:因为要消除多算的一次,由dilworth定理将题目从最少不降序列划分转为最长下降子序列,若a.w>b.w则在二分计算时会多算一次,因为实际上两者l是相等的(注意这里下降定义为l,w同时小于),所以通过将小者放在前面,来出去多算的一次。#include <stdio.h>#include <algorithm& 阅读全文