「日常訓練」Alena And The Heater (CFR466D2D)

SamHX發表於2018-04-19

題意(Codeforces 940D)

根據給定要求構建數列,求能構建出相同數列的lr

分析

這題寫的是真的煩。一定要想到對b串要按照5個5個的看!為什麼5個5個的看?因為根據題意,是先看前4個再對最後的0/1做判斷。所以只需要考慮四種模式:“00000”“00001”“11110”“11111”。對於“11110”和“00001”很好思考,但我是在“11111”和“00000”卡了一會。想一想(對11111),如果“bi=0 if ai,ai1,ai2,ai3,ai4>r”這個條件不滿足,說明這裡的ai,...,ai4存在一個小於等於r的。為了使這個條件成立,r的最小值要不小於ai,...的最小值。這樣,我不管怎麼取r,都能滿足11111在這裡被生成的特性。對00000,同理。
同樣地,這裡也就兩個坑。之後取最小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;
}

相關文章