답안 #471243

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
471243 2021-09-07T21:23:29 Z Carmel_Ab1 Crossing (JOI21_crossing) C++17
0 / 100
4813 ms 1008 KB
#include<bits/stdc++.h>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

//using namespace __gnu_pbds;
using namespace std;

typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
typedef vector<vector<int>> vvi;
typedef vector<ll> vl;
typedef vector<vl> vvl;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<pl> vpl;
typedef vector<ld> vld;
typedef pair<ld, ld> pld;

//typedef tree<ll, null_type, less_equal<ll>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;
template<typename T>
ostream &operator<<(ostream &os, vector<T> &a) {
    os << "[";
    for (int i = 0; i < ll(a.size()); i++) { os << a[i] << ((i != ll(a.size() - 1) ? " " : "")); }
    os << "]\n";
    return os;
}

#define all(x) x.begin(),x.end()
#define YES out("YES")
#define NO out("NO")
#define out(x){cout << x << "\n"; return;}
#define GLHF ios_base::sync_with_stdio(false); cin.tie(NULL)
#define print(x){for(auto ait:x) cout << ait << " "; cout << "\n";}
#define pb push_back
#define umap unordered_map

template<typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) {
    is >> p.first >> p.second;
    return is;
}

template<typename T1, typename T2>
ostream &operator<<(ostream &os, pair<T1, T2> &p) {
    os << "" << p.first << " " << p.second << "";
    return os;
}

void usaco(string taskname) {
    string fin = taskname + ".in";
    string fout = taskname + ".out";
    const char *FIN = fin.c_str();
    const char *FOUT = fout.c_str();
    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);
}

template<typename T>
void read(vector<T> &v) {
    int n = v.size();
    for (int i = 0; i < n; i++)
        cin >> v[i];
}

template<typename T>
vector<T> UNQ(vector<T> a) {
    vector<T> ans;
    for (T t: a)
        if (ans.empty() || t != ans.back())
            ans.push_back(t);
    return ans;
}

ll ceil(ll a, ll b) {
    ll ans = a / b;
    if (a % b)ans++;
    return ans;
}

ld log(ld a, ld b) { return log(b) / log(a); }

ll power(ll base, ll exp, ll M = 1e18) {//(base^exp)%M
    ll ans = 1;
    while (exp) {
        if (exp % 2 == 1)ans = ((ans % M) * (base % M)) % M;
        base = ((base % M) * (base % M)) % M;
        exp /= 2;
    }
    return ans;
}

string to_base(int n, int new_base) {
    string s;
    int nn = n;
    while (nn) {
        s += to_string(nn % new_base);
        nn /= new_base;
    }
    reverse(all(s));
    return s;
}

ll gcd(ll a, ll b) {
    if (a < b)swap(a, b);
    if (b == 0)return a;
    return gcd(b, a % b);
}

ll lcm(ll a, ll b) {
    ll x = (a / gcd(a, b));
    return b * x;
}

vl generate_array(ll n, ll mn = 1, ll mx = 1e18 + 1) {
    if (mx == 1e18 + 1)
        mx = n;
    vl ans(n);
    for (int i = 0; i < n; i++)
        ans[i] = (mn + rand() % (mx - mn + 1));
    return ans;
}

string substr(string s, int l, int r) {
    string ans;
    for (int i = l; i <= r; i++)
        ans += s[i];
    return ans;
}


void solve();

int main() {
    GLHF;
    int t = 1;
    //cin >> t;
    while (t--)
        solve();
}
ll mod=1e9+7,b=31,n;
ll calc(ll l,ll r,ll c){
    ll pr=power(b,n-l,mod)*power(b-1,mod-2,mod);
    ll pl=power(b,n-r,mod)*power(b-1,mod-2,mod);
    pl%=mod,pr%=mod;

    ll p=pr-pl;
    p=(p+mod)%mod;
    p=(c*p)%mod;
    return p;
}
struct Seg{
    ll l,r,m;
    Seg *lp=0,*rp=0;
    ll sum=0,propl=0,propr=0;

