日常训练 20170606 极地旅行社

本文介绍了一款用于管理旅行社大桥建造过程的程序设计,该程序能够处理桥梁建设、企鹅数量变化及旅游团行程等命令,通过并查集和树剖算法实现了高效的资源管理和路径计算。

题目描述

不久之前,Mirko建立了一个旅行社,名叫“极地之梦”。这家旅行社在北极附近购买了 N 座冰岛,并且提供观光服务。当地最受欢迎的当然是帝企鹅了,这些小家伙经常成群结队的游走在各个冰岛之间。

Mirko的旅行社遭受一次重大打击,以至于观光游轮已经不划算了。旅行社将在冰岛之间建造大桥,并用观光巴士来运载游客。Mirko希望开发一个电脑程序来管理这些大桥的建造过程,以免有不可预料的错误发生。

这些冰岛从 1N 标号。一开始时这些岛屿没有大桥连接,并且所有岛上的帝企鹅数量都是知道的。每座岛上的企鹅数量虽然会有所改变,但是始终在 [0,1000] 之间。

你的程序需要处理以下三种命令:

bridge A B :在 A 与 B 之间建立一座大桥(A 与 B 是不同的岛屿)。由于经费限制,这项命令被接受,当且仅当 A 与 B 不联通。若这项命令被接受,你的程序需要输出yes,之后会建造这座大桥。否则,你的程序需要输出no。

penguins A X:根据可靠消息,岛屿 A此时的帝企鹅数量变为 X。这项命令只是用来提供信息的,你的程序不需要回应。

excursion A B:一个旅行团希望从 A 出发到 B。若 A 与 B 连通,你的程序需要输出这个旅行团一路上所能看到的帝企鹅数量(包括起点 A 与终点 B ),若不联通,你的程序需要输出impossible。

输入格式

第一行一个正整数 N ,表示冰岛的数量。

第二行 N 个范围 [0,1000] 的整数,为每座岛屿初始的帝企鹅数量。

第三行一个正整数 M,表示命令的数量。

接下来 M 行即命令,为题目描述所示。

输出格式

对于每个bridge命令与excursion命令,输出一行,为题目描述所示。

一开始以为是LCT,然而我太弱以至于根本不会LCT,DJY提醒我只要树剖就可以了,强行被报标算,不A都对不起良心了。对于bridge只要用并查集判断即可,对于excursion在第一遍并查集的时候顺便记一下要不要输 impossible,然后把森林连到虚点上变成一棵树,建出树后树剖一下,只要维护一下区间和即可。

