CCF认证 201903-4消息传递接口 满分

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值