最新文章

拉格朗日插值法及其应用

拉格朗日插值法及其应用

概述 拉格朗日插值法常用于通过点值获得满足这些点值的多项式,是一种由点值到多项式的转换方式 

[51Nod1716]多项式? 题解

[51Nod1716]多项式? 题解

题目地址:51Nod:多项式? 问题 – 51Nod 题目描述 现在有一个n次 

【生物】高中生物选修三:细胞工程

【生物】高中生物选修三:细胞工程

[本文适用于2015、2016级人教版生物课本]
[本文可作各位dalao闲暇时或文化课复健之用]
[不建议读者在毫无基础的情况下阅读此文,应先通读课本]

写一部分之后会补一个题集。不过目前还没怎么接触高考题。在KS的blog里不断冲刺文化课(雾
某狼的知识水平有限,如果发现问题请务必QQ或blog留言告诉我,非常感谢qwq

概述

细胞工程是在细胞水平或细胞器水平上改变细胞内遗传物质或获得细胞产品的技术。
根据操作对象不同,可分为植物细胞工程、动物细胞工程。

植物细胞工程

理论基础:
1. 生物细胞具有全能性
2. 细胞含有本物种特有的整套基因
细胞分化:
在特定的时间和空间条件下,基因的选择性表达。

植物组织培养技术

无菌人工控制条件下,给予适宜的营养条件,诱导离体的植物器官、组织、细胞脱分化为愈伤组织,形成丛芽,最终形成完整的植株。
已分化的细胞 →脱分化→ 愈伤组织 →再分化→ 胚状体、幼根、芽
愈伤组织:分化程度低,排列疏松,高度液泡化。
培养条件:
* 无毒无菌;离体;适宜的温度、PH
* 营养物质(蔗糖等有机物、无机物、激素)。固体培养基还需要加入琼脂
* 光照 脱分化时遮光,否则会形成维管组织而非愈伤组织;再分化时需要光照
关键因素:植物激素的种类和比例

植物体细胞杂交技术

在一定条件下,将不同中的植物体细胞融合成杂种细胞,并把杂种细胞培育成新的植物体的技术。
“新的植物体”不是新物种。只能算是新品种。新物种产生的标志:出现生殖隔离
去除细胞壁 → 原生质体融合 → 植物组织培养 → 杂种植物体
1. 去除细胞壁:纤维素酶、果胶酶
2. 诱导融合:物理法 离心、振动、电激 化学法:聚乙二醇(PEG)诱导融合
一般采用物理法,因为融合效率高、对原生质体伤害小,易操作。
太空中处于失重状态,细胞更容易融合。
细胞融合利用了细胞膜具有一定流动性
融合成功的标志是杂种细胞再生出细胞壁。
杂种染色体数目=原细胞的染色体数目之和。如二倍体番茄+四倍体马铃薯=六倍体杂种细胞
优点:克服了远缘杂交不育种、不亲和障碍,大大扩展了杂交亲本的组合范围。

应用

植物繁殖新途径

  1. 微型繁殖(快速繁殖)
    用于快速繁殖优良品种的植物组织培养技术。
    优点:

* 保持优良品种的遗传特性
* 高效快速地实现种苗大量繁殖
* 选材少,繁殖速度快,周期短,不受季节、气候、自然灾害的影响,可实现自动化管理
微型繁殖时的繁殖方式
如果培养的是体细胞,子代遗传特性不变,属于无性生殖。
如果培养的是生殖细胞(如花药),得到的植株是单倍体,属于有性生殖中的单性生殖。
2. 作物脱毒
选取植物分生区(如根尖、茎尖)。分生区附近病毒极少甚至无病毒。
将分生区进行组织培养获得脱毒苗。提高农作物的产量、质量。
实例:马铃薯、草莓、甘蔗
3.** 人工种子(实际采用了微型繁殖技术)
以植物组织培养得到的胚状体、不定芽、顶芽、腋芽为材料,人工薄(báo)膜包装得到的种子。
特点:
* 后代无性状分离
* 不受季节、气候、地域限制
**组成
:胚状体、人工胚乳、人工种皮

作物新品种的培育

  1. 单倍体育种
    杂交 → 花药离体培养 → 单倍体植株 → 纯合子植株
    注意:花粉离体培养得到的植株都属于单倍体
    优点:

* 后代是纯合子
* 大大缩短了育种年限
2. 突变体的利用
产生原因:(基因突变/染色体变异)
在植物组织培养过程中,受培养条件和外界压力(如射线、化学物质)的影响而发生突变。
利用:筛选出对人们有用的突变体,培育成新品种。

动物细胞工程

理论基础:动物细胞核具有全能性

动物细胞培养

应用:大量获得细胞和细胞产物,是其他动物细胞工程技术的基础。
条件
* 无菌、五毒的环境
* 营养:合成培养基中含有氨基酸、无机盐、糖、微量元素、促生长因子、血清等。
* 适宜温度:36.5℃±0.5℃。适宜PH:7.2-7.4
* 气体环境:通常采用培养皿或松盖培养瓶,置于95%空气和5%二氧化碳中。
过程
1. 取动物胚胎或幼龄动物的组织、器官(分化程度低,分裂旺盛)。剪碎。
2. 分散为单个细胞:用胰蛋白酶或胶原蛋白酶处理一段时间。
为什么不用胃蛋白酶:胃蛋白酶发挥作用的最适PH较低(1~2)。
3. 稀释制成细胞悬液,进行原代培养
悬液中分散的细胞很快贴附在屏蔽上,称为细胞贴壁。
贴壁细胞分裂生长到表面互相接触时,就会停止分裂增殖,称为接触抑制。
4. 分瓶进行传代培养
一般只能传至10代并保持正常的二倍体核型。传代细胞称为细胞株。
少数细胞发生癌变,在50代后仍能存活,形成细胞系。癌变的细胞不再有接触抑制,可以无限增殖。

动物体细胞核移植(克隆)

将动物的一个细胞核移入一个已经去掉细胞核的卵母细胞中,使其重组并发育成一个新的胚胎,这个新的胚胎最终发育为动物个体。
去核时一般会一并去除第一极体。在
去掉细胞核的原因:使克隆个体的遗传物质几乎全部来自供体细胞
克隆个体与供体不完全相同的原因:
1.生物性状由细胞核基因、细胞质基因共同决定
2.生物性状受环境因素影响
应用:
1. 加速家畜遗传改良进程
2. 保护濒危物种
3. 治疗人类疾病
4. 转基因克隆动物作为生物反应器,生产许多珍贵的医用蛋白
存在的问题
体型过大、异常肥胖、发育困难、脏器缺陷、免疫失调等

动物细胞融合

也称细胞杂交,是指两个或多个动物细胞结合形成一个细胞的过程,如精卵结合。
动物细胞融合也利用了细胞膜的流动性。为制造单克隆抗体开辟了新途径。
诱导因素:聚乙二醇、电激、灭活病毒
灭活:用物理或化学手段使病毒或细菌失去感染能力,保留融合活性。
融合完成时,可能出现多种类型的细胞,包括:
杂交瘤细胞、B淋巴细胞杂交细胞、骨髓瘤杂交细胞、多细胞融合细胞、未融合细胞等。
原因是:细胞融合是随机的,且融合率低于100%

单克隆抗体

单个细胞产生的化学性质单一特异性强的抗体。
传统方法:产量低、纯度低、制备的抗体特异性差。
制备:将B淋巴细胞和骨髓瘤细胞融合。
1. 注射抗原蛋白,免疫小鼠;培养骨髓瘤细胞
2. 细胞融合,获得技能既能迅速大量繁殖、又能产生专一抗体的杂种细胞
3. 在具有筛选作用的培养基(HAT选择培养基)上培养
4. 克隆杂种细胞
5. 克隆培养专一抗体,检验阳性细胞,选择效果好的杂交瘤
6. 大规模培养。体外培养/注射到小鼠体内增殖
优点:特异性强、灵敏度高、可大量制备

生物导弹

在单克隆抗体上连接抗癌药物。
优点:不损伤正常细胞(抗体的特异性),用药剂量少,毒副作用小

常见育种方法比较

数学笔记:泰勒公式、泰勒级数、泰勒展开

数学笔记:泰勒公式、泰勒级数、泰勒展开

别看这个标题上有三个名词,其实他们说的都是一个东西,就是下面的这个玩意: 泰勒定理(Tay 

[NOI2001]反正切函数的应用 题解

[NOI2001]反正切函数的应用 题解

题目地址:POJ:1183 — 反正切函数的应用 题目描述 反正切函数可展开成 

拉格朗日乘数法及其应用

拉格朗日乘数法及其应用

概述

拉格朗日乘数法是数学中一种求带限制时多元函数的极值的常用方法。下面我们介绍拉格朗日乘数法的过程以及原理。

过程

对于多元函数f(x_1, x_2, \ldots, x_n),有限制g_1(x_1, x_2, \ldots, x_n)=0, \ldots, g_m(x_1, x_2, \ldots, x_n)=0,求原函数f的极值。
首先,我们对于每个限制引入拉格朗日乘数,分别为\lambda_1, \lambda_2, \ldots, \lambda_m,然后构造拉格朗日函数\mathcal{L}(x_1, x_2, \ldots, x_n, \lambda_1, \lambda_2, \ldots, \lambda_m) = f(x_1, x_2, \ldots, x_n) + \sum_{i=1}^m \lambda_ig_i(x_1, x_2, \ldots, x_n)。对于每一个未知数,对拉格朗日函数求偏导,得到方程组\frac{\partial \mathcal{L}}{\partial x_i} = 0\frac{\partial \mathcal{L}}{\partial \lambda_i} = 0。该方程组的一个解即为原函数取得极值的一个解。

例子

问题:求双曲线xy = 3上离原点最近的点。
现在我们来求解它,首先问题可以转化为xy = 3时,f(x, y) = x^2 + y^2取得最小值的解。那么我们引入一个系数\lambda,构造拉格朗日函数为\mathcal{L}(x, y, \lambda) = x^2 + y^2 + \lambda(xy - 3)。对函数求偏导得到方程组如下:
\begin{cases} \frac{\partial \mathcal{L}}{\partial x} = 2x + \lambda y = 0 \\ \frac{\partial \mathcal{L}}{\partial y} = 2y + \lambda x = 0 \\ \frac{\partial \mathcal{L}}{\partial \lambda} = xy - 3 = 0 \end{cases}
解上面的方程组,得到一组解为
\begin{cases} \lambda = -2 \\ x = \sqrt{3} \\ y = \sqrt{3} \end{cases}
则点(\sqrt{3}, \sqrt{3})为一个所求点。

原理

注:下面的介绍仅提供一种理解方法,而非严谨证明。严谨证明参见:拉格朗日乘数 – 维基百科,自由的百科全书
假如有函数f(x, y)及限制条件g(x, y) = c,我们可以类似地理上的等高线那样,在二维平面中绘制出f(x, y) = C的曲线,再把g(x, y) = c的曲线画上去。它可能看起来像下面这样。
等高线示意图
(图片来自维基百科:拉格朗日乘数 – 维基百科,自由的百科全书
我们知道,f(x, y)的等高线和g(x, y) = c曲线的交点就是一组可行解。现在我们想求得极值,就要考虑上面的常数C取得极值时的情况,容易发现,当等高线与限制曲线相切的时候,就会出现极值。求出这个极值点的方法即为偏导取0时的解。

[NOI2012]骑行川藏 题解

[NOI2012]骑行川藏 题解

题目地址:洛谷:【P2179】[NOI2012]骑行川藏 – 洛谷、BZOJ: 

数学笔记:极限、导数、积分

数学笔记:极限、导数、积分

极限(Limit) 概念 c,L皆为实数,,当时,当且仅当:任一个,必存在一个,使得若,则 

[SPOJ-QTREE7]Query on a tree VII 题解

[SPOJ-QTREE7]Query on a tree VII 题解

题目地址:洛谷:【SP16580】QTREE7 – Query on a tree VII – 洛谷、SPOJ:SPOJ.com – Problem QTREE7

题目描述

You are given a tree (an acyclic undirected connected graph) with n nodes. The tree nodes are numbered from 1 to n. Each node has a color, white or black, and a weight. We will ask you to perfrom some instructions of the following form:

  • 0 u: ask for the maximum weight among the nodes which are connected to u, two nodes are connected if all the node on the path from u to v (inclusive u and v) have a same color.
  • 1 u: toggle the color of u(that is, from black to white, or from white to black).
  • 2 u w: change the weight of u to w.

给一个带点权的树,点有黑白两种颜色。操作:1.询问到u路径上颜色都一样的点中点权的最大值2.改变颜色3.改变点权

输入输出格式

输入格式:
The first line contains a number n denoted how many nodes in the tree(1 ≤ n ≤ 10^5). The next n-1 lines, each line has two numbers (u, v) describe a edge of the tree(1 ≤ u, v ≤ n). The next 2 lines, each line contains n number, the first line is the initial color of each node(0 or 1), and the second line is the initial weight, let’s say Wi, of each node(|Wi| ≤ 10^9). The next line contains a number m denoted how many operations we are going to process(1 ≤ m ≤ 105). The next m lines, each line describe a operation (t, u) as we mentioned above(0 ≤ t ≤ 2, 1 ≤ u ≤ n, |w| ≤ 10^9).

输出格式:
For each query operation, output the corresponding result.

输入输出样例

输入样例#1:

5
1 2
1 3
1 4
1 5
0 1 1 1 1
1 2 3 4 5
3
0 1
1 1
0 1

输出样例#1:

1
5

输入样例#2:

7
1 2
1 3
2 4
2 5
3 6
3 7
0 0 0 0 0 0 0
1 2 3 4 5 6 7
4
0 1
1 1
0 2
0 3

输出样例#2:

7
5
7

题解

参考资料:【Qtree】Query on a tree系列LCT解法 – CSDN博客
可以从QTREE6的代码改过来。QTREE6见:[SPOJ-QTREE6]Query on a tree VI 题解 | KSkun’s Blog
实际上和QTREE6的区别就在于要维护的值变成了若干最大值。那么我们考虑Splay子树直接算,轻边子树用一个set维护,这样方便在access的时候增删元素。

代码

// Code by KSkun, 2018/3
#include <cstdio>
#include <cstring>

#include <algorithm>
#include <set>

inline char fgc() {
    static char buf[100000], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}

inline int readint() {
    register int res = 0, neg = 1;
    char c = fgc();
    while(c < '0' || c > '9') {
        if(c == '-') neg = -1;
        c = fgc();
    }
    while(c >= '0' && c <= '9') {
        res = res * 10 + c - '0';
        c = fgc();
    }
    return res * neg;
}

const int MAXN = 100005, INF = 1e9;

struct Edge {
    int to, w, nxt;
} gra[MAXN << 1];
int head[MAXN], ecnt, fa[MAXN], col[MAXN];

inline void addedge(int u, int v, int w) {
    gra[ecnt] = Edge {v, w, head[u]}; head[u] = ecnt++;
}

struct LCT {
    struct LCTNode {
        int ch[2], fa, val, mx;
        std::multiset<int> s;
        bool rev;
    } lct[MAXN];

    inline bool isleft(int p) {
        return lct[lct[p].fa].ch[0] == p;
    }

    inline bool isroot(int p) {
        register int fa = lct[p].fa;
        return lct[fa].ch[0] != p && lct[fa].ch[1] != p;
    }

    inline void update(int p) {
        register int ls = lct[p].ch[0], rs = lct[p].ch[1];
        lct[p].mx = lct[p].val;
        if(!lct[p].s.empty()) lct[p].mx = std::max(lct[p].mx, *--lct[p].s.end());
        if(ls) lct[p].mx = std::max(lct[p].mx, lct[ls].mx);
        if(rs) lct[p].mx = std::max(lct[p].mx, lct[rs].mx);
    }

    inline void reverse(int p) {
        std::swap(lct[p].ch[0], lct[p].ch[1]);
        lct[p].rev ^= 1;
    }

    inline void pushdown(int p) {
        register int ls = lct[p].ch[0], rs = lct[p].ch[1];
        if(lct[p].rev) {
            if(ls) reverse(ls);
            if(rs) reverse(rs);
            lct[p].rev ^= 1;
        }
    }

    int sta[MAXN], stop;

    inline void pushto(int p) {
        stop = 0;
        while(!isroot(p)) {
            sta[stop++] = p;
            p = lct[p].fa;
        }
        pushdown(p);
        while(stop) {
            pushdown(sta[--stop]);
        }
    }

    inline void rotate(int p) {
        register bool t = !isleft(p); register int fa = lct[p].fa, ffa = lct[fa].fa;
        lct[p].fa = ffa; if(!isroot(fa)) lct[ffa].ch[!isleft(fa)] = p;
        lct[fa].ch[t] = lct[p].ch[!t]; lct[lct[fa].ch[t]].fa = fa;
        lct[p].ch[!t] = fa; lct[fa].fa = p;
        update(fa);
    }

    inline void splay(int p) {
        pushto(p);
        for(register int fa = lct[p].fa; !isroot(p); rotate(p), fa = lct[p].fa) {
            if(!isroot(fa)) rotate(isleft(fa) == isleft(p) ? fa : p);
        }
        update(p);
    }

    inline void access(int p) {
        for(register int q = 0; p; q = p, p = lct[p].fa) {
            splay(p);
            if(lct[p].ch[1]) lct[p].s.insert(lct[lct[p].ch[1]].mx);
            if(q) lct[p].s.erase(lct[p].s.find(lct[q].mx));
            lct[p].ch[1] = q;
            update(p);
        }
    }

    inline void makert(int p) {
        access(p);
        splay(p);
        reverse(p);
    }

    inline int findrt(int p) {
        access(p);
        splay(p);
        while(lct[p].ch[0]) p = lct[p].ch[0];
        return p;
    }

    inline void link(int u) {
        access(fa[u]);
        splay(fa[u]);
        splay(u);
        lct[fa[u]].ch[1] = u;
        lct[u].fa = fa[u];
        update(fa[u]);
    }

    inline void cut(int u) {
        access(u);
        splay(u);
        lct[u].ch[0] = lct[lct[u].ch[0]].fa = 0;
        update(u);
    }

    inline void modify(int u, int w) {
        access(u);
        splay(u);
        lct[u].val = w;
        update(u);
    }

    inline int query(int u) {
        int c = col[u];
        u = findrt(u);
        splay(u);
        return col[u] == c ? lct[u].mx : lct[lct[u].ch[1]].mx;
    }
} L[2];

inline void dfs(int u, int f) {
    for(int i = head[u]; ~i; i = gra[i].nxt) {
        int v = gra[i].to;
        if(v == f) continue;
        fa[v] = L[col[v]].lct[v].fa = u;
        dfs(v, u);
        L[col[v]].lct[u].s.insert(L[col[v]].lct[v].mx);
    }
    L[0].update(u); L[1].update(u);
}

int n, q, ut, vt, op;

int main() {
    memset(head, -1, sizeof(head));
    n = readint();
    for(int i = 1; i < n; i++) {
        ut = readint(); vt = readint();
        addedge(ut, vt, 1);
        addedge(vt, ut, 1);
    }
    for(int i = 1; i <= n; i++) {
        col[i] = readint();
    }
    for(int i = 1; i <= n; i++) {
        L[0].lct[i].val = L[1].lct[i].val = readint();
    }
    dfs(1, 0);
    q = readint();
    while(q--) {
        op = readint(); ut = readint();
        if(op == 0) {
            printf("%d\n", L[col[ut]].query(ut));
        } else if(op == 1) {
            if(fa[ut]) {
                L[col[ut]].cut(ut);
                L[col[ut] ^ 1].link(ut);
            }
            col[ut] ^= 1;
        } else {
            vt = readint();
            L[0].modify(ut, vt);
            L[1].modify(ut, vt);
        }
    }
    return 0;
}
[SPOJ-QTREE6]Query on a tree VI 题解

[SPOJ-QTREE6]Query on a tree VI 题解

题目地址:洛谷:【SP16549】QTREE6 – Query on a tr