首页 > 其他分享 >CodeTonRound8-BC1C2补题

CodeTonRound8-BC1C2补题

时间:2024-03-31 16:12:06浏览次数:15  
标签:arr CodeTonRound8 cur int 补题 && ans BC1C2 mex

B-Bessie and MEX

思路:顺,逆填都可以.见代码注释

void solve(){           //补B--不用str.find来维护,这个是o(n)的。用set的count() or find()来维护,这两个都是o(logn)的
    int n;cin>>n;
//    // 顺着填:填的数字=MEX.find('0')-ai or 填了MEX[MEX.find('0')]='1',之后MEX.find('0')-刚才填的位置--这样虽然是对的,但是实现容易超时
//    //顺着填:x>=0,那么pi即为当前mex;如果x<0,那么pi=mex-x;
//    // 因为x>=0,即NewMex-CurMex>=0,那么mex一定是增加的,那pi只能填当前mex;
//    // 如果x<0,那么NewMex不能增加,那只能保持不变,那pi只能是mex-x;
    set<int> st;
    int mex=0;
    for(int i=1;i<=n;i++){
        int x; cin>>x;
        while(st.find(mex)!=st.end()) mex++;
        if(x>=0){
            cout<<mex<<" ";
            st.insert(mex);
        }
        else{
            cout<<mex-x<<" ";
            st.insert(mex-x);
        }
    }
    cout<<endl;
}
void solve(){           //补B
    //倒着填:因为填了最后一个之后,mex必然为n,那么最后一个pi就是n-arr[n];那么填n-1个时,因为只有pn还没出现过,那么此时mex为pn
    //但是遇到负数时填的数字会更大,mex不会改变,那么只有当mex-ai更小才更新mex
    //我们知道最后一个位置的MEX是n,那么n−pn=an,我们可以得出 pn=n−an
    //现在知道了pn,那么可以确定前n-1个数字的MEX.跟求出pn是一样的.一直这样计算下去即可.
    int n; cin>>n;
    int arr[200005];
    for(int i=1;i<=n;i++) cin>>arr[i];
    int cur=n-arr[n];
    stack<int> stk;
    stk.emplace(cur);
    for(int i=n-1;i>=1;i--){
        stk.emplace(cur-arr[i]);
        cur=min(cur,cur-arr[i]);
    }
    while(stk.size()){
        cout<<stk.top()<<" ";
        stk.pop();
    }
    cout<<endl;
}

C1-Bessie's Birthday Cake (Easy Version)

思路:见代码注释.

void solve(){           //补C1    新
    int n,x,y; cin>>n>>x>>y;
    int ans=x-2;            //!!显然!!任意x个点内部可以构成x-2个三角形.对于外部点三角形,也是显然,只有两个点距离恰好为2点时候可以构成外部一个三角形
    int arr[200005];
    for(int i=1;i<=x;i++) cin>>arr[i];
    sort(arr+1,arr+x+1);
    for(int i=2;i<=x;i++){
        if(arr[i]-arr[i-1]==2) ans++;
    }
    if(arr[1]+n-arr[x]==2) ans++;  //特判一下环的最后一个和第一个
    cout<<ans<<endl;
}

C2-Bessie's Birthday Cake (Hard Version)

思路:见代码注释

void solve(){           //补C2   !贪心! 重重贪心,先是贪偶数,再是贪从小的先拿
    int n,x,y; cin>>n>>x>>y;
    int ans=x-2;
    int arr[200005];
    for(int i=1;i<=x;i++) cin>>arr[i];
    sort(arr+1,arr+x+1);
    arr[x+1]=arr[1]+n;
    //priority_queue<int> pq;      //不能单调从大到小排。因为偶的是比奇的更有价值的,所以应该优先考虑偶的区间,还有y剩余的话,再考虑奇的区间(贪心)
    priority_queue<int,vector<int>,greater<int>> pqodd,pqeven;   //小根堆,优先拿小的
    for(int i=1;i<=x;i++){
        if(arr[i+1]-arr[i]==2) ans++;
        if(arr[i+1]-arr[i]>2&&(arr[i+1]-arr[i])%2==0) pqeven.emplace(arr[i+1]-arr[i]);
        if(arr[i+1]-arr[i]>2&&(arr[i+1]-arr[i])%2!=0) pqodd.emplace(arr[i+1]-arr[i]);
    }
    while(pqeven.size()&&y){
        //先贪心地跑偶的,因为得到相同的三角形个数,偶的可以花费更少y.
        // 先拿小的,是因为小的更值当;如果先拿大的,可能因为y不够,导致贪心没有贪到
        int cur=pqeven.top();
        pqeven.pop();
        if(cur%2==0&&y>=cur/2-1){
            y-=cur/2-1,ans+=cur/2-1,ans+=cur/2;
        }
        else if(cur%2==0&&y<cur/2-1){
            ans+=y,ans+=y,y=0;
        }
        else if(cur%2!=0&&y>=cur/2){
            y-=cur/2,ans+=cur/2,ans+=cur/2;
        }
        else if(cur%2!=0&&y<cur/2){
            ans+=y,ans+=y,y=0;
        }
    }
    while(pqodd.size()&&y){
        int cur=pqodd.top();
        pqodd.pop();
        if(cur%2==0&&y>=cur/2-1){
            y-=cur/2-1,ans+=cur/2-1,ans+=cur/2;
        }
        else if(cur%2==0&&y<cur/2-1){
            ans+=y,ans+=y,y=0;
        }
        else if(cur%2!=0&&y>=cur/2){
            y-=cur/2,ans+=cur/2,ans+=cur/2;
        }
        else if(cur%2!=0&&y<cur/2){
            ans+=y,ans+=y,y=0;
        }
    }
    cout<<ans<<endl;
}

