2021牛客多校10 - Train Wreck(贪心)
生活随笔
收集整理的這篇文章主要介紹了
2021牛客多校10 - Train Wreck(贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出一個合法的括號序列,再給出 nnn 個數字,括號序列對應著入棧和出棧,問是否存在一個合法的順序,使得 nnn 個數字按照括號序列操作后,每次入棧后,棧中的序列都是不同的
題目分析:賽中想的貪心是,先將括號序列填空,用數字 111 開始,能放 111 的位置就放 111,放不了 111 的位置就放 222,這樣貪心將 nnn 個位置填空,然后再用給出的數字嘗試構造合法答案。賽后想明白了這樣貪心是錯誤的,因為對于某個數字 xxx 來說,他最終需要放置的位置,不一定只在一種“空”中出現
參考題解的思路,將括號序列視為一棵樹,每個節點都是相互獨立的,我們只需要保證,對于每個節點的 “兒子節點” 中沒有重復的數字即可。對于節點 xxx,設 szszsz 是 xxx 節點中子節點的個數,那么我們只需要從可用的數字中,找到出現次數前 szszsz 大的數字將其填上即可
代碼:
// Problem: Train Wreck // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/11261/F // Memory Limit: 2097152 MB // Time Limit: 4000 ms // // Powered by CP Editor (https://cpeditor.org)// #pragma GCC optimize(2) // #pragma GCC optimize("Ofast","inline","-ffast-math") // #pragma GCC target("avx,sse2,sse3,sse4,mmx") #include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> #include<cassert> #include<bitset> #include<list> #include<unordered_map> #define lowbit(x) (x&-x) using namespace std; typedef long long LL; typedef unsigned long long ull; template<typename T> inline void read(T &x) {T f=1;x=0;char ch=getchar();while(0==isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(0!=isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();x*=f; } template<typename T> inline void write(T x) {if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0'); } const int inf=0x3f3f3f3f; const int N=2e6+100; char s[N]; int cnt[N],last[N],ans[N]; vector<int>son[N]; priority_queue<pair<int,int>>q; int main() { #ifndef ONLINE_JUDGE // freopen("data.in.txt","r",stdin); // freopen("data.out.txt","w",stdout); #endif // ios::sync_with_stdio(false);int n;read(n);scanf("%s",s+1);int dep=0,tot=0;for(int i=1;i<=n*2;i++) {if(s[i]=='(') {dep++;son[last[dep-1]].push_back(++tot);last[dep]=i;} else {dep--;}}for(int i=1,x;i<=n;i++) {read(x);cnt[x]++;}for(int i=1;i<=n;i++) {if(cnt[i]) {q.push({cnt[i],i});}}for(int i=0;i<=n*2;i++) {if(q.size()<son[i].size()) {return 0*puts("NO");}vector<int>wait;for(int j=0;j<(int)son[i].size();j++) {int id=q.top().second;ans[son[i][j]]=id;cnt[id]--;wait.push_back(id);q.pop();}for(auto x:wait) {if(cnt[x]>0) {q.push({cnt[x],x});}}}puts("YES");for(int i=1;i<=n;i++) {printf("%d ",ans[i]);}return 0; }總結
以上是生活随笔為你收集整理的2021牛客多校10 - Train Wreck(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021牛客多校10 - Browser
- 下一篇: 2021HDU多校9 - 7073 In