作者: KSkun

【生物】固定模式答法合集

【生物】固定模式答法合集

由于博主高考完了,本文不再更新。 必修1 走进细胞 科学家通过制备“陷阱细胞”来治疗艾滋病 

[NOIP2017普及]跳房子 题解

[NOIP2017普及]跳房子 题解

题目地址:洛谷:【P3957】跳房子 – 洛谷 题目描述 跳房子,也叫跳飞机, 

【物理】千变万化的直线运动图像

【物理】千变万化的直线运动图像

概述

我们在做运动学图像题的时候总是会面临一些非传统的运动学图像,在这篇文章中,我将归总我遇到过的有趣的创新图像题以及分析方法。

模型与例题

$a-x$图像或$x-a$图像

例题

(多选)放在水平面上的物体,在水平力$F$作用下开始运动,以物体静止时的位置为坐标原点,力$F$的方向为正方向建立$x$轴,物体的加速度随位移的变化图像如图所示。下列说法中错误的是
a-x图像题1
A. 位移为$x_1$时,物体的速度大小为$\sqrt{2a_0x_1}$
B. 位移为$x_2$时,物体的速度达到最大
C. 物体的最大速度为$\sqrt{a_0(x_2+x_3)}$
D. $0 \sim x_2$过程中物体做匀加速直线运动,$x_2 \sim x_3$过程中物体做匀减速直线运动

题目来源:放在水平面上的物体,在水平力F作用下开始运动,以物体静止时的位置为坐标原点,力F的方向为正方向建立x轴,物体的加速度随位移的变化图像如图所示… 满分5满分网

【解析】

本题给了一个$a-x$图像。我们注意到,在$x_2 \sim x_3$段的图像是一条直线,这是随时间增大均匀减小的加速度吗?显然不是。

在与计算无关的情况下,我们可以认为$x$轴就是原来$a-t$图像的$t$轴,只是这根轴上的数值分布不均匀。用这种方法可以定性分析运动的相关情况。我们发现,在整个运动中物体都在加速。
在需要计算的情况下,我们显然无法使用观察图像的方法获得速度的变化量。对于这个图像,我们能使用的公式只有$v_t^2 – v_0^2 = 2ax$这一个了。然而用好它也能解决很多问题。

接下来我们逐选项地分析题目。
A项,在$x_1$处使用公式$v_1^2 – 0 = 2a_0x_1$,即可求出$v_1=\sqrt{2a_0x_1}$,本项是正确的。
B项,由于全段都在加速,$x_3$才是速度达到最大的时候的位移值。
C项,最大速度显然要计算$x_3$处的速度$v_3$,但是问题来了,这是一个变加速直线运动,我们无法利用传统方法求解了,还有什么其他的办法呢?观察公式$v^2=2ax$,$ax$不就是图形的面积吗?我们可以求出图形的面积为$S=\frac12(x_2+x_3)a_0$,代入上面的公式,得到了我们要求的速度$v_3^2=(x_2+x_3)a_0$,即$v_3=\sqrt{(x_2+x_3)a_0}$。
D项,$x_2 \sim x_3$段加速度恒为正,物体在做匀加速运动。
最后还有一个坑,题目要求选出错误的,因此应该选择BD两项。

本题解决非传统问题的方法是,通过公式得到非传统图像的面积意义,从而解决非传统问题。看来,对于图像与公式的意义把握是解决问题的重要手段。

$v-x$图像或$x-v$图像

例题

(多选)甲、乙两质点在同一时刻、同一地点沿同一方向做直线运动。质点甲做初速度为零,加速度大小为$a_1$的匀加速直线运动。质点乙做初速度为$v_0$,加速度大小为$a_2$的匀减速直线运动至速度减为零保持静止。甲、乙两质点在运动过程中的$x-v$(位置速度)图象如图所示(虚线与对应的坐标轴垂直)。则
x-v图像例题1
A. 在$x-v$图象中,图线$a$表示质点甲的运动,质点乙的初速度$v_0=6 \ \mathrm{m/s}$
B. 质点乙的加速度大小$a_2=2 \ \mathrm{m/s^2}$
C. 质点甲的加速度大小$a_1=2 \ \mathrm{m/s^2}$
D. 图线$a$、$b$的交点表示两质点同时到达同一位置

