天天看點

hdu5338 ZZX and Permutations(貪心、線段樹)ZZX and Permutations

轉載請注明出處: http://www.cnblogs.com/fraud/           ——by fraud

ZZX and Permutations

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 181    Accepted Submission(s): 38

Problem Description ZZX likes permutations.

ZZX knows that a permutation can be decomposed into disjoint cycles(see https://en.wikipedia.org/wiki/Permutation#Cycle_notation). For example:

145632=(1)(35)(462)=(462)(1)(35)=(35)(1)(462)=(246)(1)(53)=(624)(1)(53)……

Note that there are many ways to rewrite it, but they are all equivalent.

A cycle with only one element is also written in the decomposition, like (1) in the example above.

Now, we remove all the parentheses in the decomposition. So the decomposition of 145632 can be 135462,462135,351462,246153,624153……

Now you are given the decomposition of a permutation after removing all the parentheses (itself is also a permutation). You should recover the original permutation. There are many ways to recover, so you should find the one with largest lexicographic order.  

Input First line contains an integer  t, the number of test cases.

Then t testcases follow. In each testcase:

First line contains an integer n, the size of the permutation.

Second line contains n space-separated integers, the decomposition after removing parentheses.

n≤105. There are 10 testcases satisfying n≤105, 200 testcases satisfying n≤1000.  

Output Output  n space-separated numbers in a line for each testcase.

Don't output space after the last number of a line.  

Sample Input 2 6 1 4 5 6 3 2 2 1 2  

Sample Output 4 6 2 5 1 3 2 1

和題解的解法幾乎一緻,然而卻在比賽結束後才意識到自己跪在了一個傻逼的地方,真是2333333

貪心,先放第一個位置,放盡可能大的值,然後依次往後,對于每個值,看其後面的一個位置,或者前面沒有使用過的連續區間

1 //#####################
  2 //Author:fraud
  3 //Blog: http://www.cnblogs.com/fraud/
  4 //#####################
  5 //#pragma comment(linker, "/STACK:102400000,102400000")
  6 #include <iostream>
  7 #include <sstream>
  8 #include <ios>
  9 #include <iomanip>
 10 #include <functional>
 11 #include <algorithm>
 12 #include <vector>
 13 #include <string>
 14 #include <list>
 15 #include <queue>
 16 #include <deque>
 17 #include <stack>
 18 #include <set>
 19 #include <map>
 20 #include <cstdio>
 21 #include <cstdlib>
 22 #include <cmath>
 23 #include <cstring>
 24 #include <climits>
 25 #include <cctype>
 26 using namespace std;
 27 #define XINF INT_MAX
 28 #define INF 0x3FFFFFFF
 29 #define MP(X,Y) make_pair(X,Y)
 30 #define PB(X) push_back(X)
 31 #define REP(X,N) for(int X=0;X<N;X++)
 32 #define REP2(X,L,R) for(int X=L;X<=R;X++)
 33 #define DEP(X,R,L) for(int X=R;X>=L;X--)
 34 #define CLR(A,X) memset(A,X,sizeof(A))
 35 #define IT iterator
 36 typedef long long ll;
 37 typedef pair<int,int> PII;
 38 typedef vector<PII> VII;
 39 typedef vector<int> VI;
 40 int Scan() {
 41     int res=0, ch;
 42     while(ch=getchar(), ch<'0'||ch>'9');
 43     res=ch-'0';
 44     while((ch=getchar())>='0'&&ch<='9')
 45         res=res*10+ch-'0';
 46     return res;
 47 }
 48 void Out(int a) {
 49     if(a>9)
 50         Out(a/10);
 51     putchar(a%10+'0');
 52 }
 53 int a[100010];
 54 int vis[100010];
 55 int pos[100010];
 56 int fa[100010];
 57 int dp[600010];
 58 int ans[100010];
 59 set<int> ms;
 60 int n;
 61 set<int>::IT it;
 62 int find(int x){
 63     if(fa[x]!=x)fa[x] = find(fa[x]);
 64     return fa[x];
 65 }
 66 void push_up(int cur){
 67     dp[cur] = max(dp[cur<<1],dp[cur<<1|1]);
 68 }
 69 void build(int l,int r,int cur){
 70     if(l==r){
 71         dp[cur] = a[l];
 72         return;
 73     }
 74     int mid = (l+r)>>1;
 75     build(l,mid,cur<<1);
 76     build(mid+1,r,cur<<1|1);
 77     push_up(cur);
 78 }
 79 void update(int l,int r,int cur,int x,int inc){
 80     if(l==r&&l==x){
 81         dp[cur] = inc;
 82         return;
 83     }
 84     int mid = (l+r)>>1;
 85     if(x<=mid)update(l,mid,cur<<1,x,inc);
 86     else update(mid+1,r,cur<<1|1,x,inc);
 87     push_up(cur);
 88 }
 89 void update(int x,int num){
 90     update(1,n,1,x,num);
 91 }
 92 int query(int l,int r,int lx,int rx,int cur){
 93     if(l>=lx&&r<=rx)return dp[cur];
 94     if(lx>r||rx<l)return 0;
 95     int mid = (l+r)>>1;
 96     return max(query(l,mid,lx,rx,cur<<1),query(mid+1,r,lx,rx,cur<<1|1));
 97 }
 98 int query(int l,int r){
 99     return query(1,n,l,r,1);
100 }    
101 int main(){
102     int t;
103     t = Scan();
104     while(t--){
105         n = Scan();
106         for(int i = 1;i<=n;i++){
107             a[i] = Scan();
108             vis[i] = 0;
109             pos[a[i]] = i;
110             fa[i] = i;
111         }
112         for(int i=0;i<=3*n;i++)dp[i] = 0;
113         build(1,n,1);
114         ms.clear();
115         ms.insert(0);
116         ms.insert(-INF);
117         for(int i=1;i<=n;i++){
118             if(vis[i])continue;
119             int l;
120             int posi = pos[i];
121             int maxx = find(i);
122             int p =pos[maxx];
123             if(posi+1<=n&&!vis[a[posi+1]]){
124                 if(a[posi+1]>maxx){
125                     p = posi+1;
126                     maxx = a[p];
127                 }
128             }
129             if(posi>1){
130                 it = ms.upper_bound(-posi);
131                 l = *it;
132                 l = -l;
133                 l++;
134                 int tmp = query(l,posi);
135                 //tmp = find(tmp);
136                 //cout<<l<<" "<<tmp<<endl;
137                 if(tmp>maxx){
138                     maxx = tmp;
139                     p = pos[tmp];
140                 }
141             }
142             if(p==posi){
143                 ans[i] = i;
144                 vis[i] = 1;
145                 ms.insert(-posi);
146             }else if(p==posi+1){
147                 fa[maxx] = fa[i];
148                 //ans[posi] = maxx;
149                 update(p,0);
150             }else{
151                 ans[i] = a[p];
152                 vis[a[p]] = 1;
153                 for(int j=p+1;j<=posi;j++){
154                     ans[a[j-1]] = a[j];
155                     vis[a[j]] = 1;
156                 }
157                 ms.insert(-posi);
158             }
159         /*    cout<<i<<" "<<p<<" "<<maxx<<endl;
160             for(int i=1;i<=n;i++){
161                 cout<<ans[i]<<" ";
162             }
163             cout<<endl;*/
164         }
165         for(int i=1;i<=n;i++){
166             if(i!=1)putchar(' ');
167             Out(ans[i]);
168         }
169         puts("");
170     }
171     return 0;
172 }
173                 
174                       

轉載于:https://www.cnblogs.com/fraud/p/4690549.html