1 条题解

  • 0
    @ 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
    上传者