娶个标题吧
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
| #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; }
|