제출 #338061

#제출 시각아이디문제언어결과실행 시간메모리
338061NimbostratusRestore Array (RMI19_restore)C++17
45 / 100
202 ms620 KiB
#include <bits/stdc++.h>
#define mt make_tuple
using namespace std;
typedef long long ll;
const ll INF = 1e15;
int N,M;
string ans;
vector<tuple<int,int,int,int>> q; 

int32_t main()
{
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	//freopen("in","r",stdin);
	//freopen("out","w",stdout);
	cin >> N >> M;
	if(N <= 18)
	{
    	q.resize(M);
    	for(int i=0;i<M;i++)
    	{
    		int l,r,k,v;
    		cin >> l >> r >> k >> v;
    		q[i] = mt(l,r,k,v);
    	}
    	for(int i=0;i<(1<<N);i++)
    	{
    		string cur;
    		for(int k=0;k<N;k++)
    			cur = char('0' + !!(i&(1<<k))) + cur;
    		int pre[cur.size()+5];
    		pre[0] = (cur[0] - '0');
    		for(int i=1;i<cur.size();i++)
    			pre[i] = pre[i-1] + (cur[i] - '0');
    		bool flag = 1;
    		for(int i=0;i<M and flag;i++)
    		{
    			int l,r,k,v;
    			tie(l,r,k,v) = q[i];
    			//cout << l << " " << r << " " << k << " " << v << endl;
    			int onecnt = pre[r] - (l == 0 ? 0 : pre[l-1]);
    			if(v == 0)
    				flag = flag and ((r-l+1)-onecnt >= k); 
    			else
    				flag = flag and ((r-l+1)-onecnt < k);
    		}
    		if(flag)
    		{
    			for(int i=0;i<cur.size();i++)
    				cout << int(cur[i]-'0') << " ";
    			return 0;
    		}
    	}
    	cout << -1 << endl;
    }
	else
	{
		for(int i=0;i<N;i++) ans += '2';
		q.resize(M);
		for(int i=0;i<M;i++)
		{
			int l,r,k,v;
			cin >> l >> r >> k >> v;
			q[i] = mt(l,r,k,v);
		}
		for(int i=0;i<M;i++)
		{
			int l,r,k,v;
			tie(l,r,k,v) = q[i];
			if(v == 1 and k == 1)
				for(int i=l;i<=r;i++)
					ans[i] = '1';
			if(v == 0 and k == r-l+1)
				for(int i=l;i<=r;i++)
					if(ans[i] == '1')
					{
						cout << -1 << endl;
						return 0;
					}
					else
						ans[i] = '0';
		}
		for(int i=0;i<M;i++)
		{
			int l,r,k,v;
			tie(l,r,k,v) = q[i];
			if(v == 0 and k == 1)
			{
				bool flag = 0;
				for(int i=l;i<=r;i++)
				{
					if(ans[i] == '0')
						flag = 1;
					if(ans[i] == '2' and !flag)
					{
						ans[i] = '0';
						flag = 1;
					}
				}
				if(!flag)
				{
					cout << -1 << endl;
					return 0;
				}
			}
			if(v == 1 and k == r-l+1)
			{
				bool flag = 0;
				for(int i=l;i<=r;i++)
				{
					if(ans[i] == '1') flag = 1;
					if(ans[i] == '2' and !flag)
					{
						ans[i] = '1';
						flag = 1;
					}
				}
				if(!flag)
				{
					cout << -1 << endl;
					return 0;
				}
			}
		}
		for(int i=0;i<N;i++)
			cout << (ans[i] == '2' ? '1' : ans[i]) << " ";
	}
}

컴파일 시 표준 에러 (stderr) 메시지

restore.cpp: In function 'int32_t main()':
restore.cpp:34:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |       for(int i=1;i<cur.size();i++)
      |                   ~^~~~~~~~~~~
restore.cpp:50:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   50 |        for(int i=0;i<cur.size();i++)
      |                    ~^~~~~~~~~~~
restore.cpp:74:6: warning: suggest explicit braces to avoid ambiguous 'else' [-Wdangling-else]
   74 |    if(v == 0 and k == r-l+1)
      |      ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...