桂林B题 A plus B
Posted goto_1600
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了桂林B题 A plus B相关的知识,希望对你有一定的参考价值。
我是绝对不会说因为少加了一句if(l>r) return -1;
特判然后拿的铜
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+9;
//char s[maxn];
char s[4][maxn];
int c[maxn];
struct node{
int l;
int r;
int minv;
int maxv;
int lz;
}tr[maxn<<2];
void pushdown(int u){
if(tr[u].lz!=-1){
tr[u<<1].minv=tr[u].lz;
tr[u<<1].maxv=tr[u<<1|1].maxv=tr[u<<1|1].minv=tr[u].lz;
tr[u<<1|1].lz=tr[u<<1].lz=tr[u].lz;
tr[u].lz=-1;
}
}
int n,q;
void pushup(int u){
tr[u].minv=min(tr[u<<1].minv,tr[u<<1|1].minv);
tr[u].maxv=max(tr[u<<1].maxv,tr[u<<1|1].maxv);
}
void build(int u,int l,int r){
tr[u]={l,r,0,0,-1};
if(l==r){
tr[u].minv=tr[u].maxv=c[l];
return ;
}
int mid=l+r>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
int query(int u,int x){
if(tr[u].l==x && tr[u].l==tr[u].r)
{
return tr[u].minv;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(x<=mid) return query(u<<1,x);
else return query(u<<1|1,x);
}
//<9 shu
int query2(int u,int l,int r){
if(l>r) return -1;
if(tr[u].minv>=9) return -1;
if(tr[u].l==tr[u].r){
if(tr[u].minv<9)
return tr[u].l;
return -1;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid){
return query2(u<<1,l,r);
}
else if(l>mid){
return query2(u<<1|1,l,r);
}
else
{
int x=query2(u<<1|1,l,r);
if(x!=-1) return x;
return query2(u<<1,l,r);
}
}
int query3(int u,int l,int r){
if(l>r) return -1;
if(tr[u].maxv==0){
return -1;
}
if(tr[u].l==tr[u].r){
if(tr[u].minv>0) return tr[u].l;
return -1;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(r<=mid){
return query3(u<<1,l,r);
}
else if(l>mid){
return query3(u<<1|1,l,r);
}
else
{
int x=query3(u<<1|1,l,r);
if(x!=-1) return x;
return query3(u<<1,l,r);
}
}
void modify(int u,int l,int r,int x){
// if(l>r) return ;
if(tr[u].l>=l && tr[u].r<=r)
{
tr[u].minv=tr[u].maxv=tr[u].lz=x;
return ;
}
pushdown(u);
int mid=tr[u].l+tr[u].r>>1;
if(l<=mid) modify(u<<1,l,r,x);
if(r>mid) modify(u<<1|1,l,r,x);
pushup(u);
}
int main(){
freopen("in.txt","r",stdin);
freopen("WA.out","w",stdout);
scanf("%d%d",&n,&q);
scanf("%s",s[1]+1);
scanf("%s",s[2]+1);
int t=0;
for(int i=n;i>=1;i--){
c[i]=(s[1][i]-'0'+s[2][i]-'0'+t);
t=c[i]/10;
c[i]%=10;
}
build(1,1,n);
while(q--){
int aa,b,d;
scanf("%d%d%d",&aa,&b,&d);
int tt=s[aa][b]-'0'-d;
tt*=-1;
s[aa][b]=d+'0';
if(tt==0)
{
printf("%d %d\\n",query(1,b),0);
}
else if(tt>0)
{
int xx=query(1,b)+tt;
if(xx<10)
{
modify(1,b,b,xx);
printf("%d %d\\n",xx,2);
}
else
{
int dd=xx/10;
xx%=10;
modify(1,b,b,xx);
int pos=query2(1,1,b-1);
if(pos==-1)
{
modify(1,1,b-1,0);
printf("%d %d\\n",xx,b+1);
}
else
{
int now=query(1,pos);
modify(1,pos,pos,now+1);
modify(1,pos+1,b-1,0);
printf("%d %d\\n",xx,b-pos+2);
}
}
}
else if(tt<0)
{
int xx=query(1,b)+tt;
if(xx>=0)
{
modify(1,b,b,xx);
printf("%d %d\\n",xx,2);
}
else
{
xx+=10;
xx%=10;
modify(1,b,b,xx);
int pos=query3(1,1,b-1);
if(pos==-1){
modify(1,1,b-1,9);
printf("%d %d\\n",xx,b+1);
}
else
{
int now=query(1,pos);
modify(1,pos,pos,now-1);
modify(1,pos+1,b-1,9);
printf("%d %d\\n",xx,b-pos+2);
}
}
}
}
return 0;
}
以上是关于桂林B题 A plus B的主要内容,如果未能解决你的问题,请参考以下文章
FFT(快速傅立叶变换):HDU 1402 A * B Problem Plus
HDU - 1402 A * B Problem Plus FFT裸题
hdu 1402 A * B Problem Plus(FFT)