100114D
这道题用暴力水过了,蒟蒻是这么想的:枚举两个端点,找最小值,因为shift只能用一次,但是这样10^9*2.5要t,所以减掉只有一个黑点的情况,然后复杂度变为10^9*0.6
#include<iostream> #include<vector> #include<cstdio> using namespace std; int n,ll=-(1<<29),rr=-(1<<29),ans; vector<int>left1; vector<int>right1; char c; char s[100010]; int sum[1000010]; int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); cin>>n; int pos=0; cin.ignore(); for(int i=1;i<=n;i++) { c=getchar(); s[i]=c; sum[i]=sum[i-1]+(c=='*'); } s[0]='.'; s[++n]='.'; for(int i=1;i<=n;i++) { int l,r; if(s[i]=='*'&&s[i-1]=='.'){l=i;left1.push_back(i);} if(s[i]=='*'&&s[i+1]=='.') { r=i; if(r-l+1<2) { left1.pop_back(); continue; } right1.push_back(i); } } int l=0,r=0; int MAX=-(1<<29); for(int i=0;i<left1.size();i++) { for(int j=i;j<right1.size();j++) { int a=right1[j]-left1[i]+1; // cout<<"left:"<<left1[i]<<endl; // cout<<"right:"<<right1[j]<<endl; int b=sum[right1[j]]-sum[left1[i]-1];//操作数a-b+2和b比较 // cout<<"MAX="<<MAX<<" "<<a<<" "<<b<<endl; if(a-b+2<b&&MAX<2*b-a-2) { MAX=2*b-a-2; ll=left1[i];rr=right1[j]; } } } // cout<<"ll="<<ll<<" "<<"rr="<<rr<<endl; if(MAX!=-(1<<29)) { ans+=(3+rr-ll-2*(sum[rr]-sum[ll-1])); } ans+=sum[n-1]; // cout<<sum[n]<<endl; cout<<ans<<endl; if(MAX!=-(1<<29)) { cout<<ll<<endl; cout<<"Shift+"<<rr<<endl; for(int i=ll;i<=rr;i++) if(s[i]=='.') { cout<<"Ctrl+"<<i<<endl; } } if(ll==-(1<<29)&&rr==-(1<<29)) { ll=1;rr=0; } for(int i=1;i<ll;i++) if(s[i]=='*')cout<<"Ctrl+"<<i<<endl; for(int i=rr+1;i<=n;i++) if(s[i]=='*')cout<<"Ctrl+"<<i<<endl; fclose(stdin); fclose(stdout); return 0; }