cf

  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 }
View Code

猜你喜欢

转载自www.cnblogs.com/Kaike/p/11300826.html
cf
CF3
CF4
CF2
CF1