300ms应该不算慢了。虽然结果很好。。但中间很多波折。
教训:
0.好好读题。一开始一个点做了个假题,根本没读懂题意。
1.整行输入时不要开ios::sync_with_stdio(false),好像CCF很少卡字符串的输入输出时间 放心cout cin
现在想想好像还是有些写麻烦了,不用map也可以。
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define MAXN 10001
#include<cstring>
using namespace std;
typedef pair<int,int> P;
set<P> m;
string S;
P PP[MAXN][9];
bool vis[MAXN];
int nex[MAXN],N,pos;
int GetNum(){
int sum=0,ns=S.size();
pos++;
while(S[pos]!=' '&&pos<ns)
sum=sum*10+S[pos++]-'0';
pos++;
return sum;
}
void add(int c,int fan){
int n;
P p;
if(S[pos]=='S')
n=GetNum(),p.first=1,p.second=n;
else
n=GetNum(),p.first=-1,p.second=n;
PP[fan][c]=p;
}
void fu(int i,int j){
// cout<<i<<' '<<j<<endl;
P p=PP[i][j],q;
nex[i]=j+1;
if(PP[i][j+1].second==-1)nex[i]=-1;
if(p.first==1){
q.first=-1,q.second=i;
if(m.count(q)){
m.erase(q),vis[p.second]=1;
if(nex[p.second]!=-1&&nex[p.second]<=j)
if(p.second<i)fu(p.second,nex[p.second]);
}
else
m.insert(p),vis[i]=0;
}
else{
q.first=1,q.second=i;
if(m.count(q)){
m.erase(q),vis[p.second]=1;
if(nex[p.second]!=-1&&nex[p.second]<=j)
if(p.second<i)fu(p.second,nex[p.second]);
}
else
m.insert(p),vis[i]=0;
}
}
void check(){
For(j,1,8)
For(i,0,N-1)
if(PP[i][j].second!=-1&&vis[i])
fu(i,j);
}
void init(){
m.clear();
For(i,0,N-1)For(j,1,8)PP[i][j]=P(0,-1);
For(i,0,N-1)vis[i]=1,nex[i]=0;
}
int main(){
int T,num;
cin>>T>>N;
getchar();
For(g,1,T){
init();
For(i,1,N){
getline(cin,S);
num=1,pos=0;
For(j,0,S.size()-1)if(S[j]==' ')num++;
For(j,1,num)add(j,i-1);
}
check();
if(m.size())cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}