codefoces 1407D Discrete Centrifugal Jumps
阿新 • • 發佈:2020-09-15
https://codeforces.com/contest/1407/problem/D
這神仙題啊,舉個例子
4 5 6 5 6 3
這樣的序列如何建邊?
//先只考慮中間部分比i j大的
4
4 5 4---5
4 5 6 5---6
4 5 5 5---5
4 5
4 5 6 5---6
3 4 5 6 --- 3 (4 5 6都連3)
建好圖跑bfs吧
#include<iostream> #include<vector> #include<algorithm> #include<stack> #include<queue> using namespace std; typedef long long ll; const int maxn = 3e5+11; int n,list[maxn]; stack<int>ins; vector<int>G[maxn]; void add(int x,int y){ G[x].push_back(y); } int vis[maxn]; int bfs(){ queue<int>que; que.push(1); vis[1] = 1; while(que.size()){ int x = que.front(); que.pop(); for(int i=0;i<G[x].size();i++){ int p = G[x][i]; if(vis[p] == 0) { vis[p] = vis[x] + 1; que.push(p); } } } return 0; } int main(){ cin>>n; for(int i=1;i<=n;i++){ cin>>list[i]; } for(int i=1;i<n;i++){ // add(i,i+1); } for(int i=1;i<=n;i++){ if(ins.size() == 0){ ins.push(i); } else{ while(ins.size() && list[ins.top()] > list[i]){ add(ins.top(),i); ins.pop(); } if(ins.size()) add(ins.top(),i); while(ins.size() && list[ins.top()] == list[i]){//相等不能連邊 ins.pop(); } ins.push(i); } } while(ins.size()) ins.pop(); for(int i=1;i<=n;i++){ if(ins.size() == 0){ ins.push(i); } else{ while(ins.size() && list[ins.top()] < list[i]){ add(ins.top(),i); ins.pop(); } if(ins.size()) add(ins.top(),i); while(ins.size() && list[ins.top()] == list[i]){//相等不能連邊 ins.pop(); } //if(ins.size()) add(ins.top(),i); ins.push(i); } } // for(int i=1;i<=n;i++){ // for(int j=0;j<G[i].size();j++){ // cout<<list[i]<<" "<<list[G[i][j]]<<endl; // } // } bfs(); cout<<vis[n]-1<<endl; return 0; }