求 hack & 加速
查看原帖
求 hack & 加速
320423
s4CRIF1CbUbbL3AtIAly楼主2024/7/19 21:17

rt,现在 sub1 WA 了 #7 和 #10,sub4 最后两个点超时了,求 hack(最好能给出代码修改方法)以及卡常。

做法应该是对的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<int,ll> pil;
#define fi first
#define se second
#define endl '\n'
#define mp make_pair
#define pb push_back
#define all(x) x.begin(),x.end()
#define Cl(x) memset(x,0,sizeof(x))
const bool DC=0;
const ll mod=0;
const int N=100005;
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll qpow(ll a,ll b,ll p=mod){ll ans=1;for(;b;b>>=1,a=a*a%p)if(b&1)ans=ans*a%p;return ans;}
void NO(){cout<<"NO\n";}
void YES(){cout<<"YES\n";}
mt19937 rnd((unsigned long long)new char);

bitset<10>emp;
int mnl=16;

string calc(string last,vector<bitset<10>>need){
	// cerr<<last<<" "<<need.size()<<"\n";
	if(last.size()>mnl)return "#";
	if(need.size()<=1){
		if(need.size()==0){
			while(last[0]=='0')last.erase(last.begin(),last.begin()+1);
			mnl=min(mnl,(int)last.size());
			return last;
		}
		if(!need[0].count()){
			while(last[0]=='0')last.erase(last.begin(),last.begin()+1);
			return mnl=min(mnl,(int)last.size()),last;
		}
		string ans;
		if(need[0].count()&&need[0][0]){
			auto it=need[0]._Find_next(0);
			if(it==10){
				ans+="10";
			}else ans+=char(it+48),ans+="0";
			for(it=need[0]._Find_next(it);it<10;it=need[0]._Find_next(it))ans+=char(it+48);
		}else for(int i=0;i<10;i++)if(need[0][i])ans+=char(i+48);
		if((ans+last)[0]=='0')return mnl=min(mnl,(int)("1"+ans+last).size()),"1"+ans+last;
		return mnl=min(mnl,(int)(ans+last).size()),ans+last;
	}
	vector<bitset<10>>tmp;
	string ans="#";
	for(int cur=0;cur<=9;cur++){
		tmp.clear();
		for(int now=cur;now<=cur+need.size()-1;now++){
			if(tmp.size()==now/10)tmp.push_back(emp);
			bool f=0;
			if(need[now-cur][now%10])need[now-cur][now%10]=0,f=1;
			tmp[now/10]|=need[now-cur];
			if(f)need[now-cur][now%10]=1;
		}
		// cerr<<"test "<<cur<<"\n";
		while(tmp.size()&&tmp.back()==emp)tmp.pop_back();
		string nxt="";nxt+=char(cur+48),nxt+=last;
		// cerr<<"TEST "<<nxt<<" "<<tmp.size()<<"\n";
		string qwq=calc(nxt,tmp);
		if(qwq=="#")continue;
		if(ans=="#")ans=qwq;
		else if(ans.size()>qwq.size())ans=qwq;
		else if(ans.size()==qwq.size()&&ans>qwq)ans=qwq;
		if(last=="")mnl=min(mnl,(int)ans.size());
	}
	return ans;
}

void __INIT__(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);}
void __SOLVE__(int _case){
	int k,a;
	cin>>k;
	vector<bitset<10>>tmp(k);
	bool t=0;
	for(int i=0;i<k;i++){
		cin>>a;
		t|=a;
		tmp[i][a]=1;
	}
	cout<<calc("",tmp)<<"\n";
}
int main(){/*freopen(".in","r",stdin);freopen(".out","w",stdout);*/__INIT__();int T;DC?cin>>T,1:T=1;for(int _CASE=1;_CASE<=T;_CASE++)__SOLVE__(_CASE);return 0;}
2024/7/19 21:17
加载中...