Home avatar

白衣苍狗

DancingLinksX|精确覆盖&重复覆盖

DancingLinksX|精确覆盖&重复覆盖

​ 本文介绍DLX及其在精确覆盖和重复覆盖问题中的应用。

在DLX之前先了解精确覆盖和重复覆盖。

精确覆盖

给出一个仅有0、1的矩阵,选择其中的一些行使得这些行组成的集合中每一列都有且仅有一个1,求方案的存在性及具体方案。

最小生成树

最小生成树

无向图:Prim&Kruskal

Prim

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//Prim
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
template<typename T>
void Swap(T& a,T& b){T t=a;a=b;b=t;}
template<typename T>
void read(T& w)
{
	char r;
	for(r=getchar();r<48||r>57;r=getchar());
	for(w=0;r>=48&&r<=57;r=getchar())w=w*10+r-48;
}
const int maxn=103;
const int maxm=maxn*(maxn-1)/2;
int n,m;
struct EDGE
{
	int to,nxt,w;
	void init(int too,int nxtt,int ww)
	{
		to=too,nxt=nxtt,w=ww;
	}
}edge[maxm<<1];
int ek=0;

int node[maxn];
void addEdge(int from,int too,int ww)
{
	edge[++ek].init(too,node[from],ww);
	node[from]=ek;
}
void input()
{
	read(n),read(m);
	int x,y,l;
	for(int i=1;i<=m;++i)
	{
		read(x),read(y),read(l);
		if(x!=y)
		{
			addEdge(x,y,l);
			addEdge(y,x,l);
		}
	}
}
bool operator<(const EDGE& a,const EDGE& b)
{
	return a.w<b.w;
}
template<typename T>
struct HEAP
{
	T ary[maxm<<1];
	int f;
	HEAP(){f=0;}
	void clear(){f=0;}
	bool empty(){return f==0;}
	void push(const T& w)
	{
		ary[++f]=w;
		for(int k=f;k!=1&&ary[k]<ary[k/2];k=k/2)
		{
			Swap(ary[k],ary[k/2]);
		}
	}
	T top(){return ary[1];}
	T pop()
	{
		T tmp=ary[1];
		ary[1]=ary[f--];
		for(int k=1,son=k*2;son<=f;k=son,son=k*2)
		{
			if(son+1<=f&&ary[son+1]<ary[son])
				son=son+1;
			if(ary[son]<ary[k])
				Swap(ary[son],ary[k]);
			else break;
		}
		return tmp;
	}
};
int s=1;
bool vis[maxn];
HEAP<EDGE> h;
int Prim()
{
	int sum=0;
	for(int k=2,ff=1;k<=n;++k)
	{
		vis[ff]=true;
		for(int i=node[ff];i;i=edge[i].nxt)
		{
			int v=edge[i].to;
			if(!vis[v])
				h.push(edge[i]);
		}
		EDGE tmp;
		for(tmp=h.pop();vis[tmp.to];tmp=h.pop());
		ff=tmp.to;
		sum+=tmp.w;
	}
	return sum;
}
int main()
{
	input();
	printf("%d\n",Prim());
	return 0;
}

有向图:朱刘算法

概念

最小树形图算法(时间复杂度O(VE))

希尔排序模板

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//希尔排序 
template<typename T>
void Swap(T& a,T& b){T t=a;a=b;b=t;}

template<typename T>
void shellSort(T* ary,int l,int r)//默认为<,r为超尾 
{
	int len=(r-l);
	for(int k=len/2;k>=1;--k)
		for(int i=l+k-1;i<=r;++i)
			for(int j=i;j-k>=l&&ary[j]<ary[j-k];j-=k)
				Swap(ary[j],ary[j-k]);
}

template<typename T>
void shellSort(T* ary,int l,int r,bool comp(const T& a,const T& b))//r为超尾 
{
	int len=(r-l);
	for(int k=len/2;k>=1;--k)
		for(int i=l+k-1;i<=r;++i)
			for(int j=i;j-k>=l&&comp(ary[j],ary[j-k]);j-=k)
				Swap(ary[j],ary[j-k]);
}

RMQ问题与ST表

RMQ问题与ST表

