Face The Right Way G

题目链接:https://www.luogu.com.cn/problem/P2882

题意:

给定一个01序列,求如何将它若干段连续序列翻转后变为全1序列

输出翻转最小次数和翻转区间长度

思路:

发现当每个点只翻转一次是最优的

所以从左往右枚举翻转区间左端点

当然得先枚举区间长度

通过维护差分数组判断左端点是否需要翻转

当翻转区间右端点超过n时不成立

void solve(){
    int n;cin>>n;
    vector<int>a(n+1);
    rep(i,1,n){
        char ch;cin>>ch;
        if(ch=='B')a[i]=0;else a[i]=1;
    }
    vector<pii>ans;
    for(int len=1;len<=n;len++){
        int ok=1;
        int cnt=0;
        vector<int>dif(n+2,0);
        for(int i=1;i<=n;i++){
            dif[i]+=dif[i-1];
            if((a[i]==0&&dif[i]%2==0)||(a[i]==1&&dif[i]%2==1)){
                if(i+len>n+1){
                    ok=0;break;
                }
                dif[i]++;dif[i+len]--;
                cnt++;
            }
        }
        if(ok){
            ans.pb({len,cnt});
        }
    }
    int res=llmax;
    int temp=0;
    for(int i=0;i<ans.size();i++){
        if(ans[i].se<res){
            res=ans[i].se;
            temp=ans[i].fi;
        }
    }
    cout<<temp<<' '<<res<<endl;
}
posted @ 2025-05-02 10:16  Marinaco  阅读(18)  评论(0)    收藏  举报
//雪花飘落效果