E47 单调队列优化DP 旅行问题
视频链接:455 单调队列优化DP 旅行问题_哔哩哔哩_bilibili
#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"); }