Submission #780756

#TimeUsernameProblemLanguageResultExecution timeMemory
780756Rafi22Crossing (JOI21_crossing)C++14
100 / 100
2470 ms195656 KiB
#include <bits/stdc++.h>

using namespace std;

#define endl '\n'
#define st first
#define nd second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define ll long long
ll mod=1000000007;
int inf=1000000007;
ll infl=1000000000000000007;

map<vector<int>,bool>odw;

const int N=200007,pot=1<<18;

int a[N][3];
int b[N][9];
int id[300];

struct tree
{
    int seg[2*pot+7],cnt[2*pot+7][3],lzy[2*pot+7];
    tree()
    {
        memset(seg,0,sizeof seg);
        memset(cnt,0,sizeof cnt);
    }
    void push(int v)
    {
        if(lzy[v]!=-1)
        {
            seg[2*v]=cnt[2*v][lzy[v]];
            lzy[2*v]=lzy[v];
            seg[2*v+1]=cnt[2*v+1][lzy[v]];
            lzy[2*v+1]=lzy[v];
        }
        lzy[v]=-1;
    }
    void upd(int v,int a,int b,int l,int r,int x)
    {
        if(a<=l&&b>=r)
        {
            seg[v]=cnt[v][x];
            lzy[v]=x;
            return;
        }
        if(r<a||l>b) return ;
        push(v);
        upd(2*v,a,b,l,(l+r)/2,x);
        upd(2*v+1,a,b,(l+r)/2+1,r,x);
        seg[v]=seg[2*v]+seg[2*v+1];
    }
};


int n;
vector<tree>T;
void get()
{
    bool ans=0;
    for(int j=0;j<9;j++)
    {
        if(T[j].seg[1]==n) ans=1;
    }
    if(ans) cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    vector<vector<int>>V;
    V.pb({1,0,0});
    odw[{1,0,0}]=1;
    V.pb({0,1,0});
    odw[{0,1,0}]=1;
    V.pb({0,0,1});
    odw[{0,0,1}]=1;
    for(int i=0;i<sz(V);i++)
    {
        for(int j=0;j<i;j++)
        {
            vector<int>X(3);
            for(int l=0;l<3;l++)
            {
                X[l]=(-V[i][l]-V[j][l]+6)%3;
            }
            if(!odw[X])
            {
                V.pb(X);
                odw[X]=1;
            }
        }
    }
    id['J']=0;
    id['O']=1;
    id['I']=2;
    cin>>n;
    string s;
    for(int j=0;j<3;j++)
    {
        cin>>s;
        for(int i=1;i<=n;i++) a[i][j]=id[s[i-1]];
    }
    for(int j=0;j<9;j++)
    {
        tree X;
        for(int i=1;i<=n;i++)
        {
            for(int l=0;l<3;l++)
            {
                b[i][j]=(b[i][j]+a[i][l]*V[j][l])%3;
            }
            X.cnt[i+pot-1][b[i][j]]=1;
        }
        for(int i=pot-1;i>0;i--)
        {
            for(int j=0;j<3;j++) X.cnt[i][j]=X.cnt[2*i][j]+X.cnt[2*i+1][j];
        }
        for(int i=1;i<2*pot;i++) X.lzy[i]=-1;
        T.pb(X);
    }
    int q;
    cin>>q>>s;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<9;j++) T[j].upd(1,i,i,1,pot,id[s[i-1]]);
    }
    get();
    while(q--)
    {
        int l,r;
        char x;
        cin>>l>>r>>x;
        for(int j=0;j<9;j++) T[j].upd(1,l,r,1,pot,id[x]);
        get();
    }

    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:109:48: warning: array subscript has type 'char' [-Wchar-subscripts]
  109 |         for(int i=1;i<=n;i++) a[i][j]=id[s[i-1]];
      |                                                ^
Main.cpp:133:60: warning: array subscript has type 'char' [-Wchar-subscripts]
  133 |         for(int j=0;j<9;j++) T[j].upd(1,i,i,1,pot,id[s[i-1]]);
      |                                                            ^
Main.cpp:141:54: warning: array subscript has type 'char' [-Wchar-subscripts]
  141 |         for(int j=0;j<9;j++) T[j].upd(1,l,r,1,pot,id[x]);
      |                                                      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...