Submission #239970

#TimeUsernameProblemLanguageResultExecution timeMemory
239970FashoPaint 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);
}

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')
	{

		updateRangeUtil(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;
	updateRangeUtil(1,0,n-1,ind,ind+ar[k]-1,b);
	if(ind==0 && b)
		flag=1;

	return dp[ind][k]=a+b;


}

void updateRangeUtil(int si, int ss, int se, int us, 
                     int ue, int diff) 
{ 
    // If lazy value is non-zero for current node of segment 
    // tree, then there are some pending updates. So we need 
    // to make sure that the pending updates are done before 
    // making new updates. Because this value may be used by 
    // parent after recursive calls (See last line of this 
    // function) 
    if (lazy[si] != 0) 
    { 
        // Make pending updates using value stored in lazy 
        // nodes 
        tree[si] += (se-ss+1)*lazy[si]; 
  
        // checking if it is not leaf node because if 
        // it is leaf node then we cannot go further 
        if (ss != se) 
        { 
            // We can postpone updating children we don't 
            // need their new values now. 
            // Since we are not yet updating children of si, 
            // we need to set lazy flags for the children 
            lazy[si*2 + 1]   += lazy[si]; 
            lazy[si*2 + 2]   += lazy[si]; 
        } 
  
        // Set the lazy value for current node as 0 as it 
        // has been updated 
        lazy[si] = 0; 
    } 
  
    // out of range 
    if (ss>se || ss>ue || se<us) 
        return ; 
  
    // Current segment is fully in range 
    if (ss>=us && se<=ue) 
    { 
        // Add the difference to current node 
        tree[si] += (se-ss+1)*diff; 
  
        // same logic for checking leaf node or not 
        if (ss != se) 
        { 
            // This is where we store values in lazy nodes, 
            // rather than updating the segment tree itelf 
            // Since we don't need these updated values now 
            // we postpone updates by storing values in lazy[] 
            lazy[si*2 + 1]   += diff; 
            lazy[si*2 + 2]   += diff; 
        } 
        return; 
    } 
}
   int getSumUtil(int ss, int se, int qs, int qe, int si) 
{ 
    // If lazy flag is set for current node of segment tree, 
    // then there are some pending updates. So we need to 
    // make sure that the pending updates are done before 
    // processing the sub sum query 
    if (lazy[si] != 0) 
    { 
        // Make pending updates to this node. Note that this 
        // node represents sum of elements in arr[ss..se] and 
        // all these elements must be increased by lazy[si] 
        tree[si] += (se-ss+1)*lazy[si]; 
  
        // checking if it is not leaf node because if 
        // it is leaf node then we cannot go further 
        if (ss != se) 
        { 
            // Since we are not yet updating children os si, 
            // we need to set lazy values for the children 
            lazy[si*2+1] += lazy[si]; 
            lazy[si*2+2] += lazy[si]; 
        } 
  
        // unset the lazy value for current node as it has 
        // been updated 
        lazy[si] = 0; 
    } 
  
    // Out of range 
    if (ss>se || ss>qe || se<qs) 
        return 0; 
  
    // At this point we are sure that pending lazy updates 
    // are done for current node. So we can return value  
    // (same as it was for query in our previous post) 
  
    // If this segment lies in range 
    if (ss>=qs && se<=qe) 
        return tree[si]; 
  
    // If a part of this segment overlaps with the given 
    // range 
    int mid = (ss + se)/2; 
    return getSumUtil(ss, mid, qs, qe, 2*si+1) + 
           getSumUtil(mid+1, se, qs, qe, 2*si+2); 
} 
  

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'+getSumUtil(1,0,n-1,0);
	// char a='0'+flag;
	string b;
	b.pb(a);
	fo(i,1,12)
	b.pb('a');
	// cout<<ar[0]<<endl;;
	return b;
	// return "?????XXX?????";
    return att;
}

vector<int> v;
// int main()
// {
// 	fast;
// 	cin>>sss>>n;
// 	fo(i,1,n)
// 	{
// 		int a;
// 		cin>>a;
// 		v.pb(a);
// 	}
// 	cout<<solve_puzzle(sss,v);


// }
// #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 'long long int f(int, int)':
paint.cpp:115:3: error: 'updateRangeUtil' was not declared in this scope
   updateRangeUtil(1,0,n-1,ind,ind+ar[k]-1,b);
   ^~~~~~~~~~~~~~~
paint.cpp:123:2: error: 'updateRangeUtil' was not declared in this scope
  updateRangeUtil(1,0,n-1,ind,ind+ar[k]-1,b);
  ^~~~~~~~~~~~~~~
paint.cpp: In function 'std::__cxx11::string solve_puzzle(std::__cxx11::string, std::vector<int>)':
paint.cpp:261:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(att.size()!=i+1)
      ~~~~~~~~~~^~~~~
paint.cpp:264:33: error: too few arguments to function 'int getSumUtil(int, int, int, int, int)'
  char a='0'+getSumUtil(1,0,n-1,0);
                                 ^
paint.cpp:187:8: note: declared here
    int getSumUtil(int ss, int se, int qs, int qe, int si) 
        ^~~~~~~~~~