1403 有趣的堆疊
基準時間限制:1 秒 空間限制:131072 kb 分值
大家都熟悉堆疊操作。乙個堆疊一般有兩種操作,push和pop。假設所有操作都是合法的並且最終堆疊為空。我們可以有很多方法記錄堆疊的操作,
(1) 對每個pop操作,我們記錄它之前一共有多少個push操作。
(2) 對每個pop操作,我們記錄這個被pop的元素曾經被壓上了幾個。
例如:操作push, push, pop, push, push, pop, push, pop, pop, pop
用第一種方法 記錄為 2, 4, 5, 5, 5
用第二種方法 記錄為 0, 0, 0, 2, 4
這兩種記錄方法可以互相轉化,我們的問題是,給定第二種記錄方法的序列,請求出第一種記錄方法的序列。
input
第一行乙個整數n,表示序列的長度(0 < n <=1000000)output第二行n個整數,表示第二種方法的記錄。
一行,空格分隔的n個整數,表示第一種表示方法的序列。input示例
5output示例0 0 0 2 4
2 4 5 5 5思路:將序列看成括號匹配;當前最末的肯定是),也就是出棧,那麼在這個出棧前有4對括號完整匹配,那麼對應這個入棧是在i-2*ans[i]-1,的位置,
那麼每次你碰到的未操作的都是),然後每次像上面一樣去找入棧點就可以了複雜度o(n);
1 #include2 #include3 #include4 #include5 #include6 #include7 #include
8 #include9 #include10
using
namespace
std;
11 typedef long
long
ll;12
int str[1000005
];13
int str1[2*1000005
];14
int cnt[1000005
];15 inline bool scan_d(int &num)
1625
else num=in-'0'
;26while(in=getchar(),in>='
0'&&in
<='9'
)2730if(isn) num=-num;
31return
true;32
}33int main(void)34
44int u =n;
45for(i = 2*n; i >= 1; i--)
4653 }int ac = 0;54
int k = 1;55
for(i = 1;i <= 2*n;i++)
5661
else
6265
}66 printf("
%d",cnt[1
]);67
for(i = 2;i <= n;i++)
6871 printf("\n"
);72 }return0;
73 }
51nod1403 有趣的堆疊
大家都熟悉堆疊操作。乙個堆疊一般有兩種操作,push和pop。假設所有操作都是合法的並且最終堆疊為空。我們可以有很多方法記錄堆疊的操作,1 對每個pop操作,我們記錄它之前一共有多少個push操作。2 對每個pop操作,我們記錄這個被pop的元素曾經被壓上了幾個。例如 操作push,push,pop...
51nod 1403 有趣的堆疊
大家都熟悉堆疊操作。乙個堆疊一般有兩種操作,push和pop。假設所有操作都是合法的並且最終堆疊為空。我們可以有很多方法記錄堆疊的操作,1 對每個pop操作,我們記錄它之前一共有多少個push操作。2 對每個pop操作,我們記錄這個被pop的元素曾經被壓上了幾個。對於第二種記錄方式,上面壓的個數,即...
51nod1403 有趣的堆疊
看成括號序列的話第二種方法其實就是左括號和右括號之間有多少對完整的括號。include include include includeusing namespace std define rep i,s,t for int i s i t i define dwn i,s,t for int i s...