标签:isp mes 子串 实现 procedure test trie list structure
题目链接:https://www.nowcoder.com/acm/contest/141/C
The first line contains two space-separated integer N, M indicating the number of cards and the number of shuffling Eddy has done.
Each of following M lines contains two space-separated integer pi, si indicating that Eddy takes pi-th card from top to (pi+si-1)-th card from top(indexed from 1) and put them on the top of rest cards.
1 ≤ N, M ≤ 105
1 ≤ pi ≤ N
1 ≤ si ≤ N-pi+1
Output one line contains N space-separated integers indicating the final order of the cards from top to bottom.
5 1
2 3
2 3 4 1 5
5 2
2 3
2 3
3 4 1 2 5
题目大意:
给一串长度为N的连续上升序列, K次操作,每次把开头为 st, 长度为 len 的子串与前面的调换。
求经过K次调换,最后的这串东西是什么。
官方题解:二叉平衡树
Main Idea: Data structure, Implementation
We need to keep cutting out some consecutive number and put them in front of the rest list.
Since we need to quick find (p_i)-th element, it would be too slow with linked-list.
The solution is just maintaining the list with treap(or any other balanced binary tree).
Overall Time complexity: O((N+M) \lg N) Overall Space complexity: O(N)
大概思路:
①STL神器 —— rope 时间上勉强解,实现简单粗暴。
②splay (未完待续)
①AC code(4824K 859MS):
1 #include<bits/stdc++.h> 2 #include<ext/rope> 3 using namespace std; 4 using namespace __gnu_cxx; 5 rope<int>A; 6 int main (void){ 7 int n,m; 8 scanf("%d %d",&n,&m); 9 for(int i=1;i<=n;i++){ 10 A.push_back(i); 11 } 12 while(m--){ 13 int l,r; 14 scanf("%d %d",&l,&r); 15 l--; 16 A=A.substr(l,r)+A.substr(0,l)+A.substr(l+r,n-l-r); 17 } 18 for(int i=0;i<n;i++) 19 printf("%d ",A[i]); 20 }
(第三场) C Shuffle Cards 【STL_rope || splay】
标签:isp mes 子串 实现 procedure test trie list structure
原文地址:https://www.cnblogs.com/ymzjj/p/9393752.html