hdu6215 雙向鏈表,模擬
阿新 • • 發佈:2017-10-04
所有 val eof while col i+1 space 輸出 con
hdu6215
題意:給出一個序列。如果不滿足 a[i-1]<=a[i]<=a[i+1],則稱數 a[i] 是無序的。 現在每一次把序列中所有無序的數刪去,剩下的數合成新的序列,直到無法刪除為止。 輸出最後剩下的序列。
tags:就是模擬。。
把所有連續的無序的數的第一個加入隊列,然後用雙向鏈表記錄下標,不斷刪除即可。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #defineper(i,b,a) for (int i=b; i>=a; --i) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; struct P { int val, next, pre; } p[N]; int n; bool vis[N]; queue<int> q; int Q[N], tail; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); mes(vis, false); vis[0]=vis[n+1]=true; p[0].val=0, p[n+1].val=INF; while(!q.empty()) q.pop(); rep(i,1,n) { scanf("%d", &p[i].val); p[i].next=i+1, p[i].pre=i-1; } rep(i,1,n) if(p[i-1].val<=p[i].val && p[i].val>p[i+1].val) q.push(i), Q[++tail]=i; int ans=n; while(!q.empty()) { int u=q.front(), i; q.pop(); if(vis[u] || p[u].val<=p[p[u].next].val) continue; vis[u]=true; --ans; for(i=p[u].next; i<=n; i=p[i].next) { if(p[p[i].pre].val<=p[i].val) break; vis[i]=true; --ans; } p[p[u].pre].next=i; p[i].pre=p[u].pre; q.push(p[u].pre); q.push(i); } printf("%d\n", ans); rep(i,1,n) if(!vis[i]) printf("%d ", p[i].val); puts(""); } return 0; }
hdu6215 雙向鏈表,模擬