salute-to-Mr-Lynch

导航

2024年暑期2024牛客暑期多校训练营1 C和H题解

C题Sum of Suffix Sums

 题目大意:

  • 开始是给你一空数组,要经历q次操作,每次操作都会给出两个数字t和v,其中要从数组末尾去走元素t次,最后加上元素v。
  • 定义si=ai + ai+1+ai+2+ai+3+......+an,最后求s1+s2+s3+.......+sn的总和。
  • 最后答案注意取模。

 

题解:

  注意到sum的总和其实就是i*ai的累加和,知道这点后,就不难写出来了。废话不多说上代码!

 

 

   

#include<iostream>
#include<vector> 
using namespace std;
typedef long long ll;
const int mod=1e9+7;
vector<int> vec;
ll sum=0;
ll num=0;//我觉得唯一要注意就是这个num,说实话题目明明标注的是1<=q<=1e5,那么num应该也<=1e5才对,但硬是只有long long 类型才对。
void solve()
{
    int t,v;
    cin >> t >> v;
    for(int i=0;i<t;i++)
    {
        sum=(sum-num*vec[num-1]%mod+mod)%mod;
        vec.pop_back();
        num--;
    }
    vec.push_back(v);
    num++;
    sum=(sum+v*num%mod)%mod;
    cout << sum<< "\n";
}

signed main()
{
    int q;
    cin >> q;
    while(q--)
    {
        solve();
    }
    return 0;
 } 

 

H:World Finals

  题目大概意思就是首先给你n支能参加第46届world finals队伍,给出他们能解决的问题数量和罚时数量。再给你m支能参加第47届world finals,同样给出能解决的问题数量和罚时。注意可能有多支队伍有资格参加两场比赛 ,           但每支队伍只能参加一场比赛。最后问你lzr010506最后能获得的最好名次是多少。

题解:

  这题同样很简单,我们只需要把每场比赛的队伍从高到低排序。最后再看看,每场比赛lzr010506前面有多少只队伍有打两场比赛的资格,将它们去掉后,比较lzr010506能取得的最好成绩是多少。

 

代码:

#include<iostream>
#include<vector> 
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;

typedef struct 
{
    string s;
    int p,t;
}team;

struct cmp
{
    bool operator()(const team& s1,const team& s2)
    {
        if(s1.p== s2.p)
        {
            return s1.t < s2.t; 
        }
        else return s1.p > s2.p;
    }
};
map<string,int> maps;

void solve()
{
    vector<team> WF_46,WF_47;
    int n,m; 
    cin >> n;
    team temp;
    for(int i=0;i<n ;i++)
    {
        cin >> temp.s >> temp.p >>temp.t;
        WF_46.push_back(temp);
        maps[temp.s]=1;
    }
    sort(WF_46.begin(),WF_46.end(),cmp());
    cin >> m;
    for(int i=0;i<m;i++)
    {
        cin >> temp.s >> temp.p >> temp.t;
        WF_47.push_back(temp);
        if(maps[temp.s]) maps[temp.s]=2;
        else maps[temp.s]=1;
    }
    sort(WF_47.begin(),WF_47.end(),cmp());
    
    
    
    int k1,k2,c1=0,c2=0;
    for(k1=0;k1<n ;k1++)
    {
        if(WF_46[k1].s=="lzr010506")break;
        
        if(maps[WF_46[k1].s]==2)c1++;
    }
    k1++;
    for(k2=0;k2<m ;k2++)
    {
        if(WF_47[k2].s=="lzr010506")break;
        if(maps[WF_47[k2].s]==2)c2++;
    }
    k2++;
    if(k1-c1 < k2-c2)cout<< k1-c1;
    else cout << k2 -c2; 
}

signed main()
{
    solve();
    return 0;
 } 

 

posted on 2024-07-22 23:33  kiyotaka-ayanokoji  阅读(7)  评论(0编辑  收藏  举报