90Pts求调
查看原帖
90Pts求调
676195
_zyf_楼主2023/10/12 21:03

rt 捞

#include<bits/stdc++.h>
using namespace std;
#define int long long

namespace FastIO
{
	const int Mt = 1e5;
	inline char getch()
	{
		static char buf[Mt],*p1 = buf,*p2 = buf;
		return p1 == p2 && (p2 = (p1 = buf) + fread(buf,1,Mt,stdin),p1 == p2) ? EOF : *p1++;
	}
	
	inline int input()
	{
		int num = 0,f = 1;
		char ch = getch();
		while(ch < '0' || ch > '9')
		{
			if(ch == '-') f = -1;
			ch = getch();
		}
		while(ch >= '0' && ch <= '9')
		{
			num = (num << 1) + (num << 3) + (ch ^ 48);
			ch = getch();
		}
		return num * f;
	}
	
	inline void printNum(int num)
	{
		if(num >= 10) printNum(num / 10);
		putchar(num % 10 + 48);
	}
	
	inline void print(int num,char ch = ' ')
	{
		if(num < 0) putchar('-'),num = -num;
		printNum(num);
		putchar(ch);
	}
}
using FastIO::input;
using FastIO::print;

const int INF = -1u / 2; 
const int N = 5e5 + 5;
int n,d,low;
int x[N],s[N],dp[N];

void p()
{
    for(int i = 1;i <= n;i++)
        print(dp[i]);
    puts("");
}

bool check(int g)
{
	deque <int> dq;
    int il = max(1LL,d - g),ir = d + g,pos = 0;
//	print(il),print(ir),print(g,'\n');
    for(int i = 0;i <= n;i++) dp[i] = 0;
//	memset(dp,0,sizeof dp);
    for(int i = 1;i <= n;i++)
    {
//        int lb = x[i] - ir,rb = x[i] - il;
//        if(rb < lb) continue;
//        for(int k = (lower_bound(x,x+1+n,lb) - x);x[k] <= rb;k++)
//        {
//            dp[i] = max(dp[i],dp[k] + s[i]);
//            if(dp[i] >= low) {/*p()*/;return true;}
//        }
        while(pos < i && x[i] - x[pos] >= il)
        {
    		while(!dq.empty() && dp[pos] >= dp[dq.back()])
    			dq.pop_back();
    		dq.push_back(pos);
			pos++;
		}
		while(!dq.empty() && x[i] - x[dq.front()] > ir)
			dq.pop_front();
		if(dq.size()) dp[i] = dp[dq.front()] + s[i];
		else dp[i] = -INF;
		if(dp[i] >= low) return true;
    }
//    p();
//    print(dp[n],'\n');
    return false;
}

signed main()
{
	freopen("C:/Users/Administrator/Downloads/P3957_10.in","r",stdin);
    n = input(),d = input(),low = input();
    for(int i = 1;i <= n;i++)
        x[i] = input(),s[i] = input();
    
    int l = 1,r = x[n],mid;
    while(l < r)
    {
        mid = (l + r >> 1);
        if(check(mid)) r = mid;
        else l = mid + 1;
    }

    print(check(l) ? l : -1);
//	print(l);
}
2023/10/12 21:03
加载中...