제출 #71437

#제출 시각아이디문제언어결과실행 시간메모리
71437zscoderRope (JOI17_rope)C++17
45 / 100
2555 ms8704 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace std;
using namespace __gnu_pbds;
 
#define fi first
#define se second
#define mp make_pair
#define pb push_back
 
typedef long long ll;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef long double ld; 
typedef tree<ii, null_type, less<ii>, rb_tree_tag, tree_order_statistics_node_update> pbds;

set<string> S;
const int N = 20;
void gen()
{
	queue<string> q;
	q.push("10");S.insert("10");
	q.push("11");S.insert("11");
	q.push("00");S.insert("00");
	while(!q.empty())
	{
		string s=q.front(); q.pop();
		for(int i=0;i<s.length();i++)
		{
			string t=s.substr(0,i+1);
			reverse(t.begin(),t.end());
			t+=s;
			if(t.length()<=N&&S.find(t)==S.end())
			{
				S.insert(t); q.push(t);
			}
		}
		reverse(s.begin(),s.end());
		if(s.length()<=N&&S.find(s)==S.end())
		{
			S.insert(s); q.push(s);
		}
	}
}

int a[1111111];
int ans[1111111];
vector<vi> dp;

int main()
{
	ios_base::sync_with_stdio(0); cin.tie(0);
	//gen();
	//int n; cin>>n;
	/*
	for(auto s:S)
	{
		if(int(s.length())<=n)
		{
			cout<<s<<'\n';
		}
	}
	*/
	/*
	vector<string> L,R;
	for(int i=0;i<(1<<n);i++)
	{
		string s; 
		for(int j=n-1;j>=0;j--)
		{
			if(i&(1<<j)) s+='1';
			else s+='0';
		}
		if(S.find(s)!=S.end())
		{
			R.pb(s);
		}
		else
		{
			L.pb(s);
		}
	}
	cerr<<"ACCEPTED\n";
	for(auto s:R)
	{
		for(int j=0;j<s.length();j+=2)
		{
			int cur=s[j]-'0'; int nxt=s[j+1]-'0';
			cerr<<cur*2+nxt;
		}
		cerr<<'\n';
	}
	cerr<<'\n';
	*/
	int n,m; cin>>n>>m;
	for(int i=0;i<m;i++) ans[i]=int(1e9);
	for(int i=0;i<n;i++)
	{
		cin>>a[i]; a[i]--;
	}
	for(int i=0;i<m;i++)
	{
		for(int j=i;j<m;j++)
		{
			//all 0 or 3
			int mx=0;
			if(n&1) mx+=(a[0]==i||a[0]==j);
			for(int k=(n&1);k<n;k+=2)
			{
				mx+=max((a[k]==i)+(a[k+1]==i),(a[k]==j)+(a[k+1]==j));
			}
			//special pattern
			{
				int as = 0;
				dp.resize(n);
				for(int i=0;i<n;i++) dp[i].assign(4,-int(1e9));
				if(n&1)
				{
					dp[0][0] = (a[0]==i);
					dp[0][1] = (a[0]==j);
				}
				for(int k=(n&1);k<n;k+=2)
				{
					for(int l=0;l<4;l++)
					{
						if(k==0)
						{
							dp[k][l]=0;
						}
						else
						{
							if(l==0) 
							{
								dp[k][l]=max(dp[max(k-2,0)][0], dp[max(k-2,0)][2]);
							}
							else if(l==1)
							{
								dp[k][l]=max(dp[max(k-2,0)][0], dp[max(k-2,0)][2]);
							}
							else if(l==2)
							{
								dp[k][l]=max(dp[max(k-2,0)][1], dp[max(k-2,0)][3]);
							}
							else
							{
								dp[k][l]=max(dp[max(k-2,0)][3],dp[max(k-2,0)][1]);
							}
						}
						dp[k][l]+=(l&1?a[k+1]==j:a[k+1]==i);
						dp[k][l]+=(l/2?a[k]==j:a[k]==i);
					}
				}
				for(int i=0;i<4;i++) as=max(as,dp[n-2][i]);
				mx=max(mx,as);
			}
			ans[i]=min(ans[i],n-mx); ans[j]=min(ans[j],n-mx);
		}
	}	
	for(int i=0;i<m;i++)
	{
		cout<<ans[i]<<'\n';
	}
}	

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

rope.cpp: In function 'void gen()':
rope.cpp:30:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<s.length();i++)
               ~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...