Submission #239984

#TimeUsernameProblemLanguageResultExecution timeMemory
239984FashoPaint By Numbers (IOI16_paint)C++14
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#define N 200005
#define ll long long int    
#define MP make_pair
#define pb push_back
#define ppb pop_back
#define sp " "
#define endl "\n"
#define fi first
#define se second
#define ii pair<int,int>
#define lli pair<ll,ll>
#define fast cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false)
#define fast2 freopen ("badhair.gir","r",stdin);freopen ("badhair.cik","w",stdout);
#define mod 1000000007
#define fs(x,y) for(ll i=1;i<=y;i++) cin>>x[i]
#define fo(i,x,y) for(ll i=x;i<=y;i++)
#define INF 1000000000005
#define ull unsigned long long int
#include "paint.h"
using namespace std;
 
ll n,m,ar[N],sum,t,tut[N],tree[6*N],tutb[N],lazy[6*N],pref[N],flag;
 
ll dp[200100][150];
 
string att,sss;
 
void push(int ind,int l,int r)
{
    ll x=lazy[ind];
    tree[ind]+=x;
    lazy[ind]=0;
    if(l==r)
        return;
    lazy[ind*2]+=x;
    lazy[ind*2+1]+=x;
}
 
ll query(ll ind,ll l,ll r,ll a)
{
    if(l>a || r<a)
        return 0;
    push(ind,l,r);
    if(l==r)
        return tree[ind];
    int mid=(l+r)/2;
    ll x=query(ind*2,l,mid,a);
    ll y=query(ind*2+1,mid+1,r,a);
    if(a<=mid)
        return x;
    else
        return y;
    return max(x,y);
}
void upd(int ind,int l,int r,int a,int b,ll val)
{
    if(l>b || r<a)
        return;
    push(ind,l,r);
    if(l>=a && r<=b)
    {
        lazy[ind]+=val;
        push(ind,l,r);
        return;
    }
    int mid=(l+r)/2;
    upd(ind*2,l,mid,a,b,val);
    upd(ind*2+1,mid+1,r,a,b,val);
}
void updateRange(int node, int start, int end, int l, int r, int val)
{
    if(lazy[node] != 0)
    { 
        // This node needs to be updated
        tree[node] += (end - start + 1) * lazy[node];    // Update it
        if(start != end)
        {
            lazy[node*2] += lazy[node];                  // Mark child as lazy
            lazy[node*2+1] += lazy[node];                // Mark child as lazy
        }
        lazy[node] = 0;                                  // Reset it
    }
    if(start > end or start > r or end < l)              // Current segment is not within range [l, r]
        return;
    if(start >= l and end <= r)
    {
        // Segment is fully within range
        tree[node] += (end - start + 1) * val;
        if(start != end)
        {
            // Not leaf node
            lazy[node*2] += val;
            lazy[node*2+1] += val;
        }
        return;
    }
    int mid = (start + end) / 2;
    updateRange(node*2, start, mid, l, r, val);        // Updating left child
    updateRange(node*2 + 1, mid + 1, end, l, r, val);   // Updating right child
    tree[node] = tree[node*2] + tree[node*2+1];        // Updating root with max value 
}
 
int queryRange(int node, int start, int end, int l, int r)
{
    if(start > end or start > r or end < l)
        return 0;         // Out of range
    if(lazy[node] != 0)
    {
        // This node needs to be updated
        tree[node] += (end - start + 1) * lazy[node];            // Update it
        if(start != end)
        {
            lazy[node*2] += lazy[node];         // Mark child as lazy
            lazy[node*2+1] += lazy[node];    // Mark child as lazy
        }
        lazy[node] = 0;                 // Reset it
    }
    if(start >= l and end <= r)             // Current segment is totally within range [l, r]
        return tree[node];
    int mid = (start + end) / 2;
    int p1 = queryRange(node*2, start, mid, l, r);         // Query left child
    int p2 = queryRange(node*2 + 1, mid + 1, end, l, r); // Query right child
    return (p1 + p2);
}
 
