Submission #331816

#TimeUsernameProblemLanguageResultExecution timeMemory
331816Ruxandra985Lucky Numbers (RMI19_lucky)C++14
100 / 100
183 ms25452 KiB
/**
* user:  nanu-c77
* fname: Ruxandra Laura
* lname: Nanu
* task:  lucky
* score: 100.0
* date:  2019-10-10 08:55:53.410673
*/
#include <cstdio>
#include <vector>
#include <algorithm>
#define DIMN 100010
#define MOD 1000000007
using namespace std;
int dpst[2][2][2],n,q;
char s[DIMN];
long long aint[4*DIMN][12];
long long sol[12],sa[12];
int ok;
vector <pair <int,int> > stari[12];
int calcul_dp_subtask(){

    int i,curr,j;
    /// este prefix = 1
    for (i=0;i<s[1];i++)
        dpst[1][0][(i==1)] ++;
    dpst[1][1][(s[1] == 1)] = 1;

    for (i=2;i<=n;i++){
        curr = (i&1);
        dpst[curr][0][0] = dpst[curr][0][1] = dpst[curr][1][0] = dpst[curr][1][1] = 0;
        if (s[i]==3 && s[i-1] == 1)
            dpst[curr][1][0] = 0; /// nu mai poi continua prefixul
        else dpst[curr][1][(s[i]==1)] = dpst[1-curr][1][(s[i-1] == 1)];
        /// acum nu mai vrem sa fie prefix
        for (j=0;j<10;j++){
            if (j!=3)/// iei orice
                dpst[curr][0][(j==1)] =((dpst[curr][0][(j==1)] + dpst[1-curr][0][0]) % MOD + dpst[1-curr][0][1])%MOD;
            else dpst[curr][0][(j==1)] =(dpst[curr][0][(j==1)] + dpst[1-curr][0][0]) % MOD;
        }
        for (j=0;j<s[i];j++){
            if (j!=3)/// iei orice
                dpst[curr][0][(j==1)] =((dpst[curr][0][(j==1)] + dpst[1-curr][1][0]) % MOD + dpst[1-curr][1][1])%MOD;
            else dpst[curr][0][(j==1)] =(dpst[curr][0][(j==1)] + dpst[1-curr][1][0]) % MOD;
        }
    }
    return ((dpst[n%2][0][0] + dpst[n%2][0][1] )%MOD + (dpst[n%2][1][0] + dpst[n%2][1][1] )%MOD);

}

int state (int x , int y , int z){
    return x * 4 + z + 2*y;
}

void compatibil (){
    int x,y,z,xx,yy,zz,xf,yf,zf;
    for (x=0;x<3;x++){
        for (xx=0;xx<3;xx++){
            for (y=0;y<2;y++){
                for (yy=0;yy<2;yy++){
                    for (z=0;z<2;z++){
                        for (zz=0;zz<2;zz++){
                            /// este xyz compatibil cu xx yy zz?
                            if (z && yy) /// contine 13
                                continue;
                            if (!x){
                                xf = xx;
                            }
                            else if (x == 1)
                                xf = 1;
                            else xf = 2;

                            yf = y;

                            zf = zz;

                            stari[state(xf,yf,zf)].push_back(make_pair(state(x,y,z) , state(xx,yy,zz)));

                        }
                    }
                }
            }
        }
    }
}


void build (int nod,int st,int dr ){
    int mid = (st + dr)/2,i,j,x,y;
    if (st==dr){
        for (i=0;i<10;i++){
            if (i<s[st]){
                if (i==1)
                    aint[nod][5]++;
                else if (i==3)
                    aint[nod][6]++;
                else aint[nod][4]++;
            }
            else if (i==s[st]){
                if (i==1)
                    aint[nod][1]++;
                else if (i==3)
                    aint[nod][2]++;
                else aint[nod][0]++;
            }
            else {
                if (i==1)
                    aint[nod][9]++;
                else if (i==3)
                    aint[nod][10]++;
                else aint[nod][8]++;
            }
        }
        return;
    }
    build(2*nod,st,mid);
    build(2*nod+1,mid+1,dr);
    ///LE COMBINI
    for (i=0;i<12;i++){
        for (j=0;j<stari[i].size();j++){
            x = stari[i][j].first;
            y = stari[i][j].second;
            aint[nod][i] = (aint[nod][i] + (aint[2*nod][x] * aint[2*nod+1][y])%MOD)%MOD;

        }
    }

}