ST表

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*
ST表
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
template<typename T>
T Max(const T& a,const T& b){return a>b?a:b;}
template<typename T>
void read(T& w)
{
	char r;int f=1;
	for(r=getchar();(r<48||r>57)&&r!='-';r=getchar());
	if(r=='-')r=getchar(),f=-1;
	for(w=0;r>=48&&r<=57;r=getchar())w=w*10+r-48;
	w*=f;
}
const int maxn=int(1e5+3);
const int maxm=int(1e6+3);
int n,m;
int f[maxn][20];
int a[maxn];
void input()
{
	read(n),read(m);
	for(int i=1;i<=n;++i)
	{
		read(a[i]);
	}
}
void initF()
{
	for(int i=1;i<=n;++i)
	{
		f[i][0]=a[i];
	}
	for(int k=1;(1<<k)<=n;++k)
	{
		for(int i=1;i<=n;++i)
		{
			f[i][k]=f[i][k-1];
			if(i+(1<<(k-1))<=n&&f[i+(1<<(k-1))][k-1]>f[i][k])//caution! 下标可能越界
				f[i][k]=f[i+(1<<(k-1))][k-1];
		}
	}
}
int lg[maxn];
void initLG()
{
	lg[1]=0;
	lg[2]=1;
	for(int i=3;i<=n;++i)
	{
		lg[i]=lg[i/2]+1;
	}
}
int askmax(int l,int r)
{
	int len=r-l+1;
	int k=lg[len];
	return Max(f[l][k],f[r-(1<<k)+1][k]);
}
void solve()
{
	int l,r;
	for(int i=1;i<=m;++i)
	{
		read(l),read(r);
		printf("%d\n",askmax(l,r));
	}
}
int main()
{
	input();
	initLG();
	initF();
	solve();
	return 0;
} 

二维RMQ(正方形情况)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//二维RMQ-正方形
int fm[maxn][maxn][8];
int fn[maxn][maxn][8];
void initMaxMin()
{
	for(int k=0;(1<<k)<=s;++k)
	{
		for(int i=1;i+(1<<(k))-1<=n;++i) for(int j=1;j+(1<<(k))-1<=m;++j)
		{
			if(k==0)
			{
				fm[i][j][0]=fn[i][j][0]=a[i][j];
			}
			else
			{
				fm[i][j][k]=
				Max(
					Max(
						fm[i][j][k-1],
						fm[i+(1<<(k-1))][j][k-1]),
					Max(
						fm[i][j+(1<<(k-1))][k-1],
						fm[i+(1<<(k-1))][j+(1<<(k-1))][k-1])
				);
				fn[i][j][k]=
				Min(
					Min(
						fn[i][j][k-1],
						fn[i+(1<<(k-1))][j][k-1]),
					Min(
						fn[i][j+(1<<(k-1))][k-1],
						fn[i+(1<<(k-1))][j+(1<<(k-1))][k-1])
				);
			}
		}
	}
}
int qMax(int ax,int ay,int bx,int by)
{
	int k=log2(bx-ax+1);
	return Max(
		Max(
			fm[ax][ay][k],
			fm[bx-(1<<k)+1][ay][k]),
		Max(
			fm[ax][by-(1<<k)+1][k],
			fm[bx-(1<<k)+1][by-(1<<k)+1][k])
	);
}
int qMin(int ax,int ay,int bx,int by)
{
	int k=log2(bx-ax+1);
	return Min(
		Min(
			fn[ax][ay][k],
			fn[bx-(1<<k)+1][ay][k]),
		Min(
			fn[ax][by-(1<<k)+1][k],
			fn[bx-(1<<k)+1][by-(1<<k)+1][k])
	);
}

初赛1——计算机结构与原理

