C小沙の不懂(加数据后寄了,重新新增条件判断,已过)

  1. 首先大胆猜测长度大的就一定大?

举例发现7777778 和 8 那么 当7对应为0的时候就相等了

  1. 那么去掉开头连续相同数字后长度还大的就一定大了?

举例发现777778 和 7如果只去了a的7是不够的的,因为当7对应0的时候 b也会少一个数字变成同样1位数了

  1. 那么结论就出来了:首数字相同就一起去掉连续相同的,没相同的就单去掉大的,判断去完后是否还大。写的时候用个变量赋值0和1和再乘被比较的即可合并写了

(旧版结论,加数据后寄了,对拍发现还有一种情况)

  1. 还有13 310这种情况扣完首后变成x0和xy因为已经没有0可以选了所以xy一定>x0 也就是判断原本长度大的,扣完后如果变成一样长,那么第一位不相同的数字是否b是被替换后的0

def solve(a,b):
    if a==b:
        return '='
    else:
        ans='>'#默认a大
        if(len(a)<len(b)):#减小一个大分支
            a,b=b,a
            ans='<'#要变输出的方向
        shou1,shou2=0,0#前面多少个一样的数字
        tong=0
        if(a[0]==b[0]):
            tong=1
        for t in a:
            if t==a[0]:
                shou1+=1
            else:
                break
        for t in b:
            if t==b[0]:
                shou2+=1
            else:
                break
        if len(a)>len(b):
            if len(a)-shou1>len(b)-tong*shou2:
                return ans
            elif len(a)-shou1==len(b)-tong*shou2:#13 310扣完位数相等发现是x0和xy一定存在大于,即第一个不同的数小的为0(被置换后的0)
                zero=a[0]
                a=a[shou1:]#a是长的肯定要首变0扣掉
                b=b[tong*shou2:]#b不一定扣和a首相同才扣
                for i in range(len(a)):
                    if(a[i]!=b[i]):
                        if(b[i]==zero):#又不相同的且小的为0才能维持>,不然最后都要返回不等拉
                            return ans;
                        else:#第一个不相等的出现还不是被置换的0那就只能返回不等了
                            break
        return '!'
a,b=input().split()
print(solve(a,b))



D小沙の赌气

用个优先队列,按照左边界升序,然后每次操作判断当前位置是否大于等于左边界 符合条件说明可以跳转到这个区域的右边界,然后小心有可能右边界比当前位置还小,所以取个max就好了

#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct zone{
	int l,r;
	bool operator<(const zone &rhs) const{
		return l>rhs.l;
	}
};
int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin>>n;
	int d1[n+5],d2[n+5],w1=-1,w2=-1;//每次能到的地方和当前位置
	priority_queue<zone>p1,p2;
	for(int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		p1.push({x-1,y-1});
		zone t=p1.top();
		while(w1+1>=t.l)//使用道具的条件
		{
			w1=max(t.r,w1);//当前远或者能使用的道具抵达的远
			p1.pop();
			if(p1.empty())
				break;
			t=p1.top();
		}
		d1[i]=w1;
			
	}
	for(int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		p2.push({x-1,y-1});//统一下标0
		zone t=p2.top();
		while(w2+1>=t.l)//使用道具的条件
		{
			w2=max(t.r,w2);//当前远或者能使用的道具抵达的远
			p2.pop();
			if(p2.empty())
				break;
			t=p2.top();
		}
		d2[i]=w2;
	}
	for(int i=0;i<n;i++)
	{//开始输出和通关
//		cout<<"d1="<<d1[i]<<" d2="<<d2[i]<<'\n';
		if(d1[i]>d2[i])
			cout<<"sa_win!\n"<<d1[i]-d2[i]<<'\n';
		else if(d1[i]<d2[i])
			cout<<"ya_win!\n"<<d2[i]-d1[i]<<'\n';
		else
			cout<<"win_win!\n0\n";
			
	}
	return 0;
}