目录
- 旅行问题
-
旅行问题
首先看见问题,我就差不多能猜到应该是dp
然后他是一个环,任何点都可能是起点,终点
而且只会转一圈,那就没必要用每次i++再%的方式了
直接把数组复制一倍
比如说123这个环
1当起点:123123
2当起点:123123
3当起点:123123
逆时针也一样
剩下的就简单了
走一步看一步,没油了就算不行
50分朴素dp,剩下超时
#include<iostream>
using namespace std;
long long int n,p[3000000],d[3000000];
bool shun(int i)
{int station=i+n;long long int oil=0;for(;i<=station;i++){oil=oil+p[i]-d[i];if(oil<0) return 0;}return 1;
}
bool ni(int i)
{int station=i-n;long long int oil=0;for(;i>=station;i--){oil=oil+p[i]-d[i-1];if(oil<0) return 0;}return 1;
}
int main()
{cin>>n;for(int i=1;i<=n;i++){cin>>p[i]>>d[i];p[n+i]=p[i];d[n+i]=d[i];}
// for(int i=1;i<=2*n;i++)cout<<p[i]<<" "<<d[i]<<"\n";for(int i=1;i<=n;i++){if(shun(i)==0&&ni(i+n)==0)cout<<"NIE\n";else cout<<"TAK\n";}return 0;
}
然后还看了一个比较新的代码
先把代码放出来
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define R 1000001
int n,m,o[R],d[R],s[2*R],ans[R];
pair<int,int>p;
deque< pair<int,int> >q;
signed main()
{cin>>n;for(int i=1;i<=n;i++) cin>>o[i]>>d[i];for(int i=1;i<=2*n;i++) s[i]=s[i-1]+o[(i-1)%n+1]-d[(i-1)%n+1];for(int i=1;i<=n;i++){while(!q.empty()&&q.back().first>s[i]) q.pop_back();p.first=s[i],p.second=i;q.push_back(p);}for(int i=n+1;i<=2*n;i++){ans[i-n]=q.front().first-s[i-n-1];while(!q.empty()&&i-q.front().second+1>n) q.pop_front();while(!q.empty()&&q.back().first>s[i]) q.pop_back();p.first=s[i],p.second=i;q.push_back(p);}q.clear();for(int i=1,j=2*n;i<=2*n;i++,j--) s[i]=s[i-1]+o[(j-1)%n+1]-d[((j-1>0?j-1:n)-1)%n+1];for(int i=1;i<=n;i++){while(!q.empty()&&q.back().first>s[i]) q.pop_back();p.first=s[i],p.second=i;q.push_back(p);}for(int i=n+1;i<=2*n;i++){ans[2*n-i+1]=max(ans[2*n-i+1],q.front().first-s[i-n-1]);while(!q.empty()&&i-q.front().second+1>n) q.pop_front();while(!q.empty()&&q.back().first>s[i]) q.pop_back();p.first=s[i],p.second=i;q.push_back(p);}for(int i=1;i<=n;i++) printf(ans[i]>=0?"TAK\n":"NIE\n");return 0;
}
首先,这个代码满分
用的是单调队里优化,而且是真的单调队列,不是数组模拟的
queue是队列,deque就是双端队列
pair其实就相当于结构体,而且是只能存两个数据的结构体,随用随定义
其中p就是一个pair,它是专门用来入队用的
q这个队列里面存的都是pair类型的数据
剩下的它也是直接套用的单调队列模板
先计算f[],再控制区间长度,再维护单调性
看着很难其实一点都不简单
现在是2025/2/7,看着三个周前的存稿,直接摆烂,其实后来还讲了一点树形dp,但是不难,没有新东西,就没再写了,只有一道新题战略游戏