在幕布中查看(密码:LAN)

  • 计算机结构与原理
    • 冯诺依曼架构
      • 组成
        • 存储器、运算器、控制器、输入设备、输出设备
      • 存储程序
        • 将程序与数据一起存储、处理
    • 硬件
      • CPU
        • 组成
          • 运算器
          • 控制器
          • 寄存器
        • 参数
          • 字长
            • 一次处理数据的能力
            • 32位CPU
            • 64位CPU
          • 主频
          • MIPS
          • 指令集
            • 复杂指令集(CISC)
            • 精简指令集(RISC)
          • 高速缓存
          • 寻址单元=2^n
          • 制造工艺:xxnm
        • 发展
          • 电子管、晶体管时期
          • Intel
            • 第一个微处理器(有争议)
              • 第一款微处理器应该是美国军方研制,用于F-14雄猫战机中由6颗晶片组成的中央空气数据计算机:CADC(CenterAir Data Computer)
            • 第一款商用处理器
              • 4004
            • 808x
              • 8080
              • 8088
            • x86
              • 286:16bit
              • 386:32bit
              • 486
              • 奔腾
                • I
                • II
                • III
                • IV
            • 安腾
              • 64bit
            • 赛扬
              • 低端
            • 至强
              • 服务器
              • 对处理器
            • 酷睿
      • 内存(主存)
        • CPU能直接寻址的存储空间
        • 分类
          • RAM
            • 随机存储器
            • 存储单元的内容可按需随意取出或存入,且存取的速度与存储单元的位置无关的存储器
            • DRAM
              • 动态:需要不断高速刷新
            • SRAM
              • 静态
          • ROM
          • Cache
        • 发展:SDR、DDR2~4
      • 外存
      • 总线
        • 内部总线
          • 连接CPU内部各个模块
        • 外部总线(系统总线)
          • 连接CPU、存储器和IO系统
          • 分类
            • 数据总线
            • 地址总线
            • 控制总线
    • 软件
      • BIOS
        • 启动时加载的第一个软件
        • UEFI:统一的可扩展固件接口
      • 操作系统
        • 例: windows、Linux、Unix、FreeBSD、NetWare、OS/2、Mac OS
      • 应用软件
      • 编程
        • 语言
          • 机器语言
            • 不可移植
            • 由01组成
          • 汇编语言
            • 是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令
            • 难移植
            • 低级语言
          • 高级语言
            • 命令式语言:这种语言的语义基础是模拟“数据存储/数据操作”的图灵机可计算模型,十分符合现代计算机体系结构的自然实现方式。其中产生操作的主要途径是依赖语句或命令产生的副作用。现代流行的大多数语言都是这一类型,比如 Fortran、Pascal、Cobol、C、C++、Basic、Ada、Java、C# 等及各种脚本语言
            • 函数式语言:这种语言的语义基础是基于数学函数概念的值映射的λ算子可计算模型。适合于进行人工智能等工作的计算。典型的函数式语言如 Lisp、Haskell、ML、Scheme 、F#等。
            • 逻辑式语言:这种语言的语义基础是基于一组已知规则的形式逻辑系统。这种语言主要用在专家系统的实现中。最著名的逻辑式语言是 Prolog。
            • 面向对象语言:现代语言中的大多数都提供面向对象的支持,但有些语言是直接建立在面向对象基本模型上的,语言的语法形式的语义就是基本对象操作。主要的纯面向对象语言是 Smalltalk
            • 虽然各种语言属于不同的类型,但它们各自都不同程度地对其他类型的运算模式有所支持。
      • 常见文件格式
    • 发展
      • 世界
        • ENIAC【美】
          • 1946
          • 宾夕法尼亚大学
        • 发展
          • 1-电子管
          • 2-晶体管
          • 3-中小规模集成电路
          • 4-(超)大规模集成电路
          • 5-光、超导、人工智能、生物
      • 中国
        • 电子管:1958-1964
          • 第一台电子数字计算机(103机):1958-8-1
          • 第一台大型通用电子数字计算机(104机)
          • 第一台自行设计小型通用电子数字计算机(107机):1960-4
          • 第一台自行设计的大型通用数字电子管计算机(119机):1964
        • 晶体管:1965-1972
          • 第一台大型晶体管计算机(109乙机):1965
        • 中小规模集成电路:1973-80s初
          • 100万次/s大型机:1973
          • 100万次/s小型机:1974
        • 超大规模
        • 银河-I(每秒上亿次):1983
        • 银河-II(每秒10亿次):1992
        • 银河-III(百亿次):1997
        • 第一款通用CPU:龙芯:2001
      • 摩尔定律
        • 当价格不变时,集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,性能也将提升一倍
      • 钟摆定论
    • 周边
      • 计算机特点
        • 运算速度快
        • 运算精度高
        • 具有记忆能力
        • 具有逻辑判断能力
        • 具有自动控制能力
      • 分类
        • 巨型机
        • 大型机
        • 小型机
        • 微型机
        • 单片机
      • 应用
        • 数值计算
        • 自动控制
        • 事物处理
        • 辅助教学(CAI)
        • 辅助设计(CAD)
        • 辅助测试(CAT)
        • 信息检索
        • 出版印刷
        • 网络通信
        • 多媒体技术
  • 汉字信息编码
    • 输入码
      • 区位码
      • 音码
      • 形码
      • 音形码
    • 区位码
    • 国标码=区位码+20H
    • 机内码=国标码+80H
    • 字形码
0%