[JZOJ4603] 颜料大乱斗

来源:互联网 发布:php源码怎么搭建网站 编辑:程序博客网 时间:2024/04/20 07:55

Description

这里写图片描述
这里写图片描述

Solution

区间修改区间求种数。

维护c棵线段树,维护区间和。

直接修改每次情况。

查询时只要这个区间内有就答案+1

注意修改和查询时如果已经是0了可以直接退出。(否则会炸时间)

Code

#include<cstdio>#include<cstdlib>#include<cmath>#include<cstring>#include<algorithm>#include<iostream>#define fo(i,a,b) for(i=a;i<=b;i++)#define fod(i,a,b) for(i=a;i>=b;i--)#define ws 100000000using namespace std;struct arr{    int a[1005];}f[1805];int n,k;arr pl(arr a,arr b){    arr c;    int l1=a.a[0],l2=b.a[0];    int i;    memset(c.a,0,sizeof(c.a));    fo(i,1,max(l1,l2))    {        c.a[i]+=a.a[i]+b.a[i];        c.a[i+1]=c.a[i]/ws;        c.a[i]%=ws;    }    c.a[0]=max(l1,l2);    if (c.a[c.a[0]+1]>0) c.a[0]++;    return c;} arr ti(arr a,int b){    arr c;    int l1=a.a[0];    int i,x=0;    memset(c.a,0,sizeof(c.a));    fo(i,1,l1)    {        c.a[i]=a.a[i]*b+x;        x=c.a[i]/ws;        c.a[i]%=ws;    }    c.a[l1+1]=x;    c.a[0]=l1;    if (c.a[l1+1]>0) c.a[0]++;    return c;}int main(){    cin>>n>>k;    if(n==0)     {        cout<<0;        return 0;     }     if (n==1)    {        cout<<k;        return 0;    }    f[1].a[1]=k-1;    f[1].a[0]=1;    f[0].a[0]=1;    int i,j;    fo(i,2,n) f[i]=ti(pl(f[i-1],f[i-2]),k-1);    arr ans=pl(f[n],f[n-1]);    fod(i,ans.a[0],1)    {        j=ws/10;        while (i!=ans.a[0]&&ans.a[i]<j) printf("0"),j/=10;        printf("%d",ans.a[i]);    }}
0 0
原创粉丝点击