bzoj 1293: [SCOI2009]生日礼物 问题转化_性质分析_调不出来
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1010000
using namespace std;
void Min(int &a,int b) { if(b<a) a=b; }
void Max(int &a,int b) { if(b>a) a=b; }
struct Node{
int id,d;
Node(int a=0,int b=0):id(id),d(d){}
bool operator<(Node c)const{
return c.d>d;
}
}nodes[maxn];
int arr[maxn],lst[maxn][70];
int main(){
setIO("input");
int n,k,m,cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=k;++i){
int t,x;
scanf("%d",&t);
for(int j=1;j<=t;++j) scanf("%d",&x),nodes[++cnt].id=i,nodes[cnt].d=x;
}
sort(nodes+1,nodes+1+n);
for(int i=1;i<=n;++i) arr[i]=nodes[i].d;
for(int i=1;i<=n;++i) nodes[i].d=lower_bound(arr+1,arr+1+n,nodes[i].d)-arr,lst[nodes[i].d][nodes[i].id]=0;
m=nodes[n].d;
for(int i=0;i<=1000010;++i) for(int j=0;j<=68;++j) lst[i][j]=0x7fffffff;
int ans=0x7fffff;
for(int i=1,j;i<=n;i=j+1) {
j=i;
int posl=nodes[i-1].d,posc=nodes[i].d,rec=0;
while(nodes[j+1].d==nodes[i].d) ++j;
for(int jj=i;jj<=j;++jj) lst[posc][nodes[jj].id]=0; //当前点
for(int jj=1;jj<=k;++jj) {
if(lst[posl][nodes[jj].id]Min(lst[posc][nodes[jj].id],lst[posl][nodes[jj].id]+arr[posc]-arr[posl]);
Max(rec,lst[posc][nodes[jj].id]);
}
// for(int jj=1;jj<=k;++jj) printf("%d ",lst[posc][jj]);
printf("\n");
Min(ans,rec);
}
printf("%d",ans);
return 0;
}