Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // _
- // _ __ ___ __ _ __| | ___
- // | '_ ` _ \ / _` | / _` | / _ \
- // | | | | | || (_| || (_| || __/
- // |_| |_| |_| \__,_| \__,_| \___|
- //
- // _
- // | |__ _ _
- // | '_ \ | | | |
- // | |_) || |_| |
- // |_.__/ \__, |
- // |___/
- // _
- // _ __ _ _ _ __ ___ __| | ___ __ __
- // | '_ \ | | | || '_ \ / __| / _` | / _ \\ \ / /
- // | |_) || |_| || |_) || (__ | (_| || __/ \ V /
- // | .__/ \__, || .__/ \___| \__,_| \___| \_/
- // |_| |___/ |_|
- // --last hope--
- //#pragma GCC optimize("O3")
- //#pragma GCC optimize("Ofast")
- //#pragma GCC optimization("unroll-loops")
- //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #include<bits/stdc++.h>
- #include<ext/pb_ds/assoc_container.hpp>
- #include<ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef long double ld;
- //#define int ll
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define ppb pop_back
- #define ppf pop_front
- #define mkp make_pair
- #define INF (ll)1e18
- #define INF2 (ll)2e18
- #define INF3 (ll)3e18
- #define INF4 (ll)4e18
- #define inf (signed)1e9
- #define inf2 (signed)2e9
- mt19937 rng32(chrono::steady_clock::now().time_since_epoch().count());
- mt19937_64 rng64(chrono::steady_clock::now().time_since_epoch().count());
- #define rand32 rng32
- #define rand64 rng64
- template<typename type,typename comp>
- using aset=tree<type,null_type,comp,rb_tree_tag,tree_order_statistics_node_update>;// advanced set with order_of_key and find_by_order
- // aset<int,less<int>> is set, but aset<int,less_equal<int> is multiset
- const pair<int,int>DIR4[4]={{1,0},{-1,0},{0,1},{0,-1}}; // dirs for 4 ways(like in a matrix)
- bool validf(int up,int left,int down,int right,int i,int ii){
- return up<=i&&i<=down&&left<=ii&&ii<=right;
- }
- // debug tools only
- template<typename F,typename S>ostream&operator<<(ostream&output,const pair<F,S>&data){output<<"{"<<data.fi<<","<<data.se<<"}";return output;}
- template<typename T>ostream&operator<<(ostream&output,const set<T>&data){if(data.empty())output<<"{}";else{output<<"{"<<*data.begin();for(auto it=next(data.begin());it!=data.end();it++)cout<<","<<*it;output<<"}";}return output;}
- template<typename T>ostream&operator<<(ostream&output,const aset<T,less<T>>&data){if(data.empty())output<<"{}";else{output<<"{"<<*data.begin();for(auto it=next(data.begin());it!=data.end();it++)cout<<","<<*it;output<<"}";}return output;}
- template<typename T>ostream&operator<<(ostream&output,const aset<T,greater<T>>&data){if(data.empty())output<<"{}";else{output<<"{"<<*data.begin();for(auto it=next(data.begin());it!=data.end();it++)cout<<","<<*it;output<<"}";}return output;}
- template<typename T>ostream&operator<<(ostream&output,const multiset<T>&data){if(data.empty())output<<"{}";else{output<<"{"<<*data.begin();for(auto it=next(data.begin());it!=data.end();it++)cout<<","<<*it;output<<"}";}return output;}
- template<typename T>ostream&operator<<(ostream&output,const vector<T>&data){if(data.empty())output<<"{}";else{output<<"{"<<*data.begin();for(auto it=next(data.begin());it!=data.end();it++)cout<<","<<*it;output<<"}";}return output;}
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- // safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line safe line
- const int KMAX=1e5;
- const int MMAX=50;
- pair<int,int>pos[KMAX+500];
- bool can[KMAX+5][MMAX+5];
- int dp[KMAX+5][MMAX+5];
- int depth[KMAX+500];
- signed main(){
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- int n,m,k;
- cin>>n>>m>>k;
- memset(can,1,sizeof can);
- for(int i=1;i<=k;i++){
- cin>>pos[i].fi>>pos[i].se;
- }
- pos[0]={1,1};
- sort(pos,pos+1+k);
- depth[0]=1;
- int last=0;
- int levels=1;
- for(int i=1;i<=k;i++){
- if(pos[i].fi!=last){
- last=pos[i].fi;
- depth[levels]=last;
- levels++;
- }
- can[levels-1][pos[i].se]=0;
- }
- for(int i=0;i<=KMAX+4;i++)for(int ii=0;ii<=MMAX+4;ii++)dp[i][ii]=1e9;
- dp[0][1]=0;
- for(int i=0;i<=levels;i++){
- for(int ii=1;ii<=m;ii++){
- if(dp[i][ii]>1e9||!can[i][ii])continue;
- int delta=depth[i+1]-depth[i];
- for(int x=ii;x<=m&&x-ii<=delta;x++){
- if(can[i+1][x]){
- if(x-ii==delta&&!can[i][ii+1])continue;
- dp[i+1][x]=min(dp[i+1][x],dp[i][ii]+x-ii);
- }
- }for(int x=ii-1;x>=1&&ii-x<=delta;x--){
- if(can[i+1][x]){
- if(ii-x==delta&&!can[i][ii-1])continue;
- dp[i+1][x]=min(dp[i+1][x],dp[i][ii]+ii-x);
- }
- }
- }
- }
- /*for(int i=0;i<=levels;i++){
- for(int ii=1;ii<=m;ii++){
- if(dp[i][ii]>1e9)cout<<"-1";
- else cout<<dp[i][ii];
- }cout<<"\n";
- }*/
- int mn=1e9;
- for(int i=1;i<=m;i++)mn=min(mn,dp[levels-1][i]);
- if(mn>1e9)cout<<"-1\n";
- else cout<<mn<<"\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement