1. 程式人生 > >【noip模擬賽9】123法典

【noip模擬賽9】123法典

com ems queue b- 一行 img qq截圖 模擬 時間

描述

很久很久以前,有個叫123的國家,這個國家的國王很喜歡頒布各種法令,並把這些法令記錄在一部《123法典》中。最近這部法典終於被發掘了出來,專家們經過研究發現法典中的法令是按頒布的時間順序記載的只有兩種格式:

技術分享圖片

同時,如果一條法令沒有被其他有效的法令宣布無效,那麽它就是有效的。現在他們想知道那些法令是有效的,你能幫助他們嗎?

輸入

第一行一個數N,表示法典中法令的數目。

接下來N行每行一個字符串,表示一條法令,第i行的法令編號為i。法令按頒布時間順序給出。

輸出

第一行一個數K表示有效法令的數目。

第二行K個數表示有效法令的編號,兩個數中間用一個空格隔開。

輸入樣例 1

5
declare
cancel 1
declare
cancel 2
cancel 3

輸出樣例 1

3
1 4 5

輸入樣例 2

3
declare
declare
declare

輸出樣例 2

3
1 2 3

提示

【數據規模】

對於全部的數據,N <= 100000

WA一半 始終沒找到為什麽錯

技術分享圖片
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define
rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);i--) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define pb push_back #define
fi first #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) /////////////////////////////////// #define inf 0x3f3f3f3f #define N 1000000+50 int in[N]; int vis[N]; vector<int>edge[N]; vector<int>ans; int main() { int n; RI(n); string str; rep(i,1,n) { cin>>str; if(str=="cancel") { int x; RI(x); in[x]+=1; edge[i].pb(x); } } queue<int>q; rep(i,1,n) if(in[i]==0) q.push(i); ans.clear(); while(!q.empty()) { int u=q.front();q.pop(); if(!vis[u]) ans.pb(u); if(edge[u].size()) { int x=edge[u][0]; vis[x]=1; if(edge[x].size() ) { int t=edge[x][0]; in[t]--; if(in[t]==0&&!vis[t]) q.push(t); } } } if(ans.size()) sort(ans.begin(),ans.end()); printf("%d\n",ans.size()); if(ans.size()) rep(i,0,ans.size()-1) { if(i!=0)printf(" "); printf("%d",ans[i]); } return 0; }
View Code

【noip模擬賽9】123法典