【习题总结】差分问题

for(int i=2;i<=n;i++)     if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
	cout<<ans+a[1];

  类似地: 此题的操作数也是差分相加减,修改前缀,加上基准值即可。

#include<bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define LL long long
    #define PII pair<int, int> 
    #define PDD pair<double,double>
    using namespace std;
    typedef long long readtype;
    const int maxn = 1e5 + 5;
    const int inf = INT_MAX;
    const LL mod = 1e9 + 7;
    const double eps=1e-6;
     
    LL T;
     
    inline readtype read(){
          
   
    	readtype X=0; bool flag=1; char ch=getchar();
    	while(ch<0||ch>9) {
          
   if(ch==-) flag=0; ch=getchar();}
    	while(ch>=0&&ch<=9) {
          
   X=(X<<1)+(X<<3)+ch-0; ch=getchar();}
    	if(flag) return X;
    	return ~(X-1);
    }
     
    inline int double_cmp(double a,double b)
    {
          
   
        if(fabs(a-b)<eps) return 0;
        if(a<b) return -1;
        return 1;
    }
     
    int main(){
          
    
    	T = read();
    	while(T--)
    	{
          
   
    		int n = read();
    		int cnt_a=0,cnt_b=0;
    		string s1,s2;
    		cin>>s1;
    		cin>>s2;
    		s1=$ +s1;
    		s2=$ +s2;
    		if(s1[1]!=s2[1] || s1[n]!=s2[n])
    		{
          
   
    			cout<<-1<<endl;
    			continue;
    		}
    		vector<int> a(n+1,0);
    		vector<int> b(n+1,0);
    		vector<int> diff_a(n+1,0);
    		vector<int> diff_b(n+1,0);
    		for(int i=1;i<=n;i++)
    		{
          
   
    			a[i]=s1[i]-0;
    			diff_a[i]=a[i]^a[i-1];
    			b[i]=s2[i]-0;
    			diff_b[i]=b[i]^b[i-1];
    			if(i!=1)
    			{
          
   
    				cnt_a+=diff_a[i];
    				cnt_b+=diff_b[i];
    			}
    		}
    		if(cnt_a==cnt_b)
    		{
          
   
    			LL res=0;
    			int i=2,j=2;
    			while(i<=n && j<=n)
    			{
          
   
    				if(diff_b[j] && diff_a[i])
    				{
          
   
    					res+=abs(i-j);
    					i++;
    					j++;
    				}
    				else if(diff_b[j] && !diff_a[i]) i++;
    				else if(!diff_b[j] && diff_a[i]) j++;
    				else
    				{
          
   
    					i++;
    					j++;
    				}
    			}
    			cout<<res<<endl;
    		}
    		else
    		{
          
   
    			cout<<-1<<endl;
    		}
    	}
    	return 0;
    }
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define LL long long
#define PII pair<int, int> 
#define PDD pair<double,double>
using namespace std;
const int maxn = 1e5 + 5;
const int inf = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int T;

inline int read(){
          
   
	int X=0; bool flag=1; char ch=getchar();
	while(ch<0||ch>9) {
          
   if(ch==-) flag=0; ch=getchar();}
	while(ch>=0&&ch<=9) {
          
   X=(X<<1)+(X<<3)+ch-0; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}

 
int main(){
          
    
	T = read();
	while(T--)
	{
          
   
		int n = read();
		vector<int> a(n+1);
		for(int i = 1; i <= n; i++)
			a[i]=read();
        vector<int> b;
        for(int i=2;i<=n;i++)
            b.pb((a[i]-a[i-1]+3)%3);
        b.pb((a[1]-a[n]+3)%3);
        int cnta=0,cntb=0;
        for(auto num:b)
        {
          
   
            if(num==1)
                cnta++;
            else if(num==2)
                cntb++;
        }
        if(cnta>=cntb)
            puts("Yes");
        else    
            puts("No");
	}
	return 0;
}
经验分享 程序员 微信小程序 职场和发展