題意(Codeforces 940D)
根據給定要求構建數列,求能構建出相同數列的
分析
這題寫的是真的煩。一定要想到對b串要按照5個5個的看!為什麼5個5個的看?因為根據題意,是先看前4個再對最後的0/1做判斷。所以只需要考慮四種模式:“00000”“00001”“11110”“11111”。對於“11110”和“00001”很好思考,但我是在“11111”和“00000”卡了一會。想一想(對11111),如果“
同樣地,這裡也就兩個坑。之後取最小l和最大r即可。
程式碼
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define PB push_back
#define MP make_pair
#define fi first
#define se second
#define lowbit(x) (x&(-x))
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define pr(x) cout << #x << " = " << x << " ";
#define prl(x) cout << #x << " = " << x << endl;
#define ZERO(X) memset((X),0,sizeof(X))
#define ALL(X) X.begin(),X.end()
#define SZ(x) (int)x.size()
using namespace std;
typedef pair<int,int> PI;
typedef pair<pair<int,int>, int> PII;
typedef pair<pair<pair<int,int>, int>, int> PIII;
typedef unsigned long long ull;
typedef long long ll;
typedef long double lb;
#define quickio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
/* debug("Precalc: %.3f\n", (double)(clock()) / CLOCKS_PER_SEC);
clock_t z = clock();
solve();
//debug("Test: %.3f\n", (double)(clock() - z) / CLOCKS_PER_SEC);
*/
template<typename T = int>
inline T read() {
T val=0, sign=1;
char ch;
for (ch=getchar();ch<'0'||ch>'9';ch=getchar())
if (ch=='-') sign=-1;
for (;ch>='0'&&ch<='9';ch=getchar())
val=val*10+ch-'0';
return sign*val;
}
int n; vector<int> a,b;
//題解
int main()
{
cin>>n;
int minl=-1e9,maxl=1e9,minr=-1e9,maxr=1e9,tmp;
a.PB(0); b.PB(0);
rep(i,1,n)
{
cin>>tmp; a.PB(tmp);
}
string str; cin>>str;
for(int i=5;i<=n;++i)
{
string tmp=str.substr(i-5,5);
int tmpval=a[i-4];
if(tmp=="11110")
{
for(int j=i-4;j<=i;++j) tmpval=min(a[j],tmpval);
maxr=min(tmpval-1,maxr);
}
else if(tmp=="11111")
{
for(int j=i-4;j<=i;++j) tmpval=min(a[j],tmpval);
minr=max(tmpval,minr);
}
else if(tmp=="00000")
{
for(int j=i-4;j<=i;++j) tmpval=max(a[j],tmpval);
maxl=min(tmpval,maxl);
}
else if(tmp=="00001")
{
//cout<<"WoW!"<<endl;
for(int j=i-4;j<=i;++j) tmpval=max(a[j],tmpval);
//cout<<tmpval<<endl;
minl=max(tmpval+1,minl);
}
}
cout<<minl<<" "<<maxr<<endl;
return 0;
}