首页 > 其他 > 详细

cf 617C

时间:2020-02-09 20:36:58      阅读:63      评论:0      收藏:0      [点我收藏+]

acm萌新,以后在这个博客更新和记录一些题目吧

cf 617C,本来以为这场div3能上分,结果t3卡住了,然后t4明明很简单但只扫了一眼......t3一直在想双指针,思路太沙雕

正解就是用一个map<pair<int,int>,int>记录最后到达当前位置的是第几个字符,想法就是如果现在到达的位置之前也到达过,那么这段就可以删掉。然后使得可以删掉的长度大小最小,并记录对应的posl,posr。

然后一些细节也弄了挺久,位置各种+1 -1的错...还是太菜了

贴个代码吧

#include<bits/stdc++.h>
using namespace std;
const int inf=200000+10;
map<pair<int,int>,int> mp; //***
int main()
{
	string s;
	int t,i,j,k,n,len,f,posl,posr;
	//freopen("617c.txt","r",stdin);
	cin>>t;
	while (t--)
	  {
	  	int min=inf;
	  	pair<int,int> p=make_pair(0,0);//***
	  	cin>>n;mp.clear();
	  	cin>>s;len=s.length();
	  	posl=-1;posr=-1;
		mp[{p.first,p.second}]=0;
	  	for (i=0;i<len;i++)
	  	  {
	  	  	if (s[i]==‘U‘) p.second++;
	  	  	if (s[i]==‘D‘) p.second--;  	  	  	  	
	  	  	if (s[i]==‘R‘) p.first++;
	  	  	if (s[i]==‘L‘) p.first--;
	  	  	if (mp[{p.first,p.second}]!=0||(p.first==0&&p.second==0))
	  	  	  {
	  	  	  	k=i-mp[{p.first,p.second}]+1;
	  	  	  	if (k<min)
	  	  	  	  {
	  	  	  	  	min=k;
	  	  	  	  	posl=mp[{p.first,p.second}]+1;
	  	  	  	  	posr=i+1;
				  }
			  }
			mp[{p.first,p.second}]=i+1;
		  }
		if (posl==-1&&posr==-1) cout<<-1<<endl;
		else cout<<posl<<‘ ‘<<posr<<endl;
 	  }
 	//fclose(stdin);
 	return 0;
}

  

cf 617C

原文:https://www.cnblogs.com/edmunds/p/12288502.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!