2021ccpc桂林B

娶个标题吧

A Plus B Problem Gym - 103409B

题意:有两个等长且长度为n<1e6的字符串a,b,字符串由’0’~’9’组成,第三个字符串由a,b相加得到,长度也为n,溢出的数据不用管。
现在有q<1e6次操作,每次操作可以改变串a或串b的一个数,问改变后,c相应的位置变成了多少,串c又改变了几个数。

``

`






`

踩坑:set的lower_bound是找>=,不是<=!!!其实是我把lower_bound记反了,lower_bound默认就是找>=的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
//lower_bound 返回>=
#include<bits/stdc++.h>
using namespace std;
#define Debug(x) cout<<#x<<':'<<x<<endl
#define INF 0x7fffffff
typedef long long ll;
typedef pair<ll,ll> P;
const ll maxn=1e6+11;
char gra[3][maxn];
set<ll> s;
ll pre(ll x){
auto l=s.lower_bound(x);
l--;
if(*l==0) return 1;
return *l;
}
ll las(ll x){
auto l=s.upper_bound(x);
return *l;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
ll n,q;cin>>n>>q;
for(ll i=1;i<=n;i++) cin>>gra[1][i],gra[1][i]-='0';
for(ll i=1;i<=n;i++) cin>>gra[2][i],gra[2][i]-='0';
gra[1][n+1]=gra[2][n+1]=1;
s.insert(n+1);s.insert(0);
for(ll i=1;i<=n;i++){
if(gra[1][i]+gra[2][i]!=9) s.insert(i);
}
for(ll i=1;i<=q;i++){
ll r,c,d;cin>>r>>c>>d;
ll j=las(c);
ll ago=gra[1][c]+gra[2][c]+(gra[1][j]+gra[2][j]>=10);
ll after=d+gra[3-r][c]+(gra[1][j]+gra[2][j]>=10);
if(gra[r][c]==d){
cout<<after%10<<" "<<"0"<<"\n";
}
else{
if(ago<=9){
if(after>9) cout<<after%10<<" "<<c-pre(c)+2<<"\n";
else cout<<after%10<<" "<<"2"<<"\n";
}
else{
if(after<=9) cout<<after%10<<" "<<c-pre(c)+2<<"\n";
else cout<<after%10<<" "<<"2"<<"\n";
}
gra[r][c]=d;
if(gra[1][c]+gra[2][c]!=9) s.insert(c);
else s.erase(c);
}
}
return 0;
}