    bool is0=0;
    Seg(ll l,ll r):l(l),r(r),m((l+r)/2){
        if(l+1<r){
            lp=new Seg(l,m);
            rp=new Seg(m,r);
        }
    }
    void add_c(ll c){

        sum=(sum+calc(l,r,c))%mod;
        propl=(propl+calc(l,m,c))%mod;
        propr=(propr+calc(m,r,c))%mod;
    }
    void add(ll x){
        sum=(sum+x)%mod;
        propl=(propl+x)%mod;
        propr=(propr+x)%mod;
    }
    void set0(){
        sum=0;
        propl=propr=0;
        if(lp)
            lp->is0=1;
        if(rp)
            rp->is0=1;
        is0=0;
    }
    void push() {
        if (is0)
            set0();
        lp->add(propl);
        rp->add(propr);
        propl=propr=0;
    }

    void upd1(ll a,ll b){
        if(r<=a || b<=l)
            return;
        else if(a<=l && r<=b){
            is0=1;
            set0();
            return;
        }

        if(lp->is0)
            lp->set0();
        if(rp->is0)
            rp->set0();
        push();
        lp->upd1(a,b);
        rp->upd1(a,b);
        sum=(lp->sum+rp->sum)%mod;
    }
    void upd2(ll a,ll b,ll c){
        if(r<=a || b<=l)
            return;
        else if(a<=l && r<=b){
            if(is0)
                set0();
            add_c(c);
            return;
        }
        if(lp->is0)
            lp->set0();
        if(rp->is0)
            rp->set0();
        push();
        lp->upd2(a,b,c);
        rp->upd2(a,b,c);
        sum=(lp->sum+rp->sum)%mod;
    }
    ll query(ll a,ll b){
        if(r<=a || b<=l)
            return 0;
        else if(a<=l && r<=b){
            return sum;
        }
        push();
        return lp->query(a,b)+rp->query(a,b);
    }
};
set<int>vals;
string apply(string s,string t){
    int n=s.size();
    string ans;
    for(int i=0; i<n; i++)
        if(s[i]==t[i])
            ans+=s[i];
        else {
            set<int>v={'J','O','I'};
            v.erase(s[i]);
            v.erase(t[i]);
            ans+=*v.begin();
        }
    return ans;
}
ll mhash(string s){
    ll ans=0,n=s.size();
    for(int i=0; i<n; i++)
        ans=(ans*b)%mod,ans=(ans+s[i]-'A'+1)%mod;
    return ans;
}
void solve() {
    cin >> n;
    vector<string>a(3);
    read(a);

    for(int i=0; i<3; i++)
        vals.insert(mhash(a[i]));
    for(int i=0; i<3; i++)
        for(int j=0;j<3; j++)
            if(i!=j)
                vals.insert(mhash(apply(a[i],a[j])));
    for(int i=0; i<3; i++)
        for(int j=0; j<3; j++)
            for(int k=0; k<3; k++)
                if(i!=j && j!=k && i!=k)
                    vals.insert(mhash(apply(a[i], apply(a[j],a[k]))));
    int q;
    cin >> q;
    string t;
    cin >> t;

    Seg s(0,n+1);
    for(int i=0; i<n; i++)
        s.upd2(i,i+1,t[i]-'A'+1);

    if(vals.count(s.query(0,n)))
        cout << "Yes\n";
    else
        cout << "No\n";
    while(q--){
        ll l,r;
        cin >> l >> r;
        char c ;
        cin >> c;
        l--,r--;
        s.upd1(l,r+1);
        s.upd2(l,r+1,c-'A'+1);
        if(vals.count(s.query(0,n)))
            cout << "Yes\n";
        else
            cout << "No\n";
    }
}

Compilation message

Main.cpp: In function 'void usaco(std::string)':
Main.cpp:56:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   56 |     freopen(FIN, "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:57:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   57 |     freopen(FOUT, "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1946 ms 916 KB Output is correct
2 Correct 2261 ms 884 KB Output is correct
3 Correct 4813 ms 1008 KB Output is correct
4 Incorrect 1676 ms 776 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1946 ms 916 KB Output is correct
2 Correct 2261 ms 884 KB Output is correct
3 Correct 4813 ms 1008 KB Output is correct
4 Incorrect 1676 ms 776 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1946 ms 916 KB Output is correct
2 Correct 2261 ms 884 KB Output is correct
3 Correct 4813 ms 1008 KB Output is correct
4 Incorrect 1676 ms 776 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1946 ms 916 KB Output is correct
2 Correct 2261 ms 884 KB Output is correct
3 Correct 4813 ms 1008 KB Output is correct
4 Incorrect 1676 ms 776 KB Output isn't correct
5 Halted 0 ms 0 KB -