2024牛客暑期多校训练营1赛后补题
C.Sum of Suffix Sums
题意:每次移出后t个数,并添加v个数,求其后缀和之和。
题解:每个数字对答案贡献了i次,只要每次计算后缀和并加入栈顶即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;
int main()
{
int n;
cin>>n;
ll ans = 0;
stack<ll>s;
s.push(0);
while(n--)
{
int t,v;
cin>>t>>v;
while(t--)
{
ans+= ( mod - s.top() ) ;
ans%= mod;
s.pop();
}
s.push( ( v * s.size() ) % mod );
ans+=s.top();
ans%=mod;
cout<<ans<<'\n';
}
return 0;
}
H.World Finals
题意:两场比赛,已知每个队的过题数和罚时,求lzr010506所在队伍的排名的最小值。
题解:考虑最极端的情况(只考虑参加两次比赛的队伍),要么都只参加第一场比赛,要么只参加第二场比赛,求这两种情况的名次的最小值。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1000 + 10;
const int maxn = 1e5 + 10;
struct node
{
string s;
int r, t;
} a[maxn], b[maxn];
bool cmp(node a, node b)
{
if (a.r == b.r)
{
return a.t < b.t;
}
return a.r > b.r;
}
int main()
{
int n;
cin >> n;
map<string, int> m1, m2;
for (int i = 1; i <= n; i++)
{
cin >> a[i].s >> a[i].r >> a[i].t;
m1[a[i].s] = 1;
}
int m;
cin >> m;
for (int i = 1; i <= m; i++)
{
cin >> b[i].s >> b[i].r >> b[i].t;
m2[b[i].s] = 1;
}
sort(a + 1, a + 1 + n, cmp);
sort(b + 1, b + 1 + m, cmp);
int cnt = 1, rk1;
for (int i = 1; i <= n; i++)
{
if (a[i].s == "lzr010506")
{
rk1 = cnt;
break;
}
if (m1[a[i].s] && m2[a[i].s])
continue;
else
cnt++;
}
int rk2;
cnt = 1;
for (int i = 1; i <= m; i++)
{
if (b[i].s == "lzr010506")
{
rk2 = cnt;
break;
}
if (m1[b[i].s] && m2[b[i].s])
continue;
else
cnt++;
}
cout << min(rk1, rk2) << endl;
return 0;
}