E47 单调队列优化DP 旅行问题

视频链接:455 单调队列优化DP 旅行问题_哔哩哔哩_bilibili

LOJ10178 旅行问题

#include<iostream>
using namespace std;

typedef long long LL;
const int N=2e6+10;
int n,oil[N],dis[N],q[N];
LL s[N];
bool flag[N];

int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>oil[i]>>dis[i];
    s[i]=s[i+n]=oil[i]-dis[i];
  }
  for(int i=1;i<=2*n;i++) s[i]+=s[i-1]; //前缀和
  
  int h=1,t=0;
  for(int i=2*n;i>=1;i--){ //顺时针行驶
    while(h<=t && s[q[t]]>=s[i]) t--;
    q[++t]=i;
    if(q[h]>i+n-1) h++;
    if(i<=n && s[q[h]]-s[i-1]>=0) flag[i]=true;
  }
  
  dis[0]=dis[n];
  for(int i=n;i;i--) s[i]=s[i+n]=oil[i]-dis[i-1];
  for(int i=2*n;i;i--) s[i]+=s[i+1]; //后缀和
  
  h=1,t=0;
  for(int i=1;i<=2*n;i++){  //逆时针行驶
    while(h<=t && s[q[t]]>=s[i]) t--;
    q[++t]=i;
    if(q[h]<i-n+1) h++;
    if(i>n && s[q[h]]-s[i+1]>=0) flag[i-n]=true;
  }
  
  for(int i=1;i<=n;i++) puts(flag[i]?"TAK":"NIE");
}
#include<iostream>
using namespace std;

typedef long long LL;
const int N=2e6+10;
int n,oil[N],dis[N],q[N];
LL s[N];
bool flag[N];

int main(){
  cin>>n;
  for(int i=1;i<=n;i++){
    cin>>oil[i]>>dis[i];
    s[i]=s[i+n]=oil[i]-dis[i];
  }
  for(int i=1;i<=2*n;i++) s[i]+=s[i-1]; //前缀和
  
  int h=1,t=0;
  for(int i=2*n;i>=1;i--){ //顺时针行驶
    while(h<=t && q[h]>i+n-1) h++;
    while(h<=t && s[q[t]]>=s[i]) t--;
    q[++t]=i;
    if(i<=n && s[q[h]]-s[i-1]>=0) flag[i]=true;
  }
  
  dis[0]=dis[n];
  for(int i=n;i;i--) s[i]=s[i+n]=oil[i]-dis[i-1];
  for(int i=2*n;i;i--) s[i]+=s[i+1]; //后缀和
  h=1,t=0;
  for(int i=1;i<=2*n;i++){  //逆时针行驶
    while(h<=t && q[h]<i-n+1) h++;
    while(h<=t && s[q[t]]>=s[i]) t--;
    q[++t]=i;
    if(i>n && s[q[h]]-s[i+1]>=0) flag[i-n]=true;
  }
  
  for(int i=1;i<=n;i++) puts(flag[i]?"TAK":"NIE");
}

 

posted @ 2023-04-29 14:13  董晓  阅读(281)  评论(0编辑  收藏  举报