Codeforces #446 (Div. 2) 题解

本文解析了五道涉及数据结构、算法及图论等领域的编程题,包括利用优先队列解决的问题、差分数组的应用、求解最小步数问题、排列变换及生成树的离线并查集维护等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


A Greed 

注意long long

#include <bits/stdc++.h>
using namespace std;

const int maxn = 100005 ;
typedef long long ll ;
ll a[maxn] ;
ll b[maxn] ;

int main(){
    int n ;
    while(~ scanf("%d" , &n) ){
    priority_queue<ll> pq ;
    while(!pq.empty()) pq.pop() ;

    ll suma = 0 , p = 0 , q = 0 ;
    for(int i = 0 ; i < n ; i ++ ){
        scanf("%lld" , &a[i]) ;
        suma += a[i] ;

    }
    for(int i = 0 ; i < n ; i ++ ){
        scanf("%lld" , &b[i]) ;
        pq.push(b[i]) ;
    }
    p = pq.top() ;pq.pop() ;
    q = pq.top() ;

    if(p + q >= suma) puts("YES") ;
    else puts("NO") ;
    }
    return 0 ;
}

B  Wrath

用差分数组维护即可
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 5 ;
typedef long long ll ;

int pre[maxn] ;

int main(){
    int n , a ;
    scanf("%d" , &n) ;
        memset(pre , 0 , sizeof(pre)) ;
        scanf("%d" , &a) ;
        for(int i = 2 ; i <= n ; i ++ ){

            scanf("%d" , &a) ;
            a = min(a , i - 1) ;
            pre[ i - a ] ++ ;
            pre[i] -- ;
        }
        int temp = 0 ;
        int ans = 0 ;

        for(int i = 1 ; i <= n ; i ++ ){
            temp += pre[i] ;
            if(temp > 0) ans ++ ;
        }
        printf("%d\n" , n - ans) ;

    return 0 ;
}

C  Pride 

暴力出gcd到1的最少层数,其他非1的数均可由1一步到达
注意开始时就有1的情况,记录开始时1的个数

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2005 ;
typedef long long ll ;
const int inf = 1e9 + 7 ;


int gcd(int m,int n){
    if(m==0) return n;
    if(n==0) return m;
    if(m%2==0&&n%2==0) return 2*gcd(m/2,n/2);
    else if(m%2==0) return gcd(m/2,n);
    else if(n%2==0) return gcd(m,n/2);
    else
        return gcd(min(m,n),fabs(m-n));
}

int a[maxn] ;
int d[maxn] ;
int main(){
    int n ;
    while(~ scanf("%d" , &n) ){
        for(int i = 1 ; i <= n ; i ++ ){
            scanf("%d" , &a[i]) ;
        }
        for(int i = 1 ; i <= n ; i ++ ){
            d[i] = inf ;
            int x = a[i] ;
            if(a[i] == 1)
                d[i] = i ;
            for(int j = i + 1 ; j < n + 1 ; j ++ ){
                x = gcd(x , a[j]) ;
                if(x == 1){
                    d[i] = j ;
                    break ;
                }
            }
        }

        if(d[1] == inf){
            puts("-1") ;

        }else{
            int s , m = inf ;
            int n1 = 0 ;
            for(int i = 1 ; i < n + 1 ; i ++ ){
                if(a[i] != 1)
                    n1 ++ ;
                if(d[i] - i < m ){
                    s = i ;
                    m = d[i] - i ;
                }
            }
            if(d[s] == s){
                printf("%d\n" , n1) ;
            }else{
                printf("%d\n" , d[s] - s + n1 - 1) ;
            }

        }
    }
    return 0 ;
}


D  Gluttony

思考,任意子区间和不相同,且原数列每一个数都不相同,所以只需将原来大小的排列顺序下移一位或上移一位即可

#include <bits/stdc++.h>
using namespace std ;

const int maxn = 105 ;

