HDU6215 Brute Force Sorting 【模拟】

来源:互联网 发布:warframe对网络要求 编辑:程序博客网 时间:2024/06/05 05:28

传送门


显然 当[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;}
原创粉丝点击