1 //By kaike, contest: Codeforces Round #577 (Div. 2), problem: (B) Zero Array, Wrong answer on pretest 5, # 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <algorithm> 7 #include <set> 8 #include <map> 9 #include <stack> 10 #include <vector> 11 #include <cctype> 12 #include <sstream> 13 using namespace std; 14 typedef long long ll; 15 const int inf=0x7fffffff; 16 const int N=200000+100; 17 const int M=5000+10; 18 const int mod=1e9+7; 19 const double PI=acos(-1.0); 20 ll n,m,k,q,b[N]; 21 ll maxx[N],minn[N],r,c,you[N]; 22 ll f[5][N]; 23 int meiyou=0; 24 ll solve(int i,int j,int kk) 25 { 26 ll res=0; 27 if(b[j]<=b[kk]) 28 { 29 res+=b[kk]-b[j]; 30 if(minn[i]<b[j]) res+=(b[j]-minn[i])*2; 31 if(maxx[i]>b[kk]) res+=(maxx[i]-b[kk])*2; 32 } 33 else 34 { 35 res+=b[j]-b[kk]; 36 if(minn[i]<b[kk]) res+=(b[kk]-minn[i])*2; 37 if(maxx[i]>b[j]) res+=(maxx[i]-b[j])*2; 38 } 39 return res; 40 } 41 ll solve1(int i,int j,int cc) 42 { 43 ll res=0; 44 if(b[j]<=cc) 45 { 46 res+=cc-b[j]; 47 if(minn[i]<b[j]) res+=(b[j]-minn[i])*2; 48 if(maxx[i]>cc) res+=(maxx[i]-cc)*2; 49 } 50 else 51 { 52 res+=b[j]-cc; 53 if(minn[i]<cc) res+=(cc-minn[i])*2; 54 if(maxx[i]>b[j]) res+=(maxx[i]-b[j])*2; 55 } 56 return res; 57 } 58 int main() 59 { 60 scanf("%lld%lld%lld%lld",&n,&m,&k,&q); 61 for(int i=1;i<=n;i++) 62 { 63 maxx[i]=0; 64 minn[i]=99999999; 65 } 66 for(int i=1;i<=k;i++) 67 { 68 scanf("%lld%lld",&r,&c); 69 you[r]=1; 70 maxx[r]=max(maxx[r],c); 71 minn[r]=min(minn[r],c); 72 } 73 for(int i=n;i>=1;i--) 74 if(you[i]) 75 { 76 meiyou=i; break; 77 } 78 for(int i=1;i<=q;i++) 79 scanf("%lld",b+i); 80 sort(b+1,b+q+1); 81 if(meiyou==1) 82 { 83 printf("%lld\n",maxx[1]-1); 84 return 0; 85 } 86 for(int i=1;i<=q;i++) 87 { 88 if(you[1]) 89 { 90 if(b[i]>maxx[1]) f[1][b[i]]=b[i]-1; 91 else f[1][b[i]]=maxx[1]-1+maxx[1]-b[i]; 92 } 93 else 94 { 95 f[1][b[i]]=b[i]-1; 96 } 97 } 98 99 for(int i=2;i<meiyou;i++) 100 { 101 int er=i%2,yi=(i-1)%2; 102 for(int j=1;j<=q;j++) 103 { 104 for(int kk=1;kk<=q;kk++) 105 { 106 if(j==1) f[er][b[kk]]=99999999999; 107 if(you[i]) 108 { 109 f[er][b[kk]]=min(f[er][b[kk]],f[yi][b[j]]+solve(i,j,kk)+1); 110 } 111 else 112 { 113 f[er][b[kk]]=min(f[er][b[kk]],f[yi][b[j]]+abs(b[kk]-b[j])+1); 114 } 115 //cout<<i<<" "<<b[kk]<<" "<<f[er][b[kk]]<<endl; 116 } 117 } 118 119 } 120 int er=(meiyou)%2,yi=(meiyou-1)%2; 121 for(int i=1;i<=m;i++) 122 f[er][i]=9999999999; 123 //cout<<solve1(meiyou,1,4)<<endl<<endl; 124 for(int i=1;i<=q;i++) 125 { 126 for(int j=1;j<=m;j++) 127 { 128 f[er][j]=min(f[er][j],f[yi][b[i]]+1+solve1(meiyou,i,j)); 129 } 130 } 131 ll ans=9999999999; 132 for(int i=1;i<=m;i++) 133 ans=min(f[er][i],ans); 134 cout<<ans<<endl; 135 136 137 return 0; 138 }
cf
猜你喜欢
转载自www.cnblogs.com/Kaike/p/11300826.html
今日推荐
周排行