typedef pair<int , int> p2 ;
p2 a[maxn] ;
int ans[maxn] ;
int main(){
    int n , b ;
    scanf("%d" , &n) ;
    for(int i = 0 ; i < n ; i ++ ){
        scanf("%d" , &b) ;
        a[i] = make_pair(b , i) ;
    }
    sort(a , a + n) ;
    for(int i = 0 ; i < n - 1 ; i ++ ){
        ans[ a[i].second ] = a[i + 1].first ;
    }
    ans[ a[n - 1].second ] = a[0].first ;
    for(int i = 0 ; i < n; i ++ ){
        printf("%d " , ans[i]) ;
    }
    return 0 ;
}



E   Envy


生成树的询问问题,用离线并查集维护

由kruscal ,边按权值排列,我们按照权值分层,即权值相同的边为同一层。


注意:上一层的生成树无论怎么构成,都不影响下一层的生成树构成。


将所有的询问分层,如果某一询问中包含权值为w的边,即在map<int , vector<int> > 中插入该询问的id,同时记录询问的所有边。(也是按照权值分别存边, 即用map<int , vector<int> >  a[maxn], 在后面的每一层只询问权值为该层的边)

离线后,然后从最底层开始(即权值最小的层),遍历所有未被标记的询问在该层的边,即尝试建树,如果成环,即标记,break,如果未成环,说明该访问该层成立,撤销该询问在该层的所有操作(即并查集中对par修改操作,记录用两个vector记录,注意并查集的find操作也会修改par)该层结束后,对整幅图求出在该层的生成树,进行par修改。


#include <bits/stdc++.h>
using namespace std ;

const int maxn = 5e5 + 10 ;
typedef long long ll ;

struct edge{
    int st , ed , w ;
    bool operator < (const edge & k) const {
        return w < k.w ;
    }
};
int id[maxn] ;
edge E[maxn] ;

bool cmp(int x , int y){
    return E[x].w < E[y].w ;
}


int par[maxn] ;
bool ans[maxn] ;
map<int , vector<int> > ma , query[maxn] ;
//ma mean whether q has operation on w

///in order to recover


vector<int> pre_id ;
vector<int> pre_value ;

void init(int n){
    for(int i = 1 ; i <= n ; i ++ ) par[i] = i ;
    memset(ans , false , sizeof(ans)) ;
    pre_id.clear() ;
    pre_value.clear() ;
}

/*
int temp_unite(int son , int father){
    pre_id.push_back(son) ;
    pre_value.push_back(par[son]) ;

    par[son] = father ;
    return father ;
}

int find1(int x){
    int fa = par[x] ;
    while(fa != par[fa]){
        fa = par[ fa ] ;
    }

    if(x == fa) return x ;
    if(fa == par[x]) return fa ;
    pre_id.push_back(x) ;
    pre_value.push_back(par[x]) ;
    par[x] = fa ;
    return fa ;
}*/

int temp_unite(int x, int y){
    pre_id.push_back(x) ;
    pre_value.push_back(par[x]) ;
    par[x] = y ;
    return y;
}

