- 浏览: 76935 次
- 性别:
- 来自: 广州
最近访客 更多访客>>
最新评论
-
promiser:
xlaohe1 写道这是C吗?看不懂呀~加上注释就好了。说明也 ...
bzoj1071: [SCOI2007]组队 -
xlaohe1:
这是C吗?看不懂呀~加上注释就好了。说明也行啊,算法思想也可以 ...
bzoj1071: [SCOI2007]组队
文章列表
详解请看 http://blog.sina.com.cn/s/blog_9aa2786a01011zoj.html
const int N = 2010;
int n, m, Ans1, Ans2, top, sta1[N], sta2[N], h[N];
bool Dat[N][N];
inline void Input() {
scanf("%d%d", &n, &m);
int x;
For(i, 1, n)
For(j, 1, m) {
scanf("%d", &x) ...
暴力数据结构
const int N = 1000010, MOD = 999997;
struct Node {
char Name[14];
int No;
} Tr[N];
LL val[N];
int Fa[N], C[N][2], Sz[N], No[N];
int Root, n, Tot, Ans[N];
int q[N], Top, Cache;
int Fir[N], Nex[N], To[N], hnt, Cnt;
inline void Write(int x) {
if(!x) return;
Write(C[x][1]);
p ...
bzoj1055: [HAOI2008]玩具取名
- 博客分类:
- oi
状态 F[i,j,k] 表示从第i位到第j位,是否可以变换成字符k
const int N = 210;
const char T[6] = {" WING"};
bool Dp[N][N][5];
char Dat[N];
vector<int> need[5][5];
inline int turn(char x) {
if(x == 'W') return 1;
else if(x == 'I') return 2;
else if(x == 'N') return 3;
else return 4;
}
int T ...
bzoj1054: [HAOI2008]移动玩具
- 博客分类:
- oi
爆搜
const int N = 65536,
dx[24] = {15, 14, 13, 15, 14, 13, 12, 11, 10, 9, 11, 10, 9, 8, 7, 6, 5, 7, 6, 5, 4, 3, 2, 1},
dy[24] = {14, 13, 12, 11, 10, 9, 8, 10, 9, 8, 7, 6, 5, 4, 6, 5, 4, 3, 2, 1, 0, 2, 1, 0};
int Hash[N], S, T;
queue<int> Q;
inline void Input() {
Rep(i, 4) {
Rep ...
素因子最多是前10个,同时各个因子的幂肯定递减,爆搜
const int Prim[15] = {1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
LL n;
inline void Input() {
cin >> n;
}
LL Ans, num;
inline void Solve(int w, LL Now, int cnt, int Las) {
if(w == 12) {
if(Now > Ans && cnt > num) Ans = Now, num = cnt; ...
先二分边长,然后按这样的策略判断:正方形肯定是选边上的四个角,枚举第一块在哪个角,再算一边四个角,再枚举第二块,判断剩下的能不能被第三块覆盖
const int N = 20010;
pair<int, int> Data[N];
int n;
inline void Input() {
scanf("%d", &n);
For(i, 1, n) scanf("%d%d", &Data[i].ft, &Data[i].sd);
}
int Mark[N];
inline bool S ...
bzoj1051: [HAOI2006]受欢迎的牛
- 博客分类:
- oi
若A喜欢B则连一条边,求强联通分块,设出度为零的块数为C,若C>1则误解,C=1则输出块数
const int N = 10010, M = 50010;
struct Edge {
int v;
Edge *Next;
Edge() {}
Edge(int _v, Edge *_Next) : v(_v), Next(_Next) {}
} *Fir[N];
int n, m;
inline void Ins(int u, int v) {
Fir[u] = new Edge(v, Fir[u]);
}
inline void Input() {
...
bzoj1050: [HAOI2006]旅行comf
- 博客分类:
- oi
先把边按边权从大到小排,O(M^2)枚举边的区间,并查集判断S和T是否连通,若联通则更新答案
const int N = 510, M = 5010;
typedef pair<int, pair<int, int> > PIII;
PIII Edge[M];
int Fa[N], n, m, S, T;
int Rate1, Rate2;
inline void Input() {
scanf("%d%d", &n, &m);
For(i, 1, m) scanf("%d%d%d", &a ...
设F[i]为以i开头的最长上升序列的长度,第一个元素A[i]必须满足F[i]>=M,第x个元素为A[y],则第(x+1)个元素A[z]需要满足的条件是A[z]>A[y],且F[z]=F[y]-1
这位的题解很详细 http://www.cppblog.com/MatoNo1/archive/2012/09/08/189969.html
const int N = 35010;
struct Edge {
int To;
Edge *Next;
Edge() {
Next = NULL, To = -1;
}
Edge(int _To, Edge *_ ...
bzoj1048: [HAOI2007]分割矩阵
- 博客分类:
- oi
用一个四元组(k,x1,y1,x2,y2)表示以k刀以(x1,y1)为左上角,(x2,y2)为右下角的矩阵的最优值,决策就是把该矩阵划分为两个相邻子矩阵的方法
const int N = 20;
int a, b, n;
DB Sum[N][N], Data[N][N], Dp[N][N][N][N][N], Tot, _x;
inline void Input() {
scanf("%d%d%d", &a, &b, &n);
For(i, 1, a)
For(j, 1, b)
...
bzoj1047: [HAOI2007]理想的正方形
- 博客分类:
- oi
单调队列压缩每一行的最大最小,再压缩每一列,然后暴力a*b求答案
const int N = 1010;
int Data[N][N], n, m, Len;
inline void Input() {
scanf("%d%d%d", &n, &m, &Len);
For(i, 1, n)
For(j, 1, m) scanf("%d", &Data[i][j]);
}
int Cnt[N][N][2], T[N][N][2]; //0->max 1->min
int Sex[ ...
bzoj1046: [HAOI2007]上升序列
- 博客分类:
- oi
d[i]以第i个数开头能产生的最长的LIS的长度
对于有解的情形 设要求的长度为len
第i个数就是从第i-1往后找到第一个d[i]>=len - i + 1且a[i] > a[i-1]
const int N = 10010;
int Data[N], n, m;
int Dp[N], MaxLen;
inline void Input() {
scanf("%d", &n);
For(i, 1, n) scanf("%d", &Data[i]);
}
inline int PutIn(int ...
bzoj1045: [HAOI2008] 糖果传递
- 博客分类:
- oi
原型是环状的匀分纸牌,就是数学分析法。这类题目应该都是取中位数
const int N = 1000010;
int n, Dat[N];
inline void Input() {
scanf("%d", &n);
Rep(i, n) scanf("%d", &Dat[i]);
}
inline void Solve() {
LL T = 0;
Rep(i, n) T += Dat[i];
T /= n;
Dat[0] -= T;
Rep(i, n - 1) Dat[i + 1] ...
bzoj1044: [HAOI2008]木棍分割
- 博客分类:
- oi
第一问和第二问分开处理,第一问二分回答,第二问Dp,要用辅助数组,以空间换时间,复杂度可以做到O(NM)
const int N = 50005, M = 1005, MOD = 10007;
int Dat[N], n, m, s[N];
inline void Input() {
scanf("%d%d", &n, &m);
For(i, 1, n) scanf("%d", &Dat[i]), s[i] = s[i - 1] + Dat[i];
}
inline bool Check(int len ...
bzoj1043: [HAOI2008]下落的圆盘
- 博客分类:
- oi
用余弦定理求出覆盖的极角区域,然后就是简单的线段覆盖
const int N = 1010;
struct Circle {
DB Ox, Oy, R;
Circle() {}
Circle(DB _Ox, DB _Oy, DB _R) : Ox(_Ox), Oy(_Oy), R(_R) {}
inline DB Dis(Circle &B) {
return sqrt(sqr(Ox - B.Ox) + sqr(Oy - B.Oy));
}
} Dat[N];
int n;
inline void Input() {
scanf(" ...