2022/10/24(cf·div2#829)https://codeforces.com/contest/1754

https://codeforces.com/contest/1754/problem/A

//用一个变量x记录遇到问题时需要解决的数量
//当需要解决问题的数量小于等于0时,全部解决
//遇到新问题时,如果此时遇到新问题,那么x是从非负数计,小于0时,前面的A不能抵Q;

#include
using namespace std;
#define int long long
#define ft first 
#define sd second
int b[200005];

signed main()
{
	int tt ;
	for(cin>>tt;tt--;)
	{
		int n;
		string s;
		cin>>n>>s;
		int x=0;
		for(int i=0;i<s.size();i++)
		{
			if(s[i]=='Q')
			{
				if(x<0)x=0;
				x++;
			}
			else x--;
		}
		if(x>0)puts("NO");
		else puts("YES");
	}
}

https://codeforces.com/contest/1754/problem/B

//中间值到两边的距离是它能到的范围最大的,不能再大了
//平行关系,你加我也加,差值不变

#include
using namespace std;
#define int long long
#define ft first 
#define sd second
int b[200005];

signed main()
{
	int tt ;
	for(cin>>tt;tt--;)
	{
		int n;
		cin>>n;
		int l=1,r=n/2+1;
		while(l<=n/2)
		{
			cout<<r<<" "<<l<<" ";
			r++,l++;
		}
		if(n&1)cout<<n;
		puts("");
	}
}

https://codeforces.com/contest/1754/problem/C1

//更玩游戏是一样的
//注意观察,会发现,邻居和自己是相同的数是能合并为0的
//so,消消乐嘛,用栈模拟一下,用栈存数的位置,b[i]就不多说了吧,一一对应的
//栈最后的元素一定是不能再消除的
//当栈最后的元素代表的和不为0时,说明不能变成0,输出-1
//最头疼的是把位置输出,好理解,模拟得慢慢来,上代码

#include
using namespace std;
#define int long long
#define P pair<int,int>
#define ft first 
#define sd second
int b[200005];

signed main()
{
	int tt ;
	for(cin>>tt;tt--;)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>b[i];
		
		P p[20005];
		stack<int>s;
		int t=0,ans=0;
		
		for(int i=1;i<=n;i++)
		{
			if(s.empty()==0&&b[s.top()]==b[i])
				s.pop();
			else s.push(i);
		}
		if(s.empty())
		{
			cout<<1<<'\n';
			cout<<1<<" "<<n<<'\n';
			continue;
		}
		int flag=0;
		while(s.empty()==0)
		{
			if(flag==0)//说明第一次进
			{
				if(s.top()!=n)//说明n被合并了,要加上这组合并项
				{
					p[t].sd=n;
					p[t++].ft=s.top()+1;
				}
				flag=1;
			}
			p[t].sd=s.top();//选好参照物,栈里面的元素,一定都是每组合并项的尾巴
			ans+=b[s.top()];//它肯定在栈里,且栈有几个元素,进几次大while循环
			if(s.size()==1)//最后一个元素
			{
				p[t++].ft=1;break;//尾巴是它自己,头一定是1,无需再走下去,break一下
			}
			s.pop();//别忽略了
			p[t++].ft=s.top()+1;//中间情况,头是下一个尾巴的后一个位置
		}
		if(ans){puts("-1");continue;}
		cout<<t<<'\n';
		for(int i=t-1;i>=0;i--)//逆向
			cout<<p[i].ft<<" "<<p[i].sd<<'\n';
	}
}

//都是自己想的,不容易啊

你可能感兴趣的:(gaogesing的作业,1024程序员节)