`
promiser
  • 浏览: 76935 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论
文章列表
详解请看 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 ...
状态 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 ...
爆搜 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 ...
若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() { ...
先把边按边权从大到小排,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 *_ ...
用一个四元组(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) ...
单调队列压缩每一行的最大最小,再压缩每一列,然后暴力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[ ...
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 ...
原型是环状的匀分纸牌,就是数学分析法。这类题目应该都是取中位数 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] ...
第一问和第二问分开处理,第一问二分回答,第二问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 ...
用余弦定理求出覆盖的极角区域,然后就是简单的线段覆盖 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(" ...
Global site tag (gtag.js) - Google Analytics