总结:这场只写出来AB题,B题因为用str.find()来维护,被hack了。所以只有A题,一场扣了100多分..再接再厉吧。

 

标签:arr,CodeTonRound8,cur,int,补题,&&,ans,BC1C2,mex
From: https://www.cnblogs.com/ouhq/p/18106845

相关文章

  • 日常训练补题
    7-10红色警报-SMU2024spring天梯赛2(补题)(pintia.cn)题解:这题是一道暴力思维题我们需要先统计一下最初的点的连通块然后在一个个删除,每删除一次就跑一个并查集,在统计连通块的个数,然后对比前一次,看看连通块有没有变多即可#include<bits/stdc++.h>//#pragmaGCCopti......
  • 2024SMUSpring天梯2补题
    L2-2:红色警报题意:只要连通块数目减少就输出RedAlert,主要是连通块数目..intn,m,k;unordered_map<int,int>mark;vector<int>vct[505];boolvis[505];voiddfs(intx){for(autov:vct[x]){if(!vis[v]&&!mark[v]){vis[v]=1;dfs(......
  • 2023ICPC沈阳区域赛I题Three Rectangles补题
    题意有一个(0,0)(左下角)到(H,W)(右上角)的矩形区域,给出3个小矩形的h和w,要求3个矩形盖住矩形区域的放置方案:要求3个矩形不能旋转,只能放到整点上,不能超出矩形区域,可以重叠。mod1e9+7。H,W范围1e9,\(1\leqh_i\leqH,1\leqw_i\leqW\)分析及实现由3个小矩形盖住大矩形,通过思考......
  • 2024年天梯成信小赛--L2-3,L2-4补题
    L2-3:Gwen的小剪刀题意:思路:二分美感度+克鲁斯卡尔intn,m,sum0;typedefstructmyp{intu,v;intb,h;};boolcmp(mypa,mypb){returna.h<b.h;}myparr[200005];intfa[100005];intfind(intx){// if(x==fa[x])returnx;// returnfa[x]=find(fa[x......
  • 2024年天梯成信校赛补题
    1-1代码胜于雄辩嘿嘿 L1-2收水费思路:分类讨论 L1-3日期思路:模拟 L1-4回文数思路:翻转后判断是否相等 L1-5yihan的新函数思路:模拟 L1-6二进制思路:二进制每位最多进位1,模拟下二进制加法即可 L1-7大山中的学院思路:统计每个山脉对空地的贡献 L1-8堆积木思......
  • 2024年3月18日 快速幂+补题
    快速幂longlongqpow(longlonga,longlongb){longlongres=1;while(b){if(b&1)res=res*a;a=a*a;b>>=1;}returnres;}快速幂加速矩阵计算应用于计算定长k路、斐波那契数列、求解递推式子题目:https://www.luogu.com.cn/problem/P1962htt......
  • 开学二周(日常补题训练)
    pta天梯专栏7-11龙龙送外卖-SMU2024spring天梯赛1(补题)(pintia.cn)题解:首先我们先建个图然后存一下各个节点的父亲节点我们细看这个最短路可以发现,当全部节点加进来,那么最短路就是每一个节点跑两遍然后最深的那个节点最后才跑,这样就只需要1遍所以我们首先把每一个节......
  • 单独补题-数正方形
    数正方形题意:做法:发现边长为1的正方形,中间不能放正方形。边长为2的正方形中间可以放1个正方形...以此类推。又容易计算出边长为x的正方形在n*n的矩阵中有几个。constintmod=1e9+7;voidsolve(){//JP8692[蓝桥杯2019国C]数正方形--思维..intn,ans=0;......
  • 天梯选拔赛2补题_2024_03_09
    补题1:奶茶袋收集题意:做法:贪心。之前还做过类似的题,赛时一直想不出来。选择k个连续的的区间,就是需要添加k-1个挡板。问题是挡板设置在哪里?可以发现一个连续线段的max-min等于线段中各个差值之和。如果k=1,那么ans=∑(ai+1-ai);如果k=2,那么需要添加一个挡板。贪心地放,挡板应该放......
  • 牛客小白月赛88补题D
    D-我不是大富翁题意:做法:一开始是往贪心方面想,但是很明显,贪不了。又因为走的步先后顺序没影响,可以用dp来写。暴力也差不多。值得注意的点是动力序列可以一边读入一边处理,省了点空间。如果dp[5005][5005]这样开的话会MLE,实际上在dp的过程中,用到的只是i和i-1两行,其余都是多余的。......