牛客周赛R168

D 小月的储物格

并查集

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+5;
const int INF=0x3f3f3f3f3f3f3f3f;
int n,m;
int a[N],tree[N];

int get(int z){
    if(tree[z]!=z) tree[z]=get(tree[z]);
    return tree[z];
}

int nxt(int pos){
    if(pos==n) return 1;
    return pos+1;
}

void solve(){
    cin>>n>>m;
    int ans=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        tree[i]=i;
    }
    int cnt=1;
    while(m--){
        int tp;
        cin>>tp;
        cnt+=tp;
        while(cnt>n)cnt=cnt-n;
        cnt=get(cnt);
        ans+=a[cnt];
        tree[cnt]=get(nxt(cnt));
    }
    cout<<ans<<' '<<cnt;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    while(t--){
        solve();
    }
    return 0;
}

set

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+5;
const int INF=0x3f3f3f3f3f3f3f3f;
int n,m;
int a[N];

void solve(){
    cin>>n>>m;
    int ans=0;set<int>s;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        s.insert(i);
    }
    int cnt=1;
    while(m--){
        int tp;
        cin>>tp;
        cnt+=tp;
        while(cnt>n)cnt-=n;
        auto it=s.lower_bound(cnt);
        if(it==s.end())it=s.begin();
        cnt=*it;
        ans+=a[cnt];
        s.erase(cnt);
    }
    cout<<ans<<' '<<cnt;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t=1;
    while(t--){
        solve();
    }
    return 0;
}

E 小月的栈(Easy)

二维状压DP

G 小月的栈(Hard)

贪心可行性判断

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

#define int long long
const int N=200005;
const int INF=0x3f3f3f3f3f3f3f3f;
int n,m,k;
int a[N],b[N],c[N],d[N];
int suma[N],sumb[N],pa[N],pb[N];


void solve(){
    int ans=-INF;
    cin>>n>>m>>k;
    c[0]=0;suma[0]=0;pa[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i]>>c[i],suma[i]=suma[i-1]+a[i];
        pa[i]=pa[i-1]+c[i-1];
    }
    d[0]=0;sumb[0]=0;pb[0]=0;
    for(int i=1;i<=m;i++){
        cin>>b[i]>>d[i],sumb[i]=sumb[i-1]+b[i];
        pb[i]=pb[i-1]+d[i-1];
    }
    int lo=max(0LL,k-m),hi=min(k,n);
    for(int i=lo;i<=hi;i++){
        if(pa[i]<=k-i&&i>=pb[k-i])ans=max(ans,suma[i]+sumb[k-i]);
    }
    if(ans==-INF)cout<<"IMPOSSIBLE"<<endl;
    else cout<<ans<<endl;
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t;cin>>t;
    while(t--) solve();
    return 0;
}
相关推荐
Navigator_Z8 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
D e re k ZH8 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶9 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
雪落漂泊10 小时前
C++算法 二分查找篇(上)
开发语言·c++·算法
LabVIEW开发11 小时前
LabVIEW 连接板:28 个端子怎么排,优先级怎么定
java·算法·labview
严肃小白兔13 小时前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
青少儿编程课堂14 小时前
蓝桥杯青少组图形化省考报名倒计时·全国青少年信息素养大赛·电子学会图形化考级:校园黑白棋人机对战解析
c++·python·算法·bfs·信息学竞赛
jktantan15 小时前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构