CF2004D2 WA on #2求调
  • 板块题目总版
  • 楼主WaTleZero_pt
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/26 10:46
  • 上次更新2024/8/26 10:47:07
查看原帖
CF2004D2 WA on #2求调
536745
WaTleZero_pt楼主2024/8/26 10:46
#include<bits/stdc++.h>
using namespace std;
int t,n,m,l;
int a[200010];
int to[200010];
int cnt2[200010];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&m);
		int mxlen=0;
		int mxans=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&l);
			for(int j=1;j<=l;j++)
				scanf("%d",&a[j]);
			sort(a+1,a+l+1); a[l+1]=INT_MAX;
			int want=0,prev; int second=0;
			for(int j=1;j<=l+1;j++){
				if(a[j]>want){
					if(second){
						cnt2[prev]++;
						mxans=max(mxans,prev);
						to[prev]=max(to[prev],want);
						mxlen=max(mxlen,want);
						break;
					}else{second=1;j--;prev=want,want++;}
				}else if(a[j]==want) want++;
			}
		}
		for(int i=mxlen+1;i>=0;i--)
			to[i]=max(to[i],cnt2[i]?to[to[i]]:0);
		for(int i=0;i<=mxlen+1;i++)
			if(cnt2[i]>1) mxans=max(mxans,to[i]);
		long long ans=0;
		for(int i=0;i<=min(mxlen+1,m);i++)
			ans+=max(mxans,max(to[i],i));
		if(m>mxlen+1) ans+=(m-mxlen-1)*(mxlen+2ll+m)/2;
		for(int i=0;i<=mxlen+1;i++) to[i]=cnt2[i]=0;
		printf("%lld\n",ans);
	}
}
2024/8/26 10:46
加载中...