列表

详情


NC23342. Tachibana Kanade Loves Sequence

描述

立华奏是一个天天打比赛的 OIer。
有一天,立华奏正在打一场比赛,菜爆了的立华奏依靠运气解决了大部分的题目,还有最后一道题目没有解决。
这道题目给定了两个长度为 n 的序列 {ai}, {bi},要求两个长度为 n 的 0/1 序列 {ci}, {di},最大化:


输入描述

输入的第一行包含一个整数 n。
接下来一行,包含 n 个整数,表示序列{ai}
接下来一行,包含 n 个整数,表示序列{bi}

输出描述

输出的第一行包含一个整数,表示式子的最大值。
接下来一行,包含 n 个整数,表示你构造的序列 {ci}
接下来一行,包含 n 个整数,表示你构造的序列 {di}
如果有多种构造方法,你只需要输出任意一种。

示例1

输入:

3
100000 -100000 100000
-100000 100000 -100000

输出:

99998
0 0 1
0 1 0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 145ms, 内存消耗: 3180K, 提交时间: 2020-04-10 10:15:41

#include <stdio.h>
#include <algorithm>
#define ll long long
using namespace std;
struct node
{
	int id,v;
	bool f;
}a[100010],b[100010];
int main()
{
	int n;
	scanf("%d",&n);	
	for(int i=1;i<=n;i++)scanf("%d",&a[i].v),a[i].id=i;
	for(int i=1;i<=n;i++)scanf("%d",&b[i].v),b[i].id=i;
	sort(a+1,a+1+n,[](node p,node q){return p.v>q.v;});
	sort(b+1,b+1+n,[](node p,node q){return p.v>q.v;});
	node *A=a,*B=b;
	ll left=0,right=0,i=1,j=1,num=0;
	while((A[i].v>1||B[j].v>1)&&i<=n&&j<=n)
	{
		if(left>right)
		{
			swap(left,right);
			swap(A,B);
			swap(i,j);
		}
		if(A[i].v<=1)break;
		A[i].f=1;
		left+=A[i].v;
		i++;
		num++;
	}
	sort(a+1,a+1+n,[](node p,node q){return p.id<q.id;});
	sort(b+1,b+1+n,[](node p,node q){return p.id<q.id;});
	printf("%lld\n",min(left,right)-num);
	for(int i=1;i<=n;i++)printf("%d ",a[i].f);
	putchar('\n');
	for(int i=1;i<=n;i++)printf("%d ",b[i].f);
	
} 

C++11(clang++ 3.9) 解法, 执行用时: 101ms, 内存消耗: 3040K, 提交时间: 2019-04-05 22:01:27

#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=(b);++i)
#define F2(i,a,b) for(int i=a;i<(b);++i)
#define dF(i,a,b) for(int i=a;i>=(b);--i)
#define MN 6000005
#define ll long long
int n,m,q,k;
int a[MN],b[MN],ap[MN],bp[MN];
int h[MN];
ll ans=0,ii=1,jj=1;
int main(){
	scanf("%d",&n);
	F(i,1,n)scanf("%d",a+i),ap[i]=i;
	F(i,1,n)scanf("%d",b+i),bp[i]=i;
	sort(ap+1,ap+n+1,[](int i,int j){return a[i]>a[j];});
	sort(bp+1,bp+n+1,[](int i,int j){return b[i]>b[j];});
	int i=1,j=1;
	ll s1=0,s2=0;
	while(i<=n||j<=n){
		int s;
		if(i<=n&&j<=n)s=s2<s1;
		else s=j<=n;
		if(s)s2+=b[bp[j++]];
		else s1+=a[ap[i++]];
		if(ans<min(s1,s2)-i-j+2)
			ans=min(s1,s2)-i-j+2,ii=i,jj=j;
	}printf("%lld\n",ans);
	F2(i,1,ii)h[ap[i]]=1;
	F(i,1,n)printf("%d ",h[i]);puts("");
	F(i,1,n)h[i]=0;
	F2(i,1,jj)h[bp[i]]=1;
	F(i,1,n)printf("%d ",h[i]);
	return 0;
}

上一题