蒻得不行 @ 2018-10-05 22:19:13
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
int a[1001],p[1001],n,m,ans,s,x,y,i,j,maxx,minn;
//ans=1是因为车站等级全为0也是一种等级 \
a为离线做法的输入表\
p为模拟时各车站的等级
int main(){
//freopen(".txt","r",stdin);
scanf("%d%d",&n,&m);
while(m--){
maxx=0;minn=1<<30;
scanf("%d",&s);
for(i=0;i<s;i++){
scanf("%d",&a[i]);
maxx=max(maxx,p[a[i]]);//临时停靠站的最大值
}
for(i=1;i<s;i++) for(j=a[i-1]+1;j<a[i];j++)
minn=min(minn,p[j]);//非临时停靠站的最小值
maxx-=minn-1;//因为非临时停靠站等级必须大于零时停靠站,所以-1
if(maxx<=0) continue;//临时停靠站与非临时停靠站相差一或更大,不矛盾,跳出
for(i=1;i<s;i++) for(j=a[i-1]+1;j<a[i];j++)
p[j]+=maxx;//将所有非临时停靠站的等级置于临时停靠站的等级之上
}
for(i=1;i<=n;i++) ans=max(ans,p[i]);//等级取最大值
printf("%d",ans+1);//因为等级下标为0,所以+1
return 0;
}
求dalao帮忙
by outstanding_c @ 2018-10-07 12:59:09
膜拜膜拜 70分大佬
by outstanding_c @ 2018-10-07 13:01:52
#include<iostream>
using namespace std;
int n,m,a[1001][1001],r[10001],ans=0,book[1001][1001];
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++)r[i]=1;
for(int i=1;i<=n;i++){
cin>>a[i][0];
for(int j=1;j<=a[i][0];j++){
cin>>a[i][j];
book[i][a[i][j]]=1;
}
}
while(1){
bool fl=1;
for(int i=1;i<=n;i++){
int maxx=0;
for(int j=a[i][1];j<=a[i][a[i][0]];j++){
if(book[i][j])continue;
if(r[j]>maxx){
maxx=r[j];
}
}
for(int j=1;j<=a[i][0];j++){
if(r[a[i][j]]<=maxx){
r[a[i][j]]=maxx+1;
fl=0;
}
}
}
if(fl)break;
}
int ans=1;
for(int i=1;i<=m;i++){
if(r[i]>ans)ans=r[i];
}
cout<<ans;
return 0;
}
by outstanding_c @ 2018-10-07 13:05:27
ac了
by 蒻得不行 @ 2018-10-17 13:58:46
(上 答 作 废)