【习题总结】差分问题
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;
}