题目来源:【甲、乙两质点在同一时刻、同一地点沿同一方向做直线运动.质点甲做初速度为零,加速度大小为a1的匀加速直线运动.质点乙做初速度为v0,加速度大小为a2的匀减速直线运动至速度减为零】作业帮

【解析】

这又是一个不按套路来的题目,我们习惯了看$x-t$图像以后看这个怎么看怎么不舒服,于是就容易做错。不过由于可以通过图像推导出一些常规结论,相比需要利用图形面积意义的题目还是要简单些。

A项,容易知两物体都是从$x=0$位置开始运动,由于乙有初速度,因此乙对应图线$b$,甲对应$a$。查起始位置处速度得知$v_{0}=6 \ \mathrm{m/s}$。
B项与C项,这样的图线应当如何计算加速度成为了一个问题。计算的困难来自于图形的关键点都只给了半边信息,有横坐标信息的关键点没给纵坐标,有纵坐标的没给横坐标,不过不要虚,要相信题是能做出来的,我们按部就班地来准备方程:
不妨关注共速的位置,假设二者共同速度为$v$:
对甲:
$$ v^2 = 2a_1x \tag{1}$$
对乙:
$$ v_0^2 – v^2 = 2a_2x \tag{2} $$
联立(1)式和(2)式,得到$a_1+a_2=3 \ \mathrm{m/s^2} \tag{*1}$
我们再取一个共位移的位置,此时$v_1=8 \ \mathrm{m/s}$,$v_2=2 \ \mathrm{m/s}$,假设二者位移都是$x$:
对甲:
$$ v_1^2 = 2a_1x \tag{3} $$
对乙:
$$ v_0^2 – v_2^2 = 2a_2x \tag{4} $$
联立(3)和(4),得到$a_1=2a_2 \tag{*2}$
到此为止,我们已经可以通过(*1)和(*2)得到答案为$a_1=2 \ \mathrm{m/s^2}, a_2=1 \ \mathrm{m/s^2}$。从而判断C正确,B错误。
对于D项,交点表示两物体的速度相同且位移相同的一个状态,但是不一定要同时达到,基于数据的分析也可以证明确实不是同时达到的。

我们可以发现,给半边条件也是有用的,因为有两个物体,每个物体列出一个式子,设一个未知数,就可以在两个式子间消元获得足够的信息了。

假设运动法

例题

研究人员测得飞机着陆后若不制动在平直跑道上滑行的总距离为$x$,所用的时间为$t$。考虑到飞机的滑行速度越小,所受的阻力越小,则飞机着陆时的速度应为
A. $v < \frac{x}{t}$
B. $\frac{x}{t} < v < \frac{2x}{t}$
C. $v = \frac{2x}{t}$
D. $v > \frac{2x}{t}$

题目来源:《高考小题练透 物理》(67高考,外研社)、【某同学欲估算飞机着陆时的速度,他假设飞机在平直跑道上做匀减速运动,飞机在跑道上滑行的距离为x,从着陆到停下来所用的时间为t,实际上,飞机的速度越大,所受的阻力越大,即加】作业帮

【解析】

由于阻力随滑行速度减小而减小,减速的加速度大小是在减小的,因此$v-t$图像看上去应该是下凸的,这就给我们估计$t=0$时的速度带来了麻烦,毕竟我们并不知道它和平均速度的关系。

为了解决这个问题,我们不妨假设一个在$t$时间内的匀减速运动,并把图像和题目中这个运动的图像做到一起,观察我们将得到什么。
运动图像3
这个匀减速运动的平均速度显然是$\frac{v}{2}$,而题目中这个运动的位移是小于匀减速运动的,因此平均速度也要小于匀减速的,即$\frac{x}{t} < \frac{v}{2}$,便推知了$v > \frac{2x}{t}$这一结论。

有的运动我们并不熟悉,也不好用已有的运动学手段甚至是数学手段来处理它的(图像)问题,我们可以利用与上面类似的“假设”思想发现新的突破口。

