蒟蒻70求助
查看原帖
蒟蒻70求助
34225
bulijoijiodibuliduo楼主2021/8/25 12:06

思路是第一篇题解的

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+1;
struct snake{
  int id,val;
  snake(){}
  snake(int a,int b){
    id=a,val=b;
  }
  bool operator<(const snake &rhs)const{
    return val<rhs.val||(val==rhs.val&&id<rhs.id);
  }
  snake operator-(const snake &rhs)const{
    snake ans=*this;
    ans.val-=rhs.val;
    return ans;
  }
};
deque<snake>q1,q2;
int t,n,a[N];
snake gmin(){
  if(q2.empty()||(q1.front()<q2.front()))return q1.front();
  return q2.front();
}
snake gmax(){
  if(q2.empty()||(q2.back()<q1.back()))return q1.back();
  return q2.back();
}
void pmin(){
  if(q2.empty()||(q1.front()<q2.front()))q1.pop_front();
  else q2.pop_front();
}
void pmax(){
  if(q2.empty()||(q2.back()<q1.back()))q1.pop_back();
  else q2.pop_back();
}
void solve(){
  while(q1.size())q1.pop_back();
  while(q2.size())q2.pop_back();
  for(int i=1;i<=n;i++)q1.push_back(snake(i,a[i]));
  while(1){
    if(q1.size()+q2.size()==2){
      cout<<1<<'\n';
      return;
    }
    snake mx=gmax(),mn=gmin();pmax(),pmin();
    snake f=mx-mn;
    if(q1.empty()||f<q1.front()){
      int ans=q1.size()+q2.size()+2,cnt=0;
      while(1){
        cnt++;
        if(q1.size()+q2.size()==1){
          break;
        }
        mx=gmax(),pmax();
        f=mx-f;
        if(gmin()<f){
          break;
        }
      }
      ans-=1-cnt%2;
      cout<<ans<<'\n';
      return;
    }else{
      q2.push_front(f);
    }
  }
}
signed main(){
  // freopen("tmp.in","r",stdin);
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin>>t>>n;
  for(int i=1;i<=n;i++)cin>>a[i];
  solve();
  t--;
  while(t--){
    int k;
    cin>>k;
    for(int i=1,x,y;i<=n;i++){
      cin>>x>>y;
      a[x]=y;
    }
    solve();
  }
}
2021/8/25 12:06
加载中...