A
c[1]-b[1]=0,之后每个c[1]-b[1]最大都是maxa-mina,最大和最小放前两个
B
ans=2^(a+1)-2^s-1,1一个最小
C
我们可以把式子化为(....)||(....)||(....)括号里没有||,如果括号全是1那么A赢,A尽量选择把1选在一起
D
如果存在LR,则这两个位置无法交换,相当于中间断开了。对于a[i],我们要将它换到i,如果中间存在断点,则无法交换成功。我们用差分维护需要没有断点的位置,在每次询问中判断这些没有断点的位置是否存在断点。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int T,n,q,p[N],cha[N],sum[N],cnt;
string s;
void init()
{cnt=0;for(int i=0;i<=n+1;i++)sum[i]=cha[i]=0;
}
void solve()
{cin>>n>>q;init();for(int i=1;i<=n;i++)cin>>p[i];for(int i=1;i<=n;i++){int a=min(i,p[i]),b=max(i,p[i]);if(a==b) continue;cha[a]++;cha[b]--;}for(int i=1;i<n;i++)sum[i]=sum[i-1]+cha[i];cin>>s;s=" "+s;s[n+1]=' ';for(int i=1;i<n;i++){if(s[i]=='L'&&s[i+1]=='R'&&sum[i]) cnt++;}while(q--){int pos;cin>>pos;if(s[pos]=='R'){if(s[pos+1]=='R'&&sum[pos]) cnt++;if(s[pos-1]=='L'&&sum[pos-1]) cnt--;s[pos]='L';}else if(s[pos]=='L'){if(s[pos-1]=='L'&&sum[pos-1]) cnt++;if(s[pos+1]=='R'&&sum[pos]) cnt--;s[pos]='R';}//cout<<cnt<<endl;if(!cnt) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
}
signed main()
{ios::sync_with_stdio(false);cin.tie();cout.tie();cin>>T;while(T--) solve();
}