1 条题解
-
0梁文瀚LWH (winham) LV 10 @ 2023-7-30 16:28:15
#include<iostream> #include<string> #include<cctype> #include<cmath> #include<cstdlib> #include<cstring> #include<vector> #include<algorithm> #include<map> #include<set> #include<iomanip> using namespace std; #define LL long long const int N = 1e6+10; const int INF = 0x3f3f3f3f; LL p[N],c[N],d[N],sum[N],falg[N]; LL q[N]; int main(){ //freopen("","r",stdin); //freopen("","w",stdout); int n; cin>>n; for(int i=1;i<=n;i++){ cin>>p[i]>>d[i]; c[i]=c[i+n]=p[i]-d[i]; } for(int i=1;i<=n*2;i++) sum[i]=sum[i-1]+c[i]; int l=1,r=1; for(int i=1;i<=n;i++){ while(l!=r&&sum[q[r-1]]>=sum[i]) r--; q[r++]=i; } if(sum[q[l]]>=0) falg[1]=1; for(int i=2;i<=n;i++){ while(l!=r&&sum[q[r-1]]>=sum[i+n-1]) r--; q[r++]=i+n-1; if(q[l]<i) l++; if(sum[q[l]]-sum[i-1]>=0) falg[i]=1; } d[0]=d[n]; for(int i=n;i>=1;i--) c[n-i+1]=p[i]-d[i-1]; for(int i=1;i<=n;i++) c[i+n]=c[i]; for(int i=1;i<=n*2;i++)sum[i]=sum[i-1]+c[i]; l=r=1; for(int i=1;i<=n;i++){ while(l!=r&&sum[q[r-1]]>=sum[i]) r--; q[r++]=i; } if(sum[q[l]]>=0) falg[n]=1; for(int i=2;i<=n;i++){ while(l!=r&&sum[q[r-1]]>=sum[i+n-1]) r--; q[r++]=i+n-1; if(q[l]<i) l++; if(sum[q[l]]-sum[i-1]>=0) falg[n-i+1]=1; } for(int i=1;i<=n;i++) puts(falg[i]?"TAK":"NIE"); return 0; }
- 1
信息
- ID
- 492
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 4
- 上传者