[HNOI2013]游走 题解

[HNOI2013]游走 题解

题目地址:洛谷:【P3232】[HNOI2013]游走 – 洛谷、BZOJ:P 

NOI2018游记

NOI2018游记

一年OI一场空,exCRT见祖宗 人生的第一次,也是最后一次的NOI,就这么结束了。 留下 

[ZJOI2007]时态同步 题解

[ZJOI2007]时态同步 题解

题目地址:洛谷:【P1131】[ZJOI2007]时态同步 – 洛谷、BZOJ:Problem 1060. — [ZJOI2007]时态同步

题目描述

小Q在电子工艺实习课上学习焊接电路板。一块电路板由若干个元件组成,我们不妨称之为节点,并将其用数字1,2,3….进行标号。电路板的各个节点由若干不相交的导线相连接,且对于电路板的任何两个节点,都存在且仅存在一条通路(通路指连接两个元件的导线序列)。
在电路板上存在一个特殊的元件称为“激发器”。当激发器工作后,产生一个激励电流,通过导线传向每一个它所连接的节点。而中间节点接收到激励电流后,得到信息,并将该激励电流传向与它连接并且尚未接收到激励电流的节点。最终,激烈电流将到达一些“终止节点”——接收激励电流之后不再转发的节点。
激励电流在导线上的传播是需要花费时间的,对于每条边e,激励电流通过它需要的时间为te,而节点接收到激励电流后的转发可以认为是在瞬间完成的。现在这块电路板要求每一个“终止节点”同时得到激励电路——即保持时态同步。由于当前的构造并不符合时态同步的要求,故需要通过改变连接线的构造。目前小Q有一个道具,使用一次该道具,可以使得激励电流通过某条连接导线的时间增加一个单位。请问小Q最少使用多少次道具才可使得所有的“终止节点”时态同步?

题意简述

有一棵$n$个点有边权的树,你可以每次给一条边边权+1,求最小的加边权次数,使得根到每个叶子的路径边权和相等。

输入输出格式

输入格式:
第一行包含一个正整数N,表示电路板中节点的个数。第二行包含一个整数S,为该电路板的激发器的编号。接下来N-1行,每行三个整数a , b , t。表示该条导线连接节点a与节点b,且激励电流通过这条导线需要t个单位时间。

输出格式:
仅包含一个整数V,为小Q最少使用的道具次数。

输入输出样例

输入样例#1:

3
1
1 2 1
1 3 3

输出样例#1:

2

说明

N ≤ 500000,te ≤ 1000000

题解

对于一个子树,我们求出根到叶子的路径和最大值,再把不满最大值的根的出边加满即可,可以证明,如此做得到的就是最优解。这是因为,如果叶子路径和都不同,不在这个子树根加成相同的话,就得在更深的位置加成相同的,操作的边数会大于子树根的出边数,显然不够优。
复杂度$O(n)$。

代码

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

#include <algorithm>
#include <vector>

typedef long long LL;

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 LL readint() {
    register LL res = 0, neg = 1; register char c = fgc();
    for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
    for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
    return res * neg;
}

inline char readsingle() {
    register char c;
    while(!isgraph(c = fgc())) {}
    return c;
}

const int MAXN = 500005;

int n, s;

struct Edge {
    int to, w;
};
std::vector<Edge> gra[MAXN];

int mx[MAXN]; LL ans;

void dfs(int u, int fa) {
    for(int i = 0; i < gra[u].size(); i++) {
        int v = gra[u][i].to;
        if(v == fa) continue;
        dfs(v, u);
        mx[u] = std::max(mx[u], mx[v] + gra[u][i].w);
    }
    for(int i = 0; i < gra[u].size(); i++) {
        int v = gra[u][i].to;
        if(v == fa) continue;
        ans += mx[u] - (mx[v] + gra[u][i].w);
    }
}

int main() {
    n = readint(); s = readint();
    for(int i = 1, u, v, w; i < n; i++) {
        u = readint(); v = readint(); w = readint();
        gra[u].push_back(Edge {v, w});
        gra[v].push_back(Edge {u, w});
    }
    dfs(s, 0);
    printf("%lld", ans);
    return 0;
}
[NOI2016]区间 题解

