全部评论 2

  • #include <iostream>
    #include <algorithm>
    #include <ctime>
    #include <vector>
    #include <cstdio>
    using namespace std;
    #define MAXN 300001
    #define INF 0x3f3f3f3f3f3f3f
    
    int N, L;
    int x[MAXN], y[MAXN];
    int xid[MAXN];
    int lis[MAXN];
    long long dp[MAXN];
    long long dpPlus[MAXN];
    
    vector<int> levels[MAXN];
    
    bool cmpx(int a,int b)	
    {
    	return x[a] < x[b];
    }
    
    void computeLIS()
    {
    	levels[0].push_back(xid[0]);
    	lis[xid[0]] = 0;
    	int mx = 0;
    	for(int i=1;i<N;i++)
    	{
    		int cur = xid[i];
    		int low = -1;
    		int high = mx;
    		while(low != high)
    		{
    			int mid = (low+high+1)/2;
    			if(y[levels[mid].back()] < y[cur]) low = mid;
    			else high = mid-1;
    		}
    		levels[low+1].push_back(cur);
    		mx = max(mx, low+1);
    		lis[cur] = low+1;
    	}
    }
    
    long long cost(int i,int j)
    {
    	return dp[i] + x[i]*((long long)y[i]) - x[i]*((long long)y[j]) - y[i]*((long long)x[j]) + x[j]*((long long)y[j]);
    }
    
    int findLocOvertake(int l,int i,int j) 
    {
    	int low = 0;
    	int high = levels[l].size();
    	while(low != high)
    	{
    		int mid = (low+high)/2;
    		if(cost(i, levels[l][mid]) < cost(j, levels[l][mid])) high = mid;
    		else low = mid+1;
    	}
    	return low;
    }
    
    int firstDom[MAXN];
    int lastDom[MAXN];
    
    int findFirst(int l,int i)	
    {
    	int low = 0;
    	int high = levels[l].size()-1;
    	while(low != high)
    	{
    		int mid = (low + high)/2;
    		if(x[levels[l][mid]] > x[i]) high = mid;
    		else low = mid+1;
    	}
    	if(x[levels[l][low]] > x[i] && y[levels[l][low]] > y[i])
    		return low;
    	return -1;
    }
    
    int findLast(int l,int i) 
    {
    	int low = 0;
    	int high = levels[l].size()-1;
    	while(low != high)
    	{
    		int mid = (low + high + 1)/2;
    		if(y[levels[l][mid]] > y[i]) low = mid;
    		else high = mid-1;
    	}
    	if(x[levels[l][low]] > x[i] && y[levels[l][low]] > y[i])
    		return low;
    	return -1;
    }
    
    int que[MAXN];
    int overtake[MAXN];
    vector<int> level;
    
    void solveStartingRegion(int l, int iStart, int iEnd, int qStart, int qEnd) 
    {
    	int len = 0;
    	int i = iStart;
    	for(int j=qStart;j<=qEnd;j++)
    	{
    		int q = levels[l+1][j];
    		while(i <= iEnd && firstDom[i] <= j)
    		{
    			while
    

    2025-07-05 来自 广东

    0
  • 2025-01-22 来自 江苏

    0
首页