#include<bits/stdc++.h>
const int N = 3e4 + 10;
const int M = 1e5 + 10;
template <typename T> void read(T &x) {
    x = 0; char c = getchar();
    for (; !isdigit(c); c = getchar());
    for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
}
int n, m, a[N], f[N], first[N], s;
char op[10];
struct edge{
    int y, next;
}mp[N * 4];
void ins(int x, int y) {
    mp[++s] = (edge) {y, first[x]}; first[x] = s;
    mp[++s] = (edge) {x, first[y]}; first[y] = s;
}
int find(int x) {
    if (f[x] == x) return x;
    return f[x] = find(f[x]);
}
namespace force {
    int x, y;
    void bridge(int x, int y) {
        int f1 = find(x);
        int f2 = find(y);
        if (f1 == f2) {printf("no\n"); return;}
        printf("yes\n");
        f[f1] = f2;
        ins(x, y);
    }
    bool dfs(int x, int y, int sum, int last) {
        if (x == y) {printf("%d\n", sum); return 1;}
        for (int t=first[x]; t; t=mp[t].next)
            if (mp[t].y != last && dfs(mp[t].y, y, sum + a[mp[t].y], x))
                return 1;
        return 0;
    }
    int main() {
        read(n);
        for (int i=1; i <= n; i++)
            read(a[i]), f[i] = i;
        read(m);
        while (m--) {
            scanf("%s", op);
            read(x); read(y);
            if (op[0] == 'b') bridge(x, y);
            if (op[0] == 'p') a[x] = y;
            if (op[0] == 'e') if (!dfs(x, y, a[x], -1)) printf("impossible\n");
        }
        return 0;
    }
}
namespace try_it {
    int x[M], y[M];
    char opt[M];
    int fa[N][20], size[N], top[N], dep[N], pos[N], cnt;
    int lc[N * 4], rc[N * 4], sum[N * 4], node;
    bool z[M], vis[N];
    bool bridge(int x, int y) {
        int f1 = find(x);
        int f2 = find(y);
        if (f1 == f2) return 0;
        f[f1] = f2; ins(x, y);
        return 1;
    }
    void dfs1(int x) {
        vis[x] = 1;
        for (int t=first[x]; t; t=mp[t].next)
            if (!vis[mp[t].y]) dfs1(mp[t].y);
    }
    int dfs2(int x) {
        for (int i=1; dep[x] - (1 << i) >= 0; i++)
            fa[x][i] = fa[fa[x][i - 1]][i - 1];
        size[x] = 1;
        for (int t=first[x]; t; t=mp[t].next)
            if (mp[t].y != fa[x][0])
                fa[mp[t].y][0] = x,
                dep[mp[t].y] = dep[x] + 1,
                size[x] += dfs2(mp[t].y);
        return size[x];
    }
    void dfs3(int x, int cap) {
        top[x] = cap;
        pos[x] = ++cnt;
        int mxszi = 0;
        for (int t=first[x]; t; t=mp[t].next)
            if (mp[t].y != fa[x][0] && size[mp[t].y] > size[mxszi])
                mxszi = mp[t].y;
        if (!mxszi) return;
        dfs3(mxszi, cap);
        for (int t=first[x]; t; t=mp[t].next)
            if (mp[t].y != fa[x][0] && mp[t].y != mxszi)
                dfs3(mp[t].y, mp[t].y);
    }
    void build(int i, int l, int r) {
        if (l == r) return;
        lc[i] = ++node; build(lc[i], l, (l + r) / 2);
        rc[i] = ++node; build(rc[i], (l + r) / 2 + 1, r);
    }
    void chg(int i, int l, int r, int x, int c) {
        if (l == r) {sum[i] = c; return;}
        if (x <= (l + r) / 2)
            chg(lc[i], l, (l + r) / 2, x, c);
        else
            chg(rc[i], (l + r) / 2 + 1, r, x, c);
        sum[i] = sum[lc[i]] + sum[rc[i]];
    }
    int lca(int x, int y) {
        if (dep[x] < dep[y]) std::swap(x, y);
        for (int i=19; i >= 0; i--)
            if (dep[x] - (1 << i) >= dep[y])
                x = fa[x][i];
        for (int i=19; i >= 0; i--)
            if (fa[x][i] != fa[y][i])
                x = fa[x][i],
                y = fa[y][i];
        if (x == y) return x;
        return fa[x][0];
    }
    int qry(int i, int l, int r, int _l, int _r) {
        if (l > _r || r < _l) return 0;
        if (l >= _l && r <= _r) return sum[i];
        return qry(lc[i], l, (l + r) / 2, _l, _r) + qry(rc[i], (l + r) / 2 + 1, r, _l, _r);
    }
    int qry(int x, int y) {
        int l = lca(x, y), ret = - a[l];
        while (dep[top[x]] > dep[l]) ret += qry(1, 1, cnt, pos[top[x]], pos[x]), x = fa[top[x]][0];
        ret += qry(1, 1, cnt, pos[l], pos[x]);
        while (dep[top[y]] > dep[l]) ret += qry(1, 1, cnt, pos[top[y]], pos[y]), y = fa[top[y]][0];
        ret += qry(1, 1, cnt, pos[l], pos[y]);
        return ret;
    }
    int main() {
        read(n);
        for (int i=1; i <= n; i++)
            read(a[i]), f[i] = i;
        read(m);
        for (int i=1; i <= m; i++) {
            scanf("%s", op);
            opt[i] = op[0];
            read(x[i]); read(y[i]);
            if (opt[i] == 'b') z[i] = bridge(x[i], y[i]);
            if (opt[i] == 'e') z[i] = find(x[i]) == find(y[i]);
        }
        for (int i=1; i <= n; i++)
            if (!vis[i]) dfs1(i), ins(n + 1, i);
        dfs2(n + 1);
        dfs3(n + 1, n + 1);
        node = 1; build(1, 1, cnt);
        for (int i=1; i <= n; i++) chg(1, 1, cnt, pos[i], a[i]);
        for (int i=1; i <= m; i++) {
            if (opt[i] == 'b') if (z[i]) printf("yes\n"); else printf("no\n"); else;
            if (opt[i] == 'p') chg(1, 1, cnt, pos[x[i]], y[i]), a[x[i]] = y[i];
            if (opt[i] == 'e') if (z[i]) printf("%d\n", qry(x[i], y[i])); 
                                    else printf("impossible\n"); else;
        }
        return 0;
    }
}
int main() {
    //force::main();
    try_it::main();
    return 0;
}
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 HFSS,其全称为High Frequency Structure Simulator,是由Ansys公司研发的一款高级三维电磁场仿真软件,主要应用于射频、微波以及光学领域内的设计工作与性能分析。当前压缩包内提供的是一个基于HFSS软件构建的偶极子天线模型,并包含了该模型的仿真数据,我们将对这一模型及其关联的学术知识进行细致的探讨。偶极子天线属于天线设计中最基础的类型之一,其结构由两个大小相等布局对称的导体单元构成,整体形状类似于汉字“工”。在2.4GHz的频率条件下,此类天线被广泛部署于Wi-Fi、蓝牙等无线通信系统的构建中。HFSS软件能够对偶极子天线的电气特性进行高精度模拟,涵盖辐射模式、增益水平、方向图形态、输入阻抗以及S参数等多个核心指标。 S参数(即Scattering Parameters),是用于评估天线或微波器件输入端与输出端之间相互影响程度的关键参数。S参数详细刻画了信号流经网络设备时的反射与传输状态,其中S11(输入反射系数)和S21(传输系数)是最为常用的两种表征方式。借助HFSS软件执行S参数仿真,可以获取天线在多种频率下的反射与传输特性表,从而协助设计人员对天线的阻抗匹配程度和运行效率进行有效评估。在此模型中,S参数仿真工作业已完成,因此我们可以直接审视2.4GHz频率下的阻抗匹配状况,以验证天线在该工作频段内能否展出理想的性能。 在"Project1_1.aedt"与"Project1.aedt"这两个提供的文件中,储存了HFSS项目的完整信息。这些文件内含了天线的几何构造细节、材料物理属性、边界约束条件、求解器配置参数以及仿真获取的结果...
打开链接下载源码: https://pan.quark.cn/s/a4b39357ea24 在鸿蒙OS(HarmonyOS)的系统构建过程中,SQLite扮演着关键的角色,它作为一个轻量级的数据管理工具,为各类应用程序提供本地化数据存储的支持。本实例将详细剖析如何在鸿蒙OS平台上运用SQLite进行数据管理操作。 SQLite作为一个开源的、自给自足的、无需运行服务的、支持事务的SQL数据库管理系统,非常适合于嵌入式系统以及移动设备的应用。在鸿蒙OS系统中,SQLite作为数据持久化的关键技术,能够协助开发人员储存和处理应用中的结构化信息。接下来我们将具体研究以下几个核心要点: 1. **SQLite API与鸿蒙OS的融合**: 鸿蒙OS系统提供了与SQLite进行交互的API接口,开发者可以利用这些接口来建立数据库、设计数据表,执行SQL指令,以及进行数据的读取和入。在将SQLite集成到系统中时,开发者需要明确如何在HarmonyOS项目中导入SQLite库,并精确配置相关依赖。 2. **数据库的建立**: 在鸿蒙OS应用程序中,首要任务是创建一个SQLite数据库。这一步骤通常在应用启动阶段完成,通过调用`sqlite3_open()`函数来指定数据库文件的存储路径。 3. **数据表的构建**: 数据表的建立是通过执行SQL的`CREATE TABLE`指令来实的。例如,为了创建一个用户数据表,可以编如下的SQL指令: ``` CREATE TABLE Users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER); ``` 4. **数据的添加**: 使用`sqlite3_exec()`函数来执行SQ...
内容概要:本文围绕“考虑N-1故障集的电力系统安全约束经济调度(SCED)”展开研究,提出了一种在N-1故障条件下保障电力系统安全运行的经济调度模型。通过构建包含线路、发电机等关键元件故障场景的安全约束优化模型,综合考虑系统潮流约束、机组出力范围、备用容量需求及支路传输能力等多重技术约束,采用Matlab平台实高效的优化求解算法,实了系统运行经济性与安全性的协调统一。文中详细阐述了模型的构建逻辑、约束条件的数学表达、求解流程的设计,并通过标准算例系统进行了仿真验证,结果表明所提方法能够在确保电网在单一元件故障下仍满足安全运行要求的同时,有效降低系统总体运行成本,具有良好的工程应用前景。; 适合人群:具备电力系统分析与优化理论基础,从事电力系统调度、运行规划、安全评估等相关领域的科研人员、工程技术人员及高校研究生,尤其适用于关注电力系统可靠性与经济性协同优化的专业人士。; 使用场景及目标:①应用于电力系统日常运行中的安全约束经济调度计算,实预防性安全校核;②为电网调度机构提供应对N-1故障的决策支持工具,辅助制定预防控制策略;③作为高等院校和研究机构在电力系统优化、安全分析等课程中的教学案例或科研参考; 阅读建议:建议读者结合提供的Matlab代码深入理解模型的具体实过程,重点掌握安全约束的建模技巧与优化求解器的配置方法,可通过修改系统参数或扩展至N-k故障场景以进一步探究模型的鲁棒性与适用边界。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值