[NOI2016]区间 题解

题目地址:洛谷:【P1712】[NOI2016]区间 – 洛谷、BZOJ:Pr 

[HNOI2012]永无乡 题解

[HNOI2012]永无乡 题解

题目地址:洛谷:【P3224】[HNOI2012]永无乡 – 洛谷、BZOJ: 

[SDOI2011]消耗战 题解

[SDOI2011]消耗战 题解

题目地址:洛谷:【P2495】[SDOI2011]消耗战 – 洛谷、BZOJ:Problem 2286. — [Sdoi2011]消耗战

题目描述

在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他k个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到1号岛屿上)。不过侦查部门还发现了这台机器只能够使用m次,所以我们只需要把每次任务完成即可。

题意简述

给你一棵包含$n$个点的带边权的树,有$m$次询问,每次给你一个大小为$k_i$的点集,你可以花费边权代价切断树上的一些边,使得这个点集中的点与树根$1$不连通,求满足上述条件的最小切边代价。

输入输出格式

输入格式:
第一行一个整数n,代表岛屿数量。
接下来n-1行,每行三个整数u,v,w,代表u号岛屿和v号岛屿由一条代价为c的桥梁直接相连,保证1<=u,v<=n且1<=c<=100000。
第n+1行,一个整数m,代表敌方机器能使用的次数。
接下来m行,每行一个整数ki,代表第i次后,有ki个岛屿资源丰富,接下来k个整数h1,h2,…hk,表示资源丰富岛屿的编号。

输出格式:
输出有m行,分别代表每次任务的最小代价。

输入输出样例

输入样例#1:

10
1 5 13
1 9 6
2 1 19
2 4 8
2 3 91
5 6 8
7 5 4
7 8 31
10 7 9
3
2 10 6
4 5 7 8 3
3 9 4 6

输出样例#1:

12
32
22

说明

【数据规模和约定】
对于10%的数据,2<=n<=10,1<=m<=5,1<=ki<=n-1
对于20%的数据,2<=n<=100,1<=m<=100,1<=ki<=min(10,n-1)
对于40%的数据,2<=n<=1000,m>=1,sigma(ki)<=500000,1<=ki<=min(15,n-1)
对于100%的数据,2<=n<=250000,m>=1,sigma(ki)<=500000,1<=ki<=n-1

题解

如果只有一次询问,我们可以进行一次DFS处理出$mn[u]$代表$u$点到$1$点链上的最小边,显然,断开它是切断$u$和$1$连接的最优方案。我们用$dp[u]$表示切断$u$子树中所有点与$1$的连接的最小代价,则转移为
$$ dp[u] = \sum_{v \in \mathrm{son}(u)} \min \{ dp[v], mn[v] \} $$
这个转移表示要么切断$v$到$u$的这条边,要么切断其子树内的边。DP初值设置为对于每一个点集里的点,$dp[u]$初始为$mn[u]$,这样在DP求和的时候,如果一个父亲自己也是点集中的点,权值也会被计算进去。显然,如果两个点到$1$路径上的最优边是同一条,那么一定可以在这条最优边处向上转移时只计算一次权值,这是由于$\min$的存在。
然而这个算法是$O(n)$的,也就是说,总复杂度为$O(mn)$,并不能通过本题。
我们考虑建立虚树解决这个问题。虚树是指一棵只包含指定点即它们两两间LCA的辅助用树,这样做可以减少树上点的数量,降低DP的复杂度至$O(k_i \log k_i)$。
具体而言,如果我们处理出树的DFS序,那么对DFS序相邻的两点求LCA,一定可以得到所有点两两的LCA,这是由于,在不同子树内的点的LCA可以在处理到子树DFS序区间端点之间的LCA的时候被求出来。但是,LCA和儿子的边的关系并不明确,直接建边似乎是不明智的选择。我们考虑一种特殊的树的遍历序:欧拉序,它是指DFS遍历时,进入DFS栈的时候将该点加入序列,出栈时也加入一次。如果对于上面的所有点及其LCA的集合,分别插入出入栈点用欧拉序排序,就可以利用这一顺序来模拟DFS了,省去了建边的过程。
模拟DFS的时候,只需要在出栈的时候进行操作,这是因为,此时出栈点$u$子树的DP已经计算完毕,只需要去更新它父亲的DP值即可,而出栈后的栈顶元素就是它的父亲,直接按照上面的方程去转移即可。
使用欧拉序的虚树算法的复杂度是单次$O(n \log n)$的,达到这个复杂度的操作是查询LCA和排序。这里的$n$指的是虚树的节点数,它的规模是$O(k_i \log k_i)$的。
如此,总复杂度终于变得科学了不少。不过本题有点卡常,稍微卡一卡也可以卡进去。