void query (int nod,int st,int dr,int x,int y){
    int mid = (st + dr)/2,i,j,xx,yy;
    if (x<=st && dr<=y){
        if (!ok){
            for (i=0;i<12;i++)
                sol[i] = aint[nod][i];
            ok = 1;
            return;
        }
        for (i=0;i<12;i++){
            sa[i] = sol[i];
            sol[i] = 0;
        }
        for (i=0;i<12;i++){
            for (j=0;j<stari[i].size();j++){
                xx = stari[i][j].first;
                yy = stari[i][j].second;
                sol[i] = (sol[i] + (sa[xx] * aint[nod][yy])%MOD)%MOD;

            }
        }
        return;
    }
    if (x<=mid)
        query(2*nod,st,mid,x,y);
    if (mid+1<=y)
        query(2*nod+1,mid+1,dr,x,y);

}

void update (int nod,int st,int dr,int p,int cf){
    int mid = (st + dr)/2,i,j,x,y;
    if (st==dr){
        s[st] = cf;
        for (i=0;i<12;i++)
            aint[nod][i] = 0;
        for (i=0;i<10;i++){
            if (i<s[st]){
                if (i==1)
                    aint[nod][5]++;
                else if (i==3)
                    aint[nod][6]++;
                else aint[nod][4]++;
            }
            else if (i==s[st]){
                if (i==1)
                    aint[nod][1]++;
                else if (i==3)
                    aint[nod][2]++;
                else aint[nod][0]++;
            }
            else {
                if (i==1)
                    aint[nod][9]++;
                else if (i==3)
                    aint[nod][10]++;
                else aint[nod][8]++;
            }
        }
        return;
    }
    if (p<=mid)
        update(2*nod,st,mid,p,cf);
    else update(2*nod+1,mid+1,dr,p,cf);
    ///LE COMBINI
    for (i=0;i<12;i++){
        aint[nod][i] = 0;
        for (j=0;j<stari[i].size();j++){
            x = stari[i][j].first;
            y = stari[i][j].second;
            aint[nod][i] = (aint[nod][i] + (aint[2*nod][x] * aint[2*nod+1][y])%MOD)%MOD;

        }
    }

}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int q,t,a,b,i;
    fscanf (fin,"%d%d\n",&n,&q);
    fgets (s+1,DIMN,fin);
    for (int i=1;i<=n;i++)
        s[i]-='0';
    if (!q){
        fprintf (fout,"%d",calcul_dp_subtask());
        return 0;
    }
    compatibil(); /// build graf stari
    build(1,1,n);
    long long sum = 0;
    for (i=0;i<8;i++){
        sum = (sum + aint[1][i])%MOD;
    }
    fprintf (fout,"%lld\n",sum);
    for (;q;q--){
        fscanf (fin,"%d%d%d",&t,&a,&b);
        if (t==1){ /// query interval ab
            ok = 0;
            for (i=0;i<12;i++)
                sol[i] = 0;
            query(1,1,n,a,b);
            long long sum = 0;
            for (i=0;i<8;i++){
                sum = (sum + sol[i])%MOD;
            }
            fprintf (fout,"%lld\n",sum);
        }
        else { /// update element
            update (1,1,n,a,b);
        }
    }
    return 0;
}

Compilation message (stderr)

lucky.cpp: In function 'void build(int, int, int)':
lucky.cpp:120:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |         for (j=0;j<stari[i].size();j++){
      |                  ~^~~~~~~~~~~~~~~~
lucky.cpp: In function 'void query(int, int, int, int, int)':
lucky.cpp:144:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |             for (j=0;j<stari[i].size();j++){
      |                      ~^~~~~~~~~~~~~~~~
lucky.cpp: In function 'void update(int, int, int, int, int)':
lucky.cpp:197:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  197 |         for (j=0;j<stari[i].size();j++){
      |                  ~^~~~~~~~~~~~~~~~
lucky.cpp: In function 'int main()':
lucky.cpp:211:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  211 |     fscanf (fin,"%d%d\n",&n,&q);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~
lucky.cpp:212:11: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
  212 |     fgets (s+1,DIMN,fin);
      |     ~~~~~~^~~~~~~~~~~~~~
lucky.cpp:227:16: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  227 |         fscanf (fin,"%d%d%d",&t,&a,&b);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:862,
                 from /usr/include/c++/9/cstdio:42,
                 from lucky.cpp:9:
In function 'char* fgets(char*, int, FILE*)',
    inlined from 'int main()' at lucky.cpp:212:11:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:260:26: warning: call to '__fgets_chk_warn' declared with attribute warning: fgets called with bigger size than length of destination buffer [-Wattribute-warning]
  260 |  return __fgets_chk_warn (__s, __bos (__s), __n, __stream);
      |         ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...