ll f(int ind,int k)
{
    if(ind>n)
        return 0;
    if(ind==n && k==m)
    {
        // cerr<<"hello"<<endl;
        return 1;
    }
    if(k>m)
        return 0;
    if(ind==n)
        return 0;
    // cerr<<ind<<sp<<k<<endl;
 
    if(dp[ind][k]!=-1)
        return dp[ind][k];
    ll a=0;
    if(sss[ind]!='X')
        a=f(ind+1,k);
    ll x=0;
    ll b=0;
    if(ind>0)
        x=pref[ind-1];
 
    if(ind+ar[k]<=n && pref[ind+ar[k]-1]-x==0 && sss[ind+ar[k]]!='X' && sss[ind]!='_')
    {
        if(ind+ar[k]==n)
            b=f(ind+ar[k],k+1);
        else
            b=f(ind+ar[k]+1,k+1);
    }
    // cout<<ind<<sp<<k<<sp<<a<<sp<<b<<endl;
    if(sss[ind]=='_')
    {
        tutb[ind]=a;
        return dp[ind][k]=a;
    }
    if(b)
        tutb[ind+ar[k]]=1;
    if(sss[ind]=='X')
    {
 
        upd(1,0,n-1,ind,ind+ar[k]-1,b);
        // upd(1,0,n-1,ind,ind+ar[k]-1,b);
 
        return dp[ind][k]=b;
    }
    tutb[ind]=a;
    // if(b)
    //  cout<<"X"<<sp<<ind<<sp<<k<<endl;
    // if(a)
    //  cout<<"_"<<sp<<ind<<sp<<k<<endl;
    upd(1,0,n-1,ind,ind+ar[k]-1,b);
    // upd(1,0,n-1,ind,ind+ar[k]-1,b);
    if(ind==0 && b)
        flag=1;
 
    return dp[ind][k]=a+b;
 
 
}
 
 
string solve_puzzle(string ss,vector<int> c) 
{
    m=c.size();
    fo(i,0,m-1)
        ar[i]=c[i];
    n=ss.size();
    sss=ss;
    memset(dp,-1,sizeof(dp));
    memset(tree,0,sizeof(tree));
    memset(lazy,0,sizeof(lazy));
    fo(i,0,n)
    {
        pref[i]=pref[i-1];
        if(sss[i]=='_')
            pref[i]++;
    }
    f(0,0);
    att.clear();
    fo(i,0,n-1)
    {
        ll x=query(1,0,n-1,i);
        ll y=tutb[i];
        if(x && !y)
            att.pb('X');
        if(!x && y)
            att.pb('_');
        if(att.size()!=i+1)
        att.pb('?');
    }
    char a='0'+query(1,0,n-1,0,0);
    // char a='0'+flag;
    // cout<<queryRange(1,0,n-1,0,0)<<sp;
    // cout<<query(1,0,n-1,0)<<endl;
    string b;
    b.pb(a);
    fo(i,1,12)
    b.pb('a');
    // cout<<ar[0]<<endl;;
    return b;
    // return "?????XXX?????";
    return att;
}
 
// #include "paint.h"
 
// #include <vector>
// #include <string>
// #include <cstdio>
// #include <cassert>
 
// const int S_MAX_LEN = 200 * 1000;
// char buf[S_MAX_LEN + 1];
 
// int main() {
//     assert(1 == scanf("%s", buf));
//     std::string s = buf;
//     int c_len;
//     assert(1 == scanf("%d", &c_len));
//     std::vector<int> c(c_len);
//     for (int i = 0; i < c_len; i++) {
//         assert(1 == scanf("%d", &c[i]));
//     }
//     std::string ans = solve_puzzle(s, c);
 
 
//     printf("%s\n", ans.data());
//     return 0;
// }

Compilation message (stderr)

paint.cpp: In function 'std::__cxx11::string solve_puzzle(std::__cxx11::string, std::vector<int>)':
paint.cpp:217:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(att.size()!=i+1)
            ~~~~~~~~~~^~~~~
paint.cpp:220:33: error: too many arguments to function 'long long int query(long long int, long long int, long long int, long long int)'
     char a='0'+query(1,0,n-1,0,0);
                                 ^
paint.cpp:40:4: note: declared here
 ll query(ll ind,ll l,ll r,ll a)
    ^~~~~