代码

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

#include <algorithm>
#include <vector>

typedef long long LL;

inline LL min(LL a, LL b) {
    return a < b ? a : b;
}

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 LL readint() {
    register LL res = 0, neg = 1; register char c = fgc();
    for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
    for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
    return res * neg;
}

const int MAXN = 500005;

int n, m;

struct Edge {
    int to, w;
};

std::vector<Edge> gra[MAXN];

int anc[MAXN][20], mn[MAXN], dep[MAXN], dfn[MAXN], clk;

void dfs(int u, int fa) {
    dfn[u] = ++clk;
    for(int i = 0; i < gra[u].size(); i++) {
        int v = gra[u][i].to;
        if(v == fa) continue;
        anc[v][0] = u;
        dep[v] = dep[u] + 1;
        mn[v] = std::min(mn[u], gra[u][i].w);
        dfs(v, u);
    }
    dfn[u + n] = ++clk;
}

inline void calanc() {
    for(int i = 1; i <= 19; i++) {
        for(int j = 1; j <= n; j++) {
            anc[j][i] = anc[anc[j][i - 1]][i - 1];
        }
    }
}

inline int querylca(int u, int v) {
    if(dep[u] > dep[v]) std::swap(u, v);
    int del = dep[v] - dep[u];
    for(int i = 19; i >= 0; i--) {
        if(del & (1 << i)) v = anc[v][i];
    }
    if(u == v) return u;
    for(int i = 19; i >= 0; i--) {
        if(anc[u][i] != anc[v][i]) {
            u = anc[u][i];
            v = anc[v][i];
        }
    }
    return anc[u][0];
}

inline bool cmp(int a, int b) {
    return dfn[a] < dfn[b];
}

LL dp[MAXN];
bool vis[MAXN];

std::vector<int> vec;
int sta[MAXN], stop;

int main() {
    n = readint();
    for(int i = 1, u, v, w; i < n; i++) {
        u = readint(); v = readint(); w = readint();
        gra[u].push_back(Edge {v, w});
        gra[v].push_back(Edge {u, w});
    }
    mn[1] = 1e9;
    dfs(1, 0);
    calanc();
    m = readint();
    while(m--) {
        vec.clear();
        int k = readint();
        for(int i = 1; i <= k; i++) {
            int t = readint();
            vis[t] = true; dp[t] = mn[t]; vec.push_back(t);
        }
        std::sort(vec.begin(), vec.end(), cmp);
        for(int i = 1; i < k; i++) {
            int l = querylca(vec[i - 1], vec[i]);
            if(!vis[l]) {
                vis[l] = true;
                vec.push_back(l);
            }
        }
        if(!vis[1]) vec.push_back(1);
        for(int i = 0; vec[i] <= n; i++) {
            vec.push_back(vec[i] + n);
        }
        std::sort(vec.begin(), vec.end(), cmp);
        for(int i = 0; i < vec.size(); i++) {
            if(vec[i] <= n) {
                sta[stop++] = vec[i];
            } else {
                int u = sta[--stop];
                if(u != 1) {
                    int fa = sta[stop - 1]; dp[fa] += min(mn[u], dp[u]);
                } else {
                    printf("%lld\n", dp[u]);
                }
                dp[u] = 0; vis[u] = false;
            }
        }
    }
    return 0;
}
[TJOI2015]弦论 题解

[TJOI2015]弦论 题解

题目地址:洛谷:【P3975】[TJOI2015]弦论 – 洛谷、BZOJ:P