int find1(int x){
    if (x == par[x]) return x;
    return temp_unite(x , find1(par[x]));
}
int find2(int x){
    if(par[x] == x) return x ;
    return par[x] = find2(par[x]) ;
}
void unite(int x , int y){
    int a = find2(x) ;
    int b = find2(y) ;
    if(par[a] == par[b]) return ;
    par[a] = b ;
    a = find2(x) , b = find2(y) ;
}
/// the process of find may change the array par
void reload(){
    for(int i = pre_id.size() - 1 ; i >= 0 ; i -- ){
        par[pre_id[i]] = pre_value[i] ;
    }
    pre_id.clear() ;
    pre_value.clear() ;
}
int main(){
    int n , m ;
    scanf("%d %d" , &n , &m) ;
    for(int i = 1 ; i <= m ; i ++ ){
        scanf("%d %d %d" , &E[i].st , &E[i].ed , &E[i].w) ;
        id[i] = i ;
    }
    int op ; scanf("%d" , &op) ;

    for(int i = 1 , k ; i <= op ; i ++ ){
        scanf("%d" , &k) ;
        for(int j = 1 , x ; j <= k ; j ++ ){
            scanf("%d" , &x) ;
            int w = E[x].w ;
            if(ma[w].size() == 0 || ma[w][ma[w].size() - 1] != i)
                ma[w].push_back(i) ;
            query[i][w].push_back(x) ;
        }
    }
    sort(id + 1 , id + m + 1 , cmp) ;
    init(n) ;

    for(int i = 1 ; i <= m ; i ++ ){
        int L = i , R = i ;
        while(E[id[R + 1]].w == E[id[L]].w && R + 1 <= m) R ++ ;
        int w = E[id[i]].w ;

        for(int j = 0 ; j < ma[w].size() ; j ++ ){
            int query_id = ma[w][j] ;
            if(ans[query_id]) continue ;

            for(int k = 0 ; k < query[query_id][w].size() ; k ++ ){
                int temp_edge = query[query_id][w][k] ;
                int st = E[temp_edge].st ;
                int ed = E[temp_edge].ed ;
                //cout << k << " " << query_id << st << " " <<ed  << "??";
                if(find1(st) != find1(ed))
                    temp_unite(find1(st) , find1(ed) ) ;
                else{
                    ans[query_id] = true ;
                    break ;
                }

            }

            reload() ;
        }

        for(int j = L ; j <= R ; j ++ ){
            int st = E[id[j]].st ;
            int ed = E[id[j]].ed ;

            /*if(find2(st) != find2(ed))
                temp_unite(find1(st) , find1(ed) ) ;*/
            unite(st , ed) ;
        }//for(int kk = 1 ; kk <= n ; kk ++ ) cout << par[kk] << " " ; cout << endl ;
        pre_id.clear() ;
        pre_value.clear() ;
        i = R ;
    }
    for(int i = 1 ; i <= op ; i ++ ){
        printf("%s\n" , ans[i] ? "NO" : "YES") ;
    }
    return 0 ;
}


资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 JavaScript 中实现点击展开与隐藏效果是一种非常实用的交互设计,它能够有效提升用户界面的动态性和用户体验。本文将详细阐述如何通过 JavaScript 实现这种功能,并提供一个完整的代码示例。为了实现这一功能,我们需要掌握基础的 HTML 和 CSS 知识,以便构建基本的页面结构和样式。 在这个示例中,我们有一个按钮和一个提示框(prompt)。默认情况下,提示框是隐藏的。当用户点击按钮时,提示框会显示出来;再次点击按钮时,提示框则会隐藏。以下是 HTML 部分的代码: 接下来是 CSS 部分。我们通过设置提示框的 display 属性为 none 来实现默认隐藏的效果: 最后,我们使用 JavaScript 来处理点击事件。我们利用事件监听机制,监听按钮的点击事件,并通过动态改变提示框的 display 属性来实现展开和隐藏的效果。以下是 JavaScript 部分的代码: 为了进一步增强用户体验,我们还添加了一个关闭按钮(closePrompt),用户可以通过点击该按钮来关闭提示框。以下是关闭按钮的 JavaScript 实现: 通过以上代码,我们就完成了点击展开隐藏效果的实现。这个简单的交互可以通过添加 CSS 动画效果(如渐显渐隐等)来进一步提升用户体验。此外,这个基本原理还可以扩展到其他类似的交互场景,例如折叠面板、下拉菜单等。 总结来说,JavaScript 实现点击展开隐藏效果主要涉及 HTML 元素的布局、CSS 的样式控制以及 JavaScript 的事件处理。通过监听点击事件并动态改变元素的样式,可以实现丰富的交互功能。在实际开发中,可以结合现代前端框架(如 React 或 Vue 等),将这些交互封装成组件,从而提高代码的复用性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值