1. 程式人生 > >HDU6215 Brute Force Sorting 【模擬】

HDU6215 Brute Force Sorting 【模擬】

傳送門

顯然 當[l,r]被刪除後,下一輪可能刪除的位置必定是從l-1或r+1開始
每刪除一個值,將其左右邊的值放進佇列,用一個數組標記是否被刪除過,避免重複操作即可

#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))

using
namespace std; const int INF = 1e9+7; const int inf=INF; const int N = 100000 + 5; struct S{ int pre,val,nxt,idx; }; list<S>ls; deque<pair<list<S>::iterator,int> >que; int del[N]; void update(list<S>::iterator it){ auto preIt=it,nxtIt=it; if(it==ls.begin()){ it->pre=0
; } else{ --preIt; it->pre=preIt->val; } ++nxtIt; it->nxt=(nxtIt==ls.end()?inf:nxtIt->val); } void init(int n){ ls.clear(); que.clear(); fill(del,del+n+1,0); for(int i=1;i<=n;++i){ int x; scanf("%d",&x); ls.push_back({0
,x,0,i}); } } bool toDel(list<S>::iterator it){ return (it->pre>it->val)||(it->val>it->nxt); } void delIt(list<S>::iterator it){ del[it->idx]=1; if(it!=ls.begin()){ auto tmp=it; --tmp; que.push_back({tmp,tmp->idx}); } auto tmp=it; ++tmp; if(tmp!=ls.end()){ que.push_back({tmp,tmp->idx}); } ls.erase(it); } void slove(){ for(auto it=ls.begin();it!=ls.end();++it){ que.push_back({it,it->idx}); } while(!que.empty()){ int num=que.size(); for(int i=0;i<num;++i){//更新pre,nxt auto it=que[i].first; int idx=que[i].second; if(!del[idx]){ update(it); } } for(int i=0;i<num;++i){//刪除未排序部分 auto it=que[i].first; int idx=que[i].second; if(!del[idx]&&toDel(it)){ delIt(it); } } for(int i=0;i<num;++i){ que.pop_front(); } } printf("%d\n",(int)ls.size()); for(auto s:ls){ printf("%d ",s.val); } putchar('\n'); } int main(){ //freopen("/home/lu/code/r.txt","r",stdin); //freopen("/home/lu/code/w.txt","w",stdout); int T; scanf("%d",&T); while(T--){ int n; scanf("%d",&n); init(n); slove(); } return 0; }