序列问题
1.序列
题意

分析

代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int a[N],b[N],c[N];
int m,n;
void divide(int a[ ],int b[ ])
{
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>s;
for(int i=1;i<=m;i++)
{
s.push({a[1]+b[i],1});
}
for(int i=1;i<=m;i++)
{
c[i]=s.top().first;
int t=s.top( ).second;
s.pop( );
s.push(make_pair(c[i]-a[t]+a[t+1],t+1));
}
for(int i=1;i<=m;i++)
a[i]=c[i];
}
int main( )
{
int T;
cin>>T;
while(T--)
{
cin>>n>>m;
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
sort(a+1,a+m+1);
n--;
while(n--)
{
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
}
sort(a+1,a+m+1);
divide(a,b);
}
for(int i=1;i<=m;i++)
printf("%d ",a[i]);
cout<<endl;
}
}
2.CF1574D The Strongest Build
题意

分析
和上题差不多做法,但是他序列长度不一定相同,必须得用vetocr具体实现看代码
代码
/*made in mrd*/
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
const int M=5e3+10;
#define int long long
#define mem(a,b) memset(a,b,sizeof a)
#define fi first
#define se second
#define cout1(x) cout<<x<<endl
#define cout2(x,y) cout<<x<<' '<<y<<endl
#define pii pair<int,int>
#define piii pair<int,pii>
#define pb push_back
vector<int>a[N];
int m;
#define piv pair <int,vector<int>>
set<vector<int>>s;
vector<piv>res;
priority_queue<piii>q;
void divedes(vector<piv> &b,vector<int>c)
{
vector<piv>d;
for(int i=0;i<c.size();i++)
{
q.push({b[0].fi+c[i],{0,i}});
}
for(int i=0;i<=m&&q.size();i++)
{
auto x=q.top();
q.pop();
d.push_back(b[x.second.first]);
d.back().first=x.first;
d.back().second.push_back(x.second.second);
if(x.se.fi+1<b.size())
q.push({x.first-b[x.second.first].fi+b[x.second.fi+1].fi,{x.second.fi+1,x.second.se}});
}
while(q.size()) q.pop();
b=d;
}
signed main() {
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int c;
cin>>c;
for(int j=1;j<=c;j++) {
int x;
cin>>x;
a[i].push_back(x);
}
}
cin>>m;
vector<int>b;
for(int i=1;i<=m;i++)
{
b.resize(n);
for(int j=0;j<n;j++) cin>>b[j],b[j]--;
s.insert(b);
}
//res.resize(m+1);
res.push_back({0,vector<int>(0)});
for(int i=1;i<=n;i++)
{
divedes(res,a[i]);
//sort(res.begin(),res.end(),great<int>());
}
for(int i=0;i<=m;i++)
{
if(!s.count(res[i].second))
{
for(int j=0;j<n;j++)
{
cout<<res[i].second[j]+1<<" ";
}
cout<<endl;
break;
}
}
return 0;
}
3.Apocryphal Vir Pulcher
题意

分析

代码
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <ctime>
#include <queue>
#define LL long long
using namespace std;
const int MAXN = 85;
queue <LL> que[MAXN];
int n, k, a[MAXN], num;
LL minn;
int main() {
scanf("%d%d", &n, &k); k --;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
que[0].push(0);
for(int i = 1; i <= k + 1; i ++) {
minn = 9e18;
for(int j = 0; j <= n; j ++) if(!que[j].empty() && que[j].front() < minn) minn = que[j].front(), num = j;
if(i==1){ while(que[0].size()) que[0].pop();}
que[num].pop();
for(int j = num; j <= n; j ++) que[j].push(minn + a[j]);
}
printf("%lld", minn);
return 0;
}

浙公网安备 33010602011771号