SDUT 2023 summer team contest(for 22) - 5

news2024/11/17 21:36:07

K - City

题意:n城市之间连接无方向的道路,每个道路都有能量,敌人发动攻击,来摧毁这些道路,如果敌人发动x的攻击,则所有能力小于等于x的道路都将被摧毁,问有有多少城市可以到达对方

思路:这题一开始看到连通性就想到了并查集,但是并查集只能加边啊,并不能减边,不但知道该怎么想了,后来听了同学的想法,非常nice,他问的不是连通块中的元素个数,而是对数,如果一个连通块得大小为你n,那么对答案贡献就为Cn2,就是n*(n-1)/2,那么我们知道了连通块的大小也就知道了答案,还有就是如果每次询问都重新找连通块时间复杂度比较高并且并查集不支持删边操作,可以离线操作,把询问排序,把删边改成加边,答案直接在上一次的基础上更新。类似于最小生成树的方式慢慢增加路径。

我们知道将边权和攻击从大到小排序后,我们进行询问由于我们从将攻击力降序,那么现在还存在的边就很少了,而继续下去攻击力变小,边的存在就会越来越多,故转变为加边,操作每次的答案都在上一次更新

#include <bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e6 + 10, M = 1 << 10, inf = 0x3f3f3f3f, mod = 998244353;
int n, m, q;
int p[N];
int siz[N];
int ans[N];
struct node // 所有边由大到小排序
{
    int x, y, w;
    bool operator<(const node &W) const
    {
        return w > W.w;
    }
} rode[N];
struct query // 询问操作从大到小排序
{
    int id, val;
    bool operator<(const query &VAL) const
    {
        return val > VAL.val;
    }
} query[N];
int find(int x)
{
    if (x != p[x])
        p[x] = find(p[x]);
    return p[x];
}
void solve()
{
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++)
    {
        p[i] = i;
        siz[i] = 1;
    }
    for (int i = 0; i < m; i++)
    {
        int u, v, w;
        cin >> u >> v >> w;
        rode[i] = {u, v, w};
    }
    for (int i = 0; i < q; i++)
    {
        int x;
        cin >> x;
        query[i] = {i, x};
    }
    int j = 0;
    int sum = 0; // 由于伤害越高,联通的越少,
    // 故sum有种递推的关系
    // 对于那些伤害小的就不需要再重复去算前面得那些了
    sort(rode, rode + m);
    sort(query, query + q);
    for (int i = 0; i < q; i++)
    {
        int val = query[i].val;
        while (rode[j].w >= val && j < m) // 如果大的伤害都没有将其毁坏,那么小的伤害一定不肯能
        {
            int x = rode[j].x, y = rode[j].y;
            int a = find(x), b = find(y);
            if (a != b)
            {
                sum += siz[a] * siz[b];
                p[a] = b;
                siz[b] += siz[a];
            }
            j++;
        }
        ans[query[i].id] = sum;
    }
    for (int i = 0; i < q; i++)
        cout << ans[i] << endl;
}
signed main()
{
    Ysanqian;
    int T;
    // T=1;
    cin >> T;
    while (T--)
        solve();
}

D - Lowbit

题意:给你n个数,m次操作。
操作1:给[ l , r ]之间的数加上一个自身的lowbit(二进制下的最低位)(不明白可以去百度一下)
操作2:查询l,r区间和。

思路:很明显这是一个线段树,但是我们需要维护些什么呢,一就是区间和,再就是根据这个lowbit的性质,如果一个数为偶数,那么它的lowbit就是他本身,奇数就是将二进制最右边的一向左移动一位,那么如果一个区间全部为2的倍数,他进行lowbit运算就是变为的二倍,反之据题目中a[i]的范围可以知道一个数最多只能进行15次第二种情况的操作一定可以变成偶数,故我们对于非偶数就单点修改,由此得到了有一个需要维护的东西那就是否区间全部为二的倍数的标记

#include <bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 2e5 + 10, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int w[N], n, m;
int qpow(int a, int b, int mod)
{
    int res = 1;
    while (b)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
int lowbit(int x) // 返回二进制对后一个1为几,我们发现,对于二的倍数,返回原值,否则会使其二进制最后一个1向左移动一位
{
    return x & -x;
}
struct node
{
    int l, r, sum, lazy;
    bool bit;
} tr[N << 2];
void change(int u, int k)
{
    int mul = qpow(2, k, mod);
    tr[u].sum = (tr[u].sum * mul) % mod;
    tr[u].lazy = (tr[u].lazy + k) % mod;
}
void pushdown(int u) // 当用到下区间的时候,下区间依靠懒标记来更新数据,也就是一个区间和
{                    //由于在不是二的倍数的时候我们单点修改并进行pushup,所以只有都为二的
    if (tr[u].lazy)   //倍数时pushdown才有用,故不会影响bit标记
    {
        change(u << 1, tr[u].lazy);
        change(u << 1 | 1, tr[u].lazy);
        tr[u].lazy = 0;
    }
}
void pushup(node &u, node &l, node &r)//修改之后,对于上去间的影响就是区间和,和bit标记
{
    u.sum = ((l.sum + r.sum) % mod + mod) % mod;
    u.bit = l.bit && r.bit;
}
void pushup(int u)
{
    pushup(tr[u], tr[u << 1], tr[u << 1 | 1]);
}
void build(int u, int l, int r)
{
    tr[u].l = l, tr[u].r = r;
    tr[u].bit = 0, tr[u].lazy = 0, tr[u].sum = 0; // 不是不初始化就为0吗,找了3个小时。。。。。可恶
    if (l == r)
    {
        tr[u].sum = w[l];
        if (tr[u].sum == lowbit(tr[u].sum)) // 如果该数为二的倍数
            tr[u].bit = 1;
        return;
    }
    int mid = l + r >> 1;
    build(u << 1, l, mid);
    build(u << 1 | 1, mid + 1, r);
    pushup(u);
}
void modify(int u, int l, int r)
{
    if (tr[u].l >= l && tr[u].r <= r && tr[u].bit)
    {
        change(u, 1); // 是二的倍数加上本身,就是扩大二倍即可
        return;
    }
    if (tr[u].l == tr[u].r) // 如果不是二的倍数我们直接单点修改即可
    {
        tr[u].sum += lowbit(tr[u].sum);
        if (tr[u].sum == lowbit(tr[u].sum))
            tr[u].bit = true;
        return;
    }
    pushdown(u); // 既然区间修改了记得pushdown
    int mid = tr[u].l + tr[u].r >> 1;
    if (l <= mid)
        modify(u << 1, l, r);
    if (r > mid)
        modify(u << 1 | 1, l, r);
    pushup(u);
}
node query(int u, int l, int r)
{
    if (tr[u].l >= l && tr[u].r <= r)
        return tr[u];
    pushdown(u); // 起作用就是我们打的懒标记并未进行计算,但我们还要继续向下遍历寻找,
                 // 那我们这时才用懒标记跟新区间,就是只有被询问倒是才跟新,节省时间吗
    int mid = tr[u].l + tr[u].r >> 1;
    if (r <= mid) // 在左
        return query(u << 1, l, r);
    else if (l > mid) // 在右
        return query(u << 1 | 1, l, r);
    else // 在中间
    {
        node res;
        auto left = query(u << 1, l, r), right = query(u << 1 | 1, l, r);
        pushup(res, left, right);
        return res;
    }
}
void solve()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> w[i];
    build(1, 1, n);
    cin >> m;
    for (int i = 1; i <= m; i++)
    {
        int op, l, r;
        cin >> op >> l >> r;
        if (op == 1)
            modify(1, l, r);
        else if (op == 2)
            cout << (int)(query(1, l, r).sum % mod + mod) % mod << endl;
    }
}
signed main()
{
    Ysanqian;
    int T;
    // T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

A - Matrix

题意::给你一个n * n 的矩阵填充了[1 , n^{_{_{2}}}] 的数,每一行都会贡献一个最小值ai,S = {a1,a2,…,an} ∩ {1,2,…,n} 求ΣS

一行的最小值是1~n中的数时,才对答案有贡献。

大致题意:给你一个n * n 的矩阵填充了[1 , n2] 的数,每一行都会贡献一个最小值ai,S = {a1,a2,…,an} ∩ {1,2,…,n} 求ΣS

一行的最小值是1~n中的数时,才对答案有贡献。
首先从1~n枚举一行的最小值 记为i
这一行剩余n-1个数都要比i大,所以有C(n * n - i ,n-1)种选法
然后把这一行的n个数全排列 n!
剩余的n * n - n个数填到剩下的n-1行中,随意排列 共(n * n - n)!种排法
把之前带有i的那一行插进去,组成n行 共n种方法

然后这个排法保证最小值 i 对答案有贡献 即+1
所以有多少排法 答案就加多少

对于每一个 i ,排法有: C(n * n - i ,n-1)* n! * (n * n - n)!* n

#include <bits/stdc++.h>
using namespace std;
#define pi acos(-1)
#define lowbit(x) x & (-x)
#define X first
#define Y second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair<int, int> PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 25000010, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int f[N];
int n;
int qpow(int a, int b, int mod)
{
    int res = 1;
    while(b)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}
int C(int n, int m)
{
    int ans = 1;
    ans = ans * f[n] % mod;
    ans = ans * qpow(f[m], mod - 2, mod)%mod;
    ans = ans * qpow(f[n - m], mod - 2, mod)%mod;
    return ans;
}
void init()
{
    f[0] = 1;
    f[1] = 1;
    for (int i = 2; i <= N; i++)
        f[i] = f[i - 1] * i % mod;
}
void solve()
{
    int ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int  now = C(n * n - i, n - 1) * f[n] % mod * f[n * n - n] % mod * n % mod; 
        ans = (ans + now) % mod;
    }
    cout<<(int)ans<<endl;
}
signed main()
{
    Ysanqian;
    int T;
    init();
    // T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/791897.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVA面试总结-Redis篇章(六)——数据过期策略

Java面试总结-Redis篇章&#xff08;六&#xff09;——数据过期策略 Redis数据删除策略——惰性删除Redis数据删除策略——定期删除 Redis数据删除策略——惰性删除 Redis数据删除策略——定期删除

三、函数-3.数值函数

一、常见函数 二、示例 -- 向上取整 2 select ceil(1.5); select ceil(1.1);-- 向下取整 1 select floor(1.2); select floor(1.9);-- 返回x/y的模&#xff08;取余&#xff09; select mod(3, 4); /* 3 */ select mod(7, 4); /* 3 */ select mod(5, 4); /* 1…

NestJS 的 提供者 学习

提供者的基本概念 在 NestJs 中有一个提供者的概念&#xff0c;提供者可以是服务、缓存、工厂、数据库连接等。 提供者的主要思想就是它可以作为依赖注入项注入到需要使用的地方&#xff0c;这样我们就可以根据业务需求和自己的想法来组建业务功能组件从而让开发的灵活性大大…

【Winform学习笔记(四)】ComboBox获取电脑串口信息

ComboBox获取电脑串口信息 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 ComboBox 下拉框控件获取电脑串口信息。 正文 1、实现方法 在窗体添加一个 ComboBox 下拉框控件&#xff1b;通过 IO.Ports.SerialPort 获取串口信息…

【前端实习评审】对小说详情模块更新的后端接口压力流程进行了人群优化

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推推”第一期书籍详情模块 前端同学的开发文档周最佳作品。该同学来自安徽科技学院土木工程专业。本项目亮点难点&#xff1a; 1.热门书籍在更新点的访问压力&#xff1b; 2.书籍更新通知的及时性和有效性&#xf…

解决了项目中几个比较搞心态的bug

1、keep-alive 正常keep-alive的使用便可以做项目的缓存&#xff0c;但是我们的项目很不正常 项目是属于动态缓存&#xff0c;动态缓存有一个弊端 举个栗子&#xff1a; a组件为设置了需要缓存的页面&#xff1b; b组件为设置了需要缓存的页面&#xff1b; c组件为设置了不需…

讲解 @ServletComponentScan注解

目录: 1、用法介绍2、实例讲解 1、介绍 在SpringBoot项目启动器中添加ServletComponentScan注解后&#xff0c;SpringBoot在启动时会扫描并注册所有带有WebServlet&#xff08;控制器&#xff09;、WebFilter&#xff08;过滤器&#xff09;、WebListener&#xff08;监听器&a…

自定义字体服务 - 基于Node的Web字体解决方案

自定义字体服务 - 基于Node的Web字体解决方案 背景技术选型font-face介绍实现方案&#xff08;介绍字体设计、转换、兼容性处理等技术实现细节。&#xff09;接口实现方式&#xff08;实现中遇到的问题和解决方案&#xff09;总结开源地址参考 背景 在前端开发中&#xff0c…

MySQL中LEFT JOIN的用法

原理 LEFT JOIN 关键字返回左表&#xff08;table1&#xff09;中的所有记录&#xff0c;以及右表&#xff08;table2&#xff09;中的匹配记录&#xff08;如果有&#xff09; 注意&#xff1a; LEFT JOIN 关键字返回左表&#xff08;Customers&#xff09;中的所有记录&…

家具小程序搭建攻略

要想快速搭建一个家具小程序商城&#xff0c;乔拓云平台是一个非常方便的选择。下面就来详细介绍一下制作的具体步骤。 首先&#xff0c;登录乔拓云平台&#xff0c;进入后台管理页面。在页面上找到【商城】选项&#xff0c;点击【去管理】进入后台管理页面。 在后台管理页面中…

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析&#xff1a;利用层序遍历&#xff0c;然后用num记录节点数量。其他的例如…

lama cleaner

这里写自定义目录标题 安装参数包含的额外plugins 安装 conda create --name lamacleaner python3.10 pip install -r requirements.txt pip install gfpgan pip install realesrgan pip install rembg pip install .如果安装本package报错&#xff0c;可以尝试改&#xff1…

【2023】Nacos下载与安装配置(2.2.3版本示例)

1、Nacos概述 1.1 什么是Nacos Nacos 是阿里巴巴推出来的一个新开源项目&#xff0c;这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服…

AndroidStudio Memory profiler(内存分析器)

1.Record Java/Kotlin allocations 查看java 层中对象的调用栈和短时间内创建对象的次数。可用于内存抖动快速分析,可用快速查找到该对象的调用栈(等同于mat) 从上图可见&#xff0c;短时间内创建了23个char[] 数组&#xff0c;其中最大的char[] 占用20k, 查看cll stack 调用…

前端将css.html.js打包到一起打开

过程我是按照下面的执行的&#xff0c;大家可以直接参考这个博客里的过程&#xff0c;下面我记录一下遇到的一些问题&#xff0c;我的电脑是mac 打包教程 1.执行命令npm install electron 在安装Electron时报错command sh -c node install.js 在指令后面添加 --ignore-scripts…

火山引擎DataLeap如何解决SLA治理难题(二):申报签署流程与复盘详解

申报签署流程详解 火山引擎DataLeap SLA保障的前提是先达成SLA协议。在SLA保障平台中&#xff0c;以 申报单签署的形式达成SLA协议。平台核心特点是 优化了SLA达成的流程&#xff0c;先通过 “系统卡点计算”减少待签署任务的数量&#xff0c;再通过 “SLA推荐计算”自动签署部…

No module named ‘_bz2‘

【问题】 mmlab使用custom_imports加载失败&#xff0c;调试到里面去发现import时引发error&#xff1a; ModuleNotFoundError: No module named ‘_bz2’ 【解决】 参考https://stackoverflow.com/questions/50335503/no-module-named-bz2-in-python3靠后的回答。 下载文件…

Vue学习Day2——指令补充

一、指令修饰符 1、什么是指令修饰符&#xff1f; ​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 2、按键修饰符 keyup.enter —>当点击enter键的时候才触发 代码演示&#xff1a; <!DOCTYPE html> <html…

大模型开发(十三):Function calling调用外部工具API,实现实时天气查询

全文共1.2w余字&#xff0c;预计阅读时间约34~50分钟 | 满满干货(附代码案例)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;完整构建一个借助Function calling功能调用外部工具API的开发流程&#xff0c;实现天气信息的实时查询 本文代码切换使用gpt3.5和gpt4接口&a…

【雕爷学编程】Arduino动手做(88)---水流量传感器模块3

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…