不是哥们,这也能爆内存???#21MLE史无前例的死法
查看原帖
不是哥们,这也能爆内存???#21MLE史无前例的死法
1424262
tttfred楼主2024/12/3 21:32
#include <bits/stdc++.h>
using namespace std;
typedef struct bo
{
    long long int num, sx, tx;
} b;
long long cl[1000005];
bool check(long long int n, long long cl[], long long int mid, b *p)
{
    vector<long long int>diff(n+1,0);
    vector<long long int>a(n+1,0);
    for (long long int i = 1; i <= mid; i++)
    {
        diff[p[i].sx] += p[i].num;
        if (p[i].tx < n)
        {
            diff[p[i].tx + 1] -= p[i].num;
        }
    }
    a[1] = diff[1];
    for (long long int i = 2; i <= n; i++)
    {
        a[i] = a[i - 1] + diff[i];
        if(a[i]>cl[i])return false;
    }
    // for(int i=1;i<=n;i++){
    //     cout<<cl[i]<<" ";
    // }cout<<mid<<endl;
    diff.clear();a.clear();
    return true;
}

int main()
{
    long long int n, m;
    cin >> n >> m;
  
    for (long long int i = 1; i <= n; i++)
    {
        cin >> cl[i];
    }

    b p[n + 1];
    for (long long int i = 1; i <= m; i++)
    {
        cin >> p[i].num >> p[i].sx >> p[i].tx;
    }
    long long int left = 1;
    long long int right = m;
    
    

    
    if (check(n, cl,  right, p))
    {   
        cout <<0<<endl;
    }
    else
    {
        cout << -1 << endl;
        while (left < right)
        {
            
            long long int mid = (left + right) / 2;
            if (check(n, cl,  mid, p))
            {
                left = mid + 1;
            }
            else
            {
                right = mid - 1;
            }
        }
      
        
        while(!check(n,cl,right,p)){
right--;
        }cout<<right+1<<endl;
    }return 0;
}


全改成long long 数组又超时,这个点搞我啊....

2024/12/3 21:32
加载中...