D.Alena and The Heater
暴力一波(找规律,前后连续两位不同的是关键)
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,l=-1e9,r=1e9,a[100010]; 4 string b; 5 int main() 6 { 7 cin>>n;for(int i=0;i<n;i++)cin>>a[i]; 8 cin>>b; 9 for(int i=4;i<n;i++)if(b[i]!=b[i-1]) 10 { 11 if(b[i-1]==b[i-2]&&b[i-2]==b[i-3]&&b[i-3]==b[i-4]) 12 { 13 for(int j=i-4;j<=i;j++) 14 { 15 if(b[i-1]==‘0‘)l=max(l,a[j]+1);else r=min(r,a[j]-1); 16 } 17 } 18 } 19 cout<<l<<" "<<r<<endl; 20 return 0; 21 }
E.Cashback
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MOD=1e9+7; 4 int mi[400010],n,c; 5 long long sum,dp[100010]; 6 void build(int i,int l,int r) 7 { 8 if(l==r) 9 { 10 scanf("%d",&mi[i]); 11 sum+=mi[i]; 12 return; 13 } 14 int md=l+r>>1; 15 build(i<<1,l,md); 16 build(i<<1|1,md+1,r); 17 mi[i]=min(mi[i<<1],mi[i<<1|1]); 18 } 19 int query(int i,int l,int r,int x,int y) 20 { 21 if(x<=l&&r<=y)return mi[i]; 22 int md=l+r>>1; 23 int res1=MOD,res2=MOD; 24 if(x<=md)res1=query(i<<1,l,md,x,y); 25 if(md<y)res2=query(i<<1|1,md+1,r,x,y); 26 return min(res1,res2); 27 } 28 int main() 29 { 30 scanf("%d%d",&n,&c); 31 build(1,1,n); 32 for(int i=c;i<=n;i++) 33 { 34 int res=query(1,1,n,i-c+1,i); 35 dp[i]=max(dp[i-1],dp[i-c]+res); 36 } 37 printf("%lld",sum-dp[n]); 38 return 0; 39 }