社区讨论
关于 set 启发式合并
学术版参与者 2已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @m1rsd2fu
- 此快照首次捕获于
- 2024/10/02 19:30 去年
- 此快照最后确认于
- 2024/10/02 20:57 去年
下面代码 Line 49 的注释与否对输出结果有较大影响,具体表现为在 P11146 中,不注释可以通过除了最后两个点(MLE),注释后只能通过子任务 1。
CPP#include<bits/stdc++.h>
using namespace std;
#define ve vector
#define x first
#define y second
#define ep emplace
#define pb emplace_back
#define de(b) #b,'=',b
#define Sz(k) int((k).size())
#define all(b) begin(b),end(b)
#define rll(k) rbegin(k),rend(k)
namespace BK0717 {
#ifdef Bella
ifstream cin("BK.in"); ofstream cout("BK.out");
void clg(auto x){cerr<<x;} void clg(auto x,auto...y){clg(x),clg(y...);}
#endif
int cn(auto&x,auto y){return x>y?x=y,1:0;}
int cx(auto&x,auto y){return x<y?x=y,1:0;}
template<class T> constexpr T inf=numeric_limits<T>::max()/2;
using LL=long long; using db=double; using pii=pair<int,int>;
constexpr int $N=2e5+7;
set<int>S[$N];
struct BITS {
ve<int>t;
void Init(int n) {
t.assign(n+2,0);
}
void _M(int x,int y) {
for(++x;x<Sz(t);x+=x&-x) t[x]+=y;
}
void M(int l,int r) {
_M(l,1),_M(r,-1);
}
int Q(int x) {
int s=0;
for(++x;x;x-=x&-x) s+=t[x];
return s&1;
}
}T;
void Solve() {
int n,m; cin>>n>>m; T.Init(n);
string a,b; cin>>a>>b;
for(;m--;) {
int l,r; cin>>l>>r,--l;
S[l].ep(r);
}
for(int i=0;i<n;++i) if(Sz(S[i])) {
if(a[i]==b[i]) {
// if(Sz(S[i])>Sz(S[i+1])) S[i].swap(S[i+1]); // add this line is wrong.
for(int r:S[i]) if(i+1<r) S[i+1].ep(r);
}
else {
int lst=*begin(S[i]); S[i].erase(begin(S[i]));
if(a[i]<b[i]!=T.Q(i)) T.M(i,lst);
for(int r:S[i]) S[lst].ep(r),lst=r;
}
}
for(int i=0;i<n;++i) if(T.Q(i)) swap(a[i],b[i]);
cout<<a;
return;
}
void main() {
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T=1;
// cin>>T;
for(;T--;) Solve();
} } main(){BK0717::main();}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...