我服了我来练分块怎么优化分块都过不了...
查看原帖
我服了我来练分块怎么优化分块都过不了...
47371
LamoJunity楼主2021/5/17 18:42
#include <bits/stdc++.h>
using namespace std;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

void write(int x){
	if(x==0){putchar(48);return;}
	int len=0,dg[20];
	while(x>0){dg[++len]=x%10;x/=10;}
	for(int i=len;i>=1;i--)putchar(dg[i]+48);
}
int prefixSum[200001];
int numberOfAceepted[200001];
int main()
{
    ios::sync_with_stdio(false);

    int numberOfRecipes, minAccord, numberOfRange;

    numberOfRecipes = read();
    minAccord = read();
    numberOfRange = read();
    int beginTemperature, endTemperature;
    int maximumTemperature = 0;
    for (int i = 1; i<= numberOfRecipes; ++i)
    {
        beginTemperature = read();
        endTemperature = read();
        if (endTemperature > maximumTemperature)
            maximumTemperature = endTemperature;
        prefixSum[beginTemperature]++;
        prefixSum[endTemperature+1]--;
    }
    int cnt = 0;
    int block = sqrt(maximumTemperature);
    for (int i = 1; i <= maximumTemperature; ++i)
    {
        prefixSum[i] += prefixSum[i-1];
        if (prefixSum[i] >= minAccord)
            ++cnt;
        if (!(i % block))
        {
            numberOfAceepted[i-block+1] = cnt;
            cnt = 0;
        }   
    }
    cnt = 0;
    for (int i = 1; i <= numberOfRange; ++i)
    {
        cnt = 0;
        beginTemperature = read();
        endTemperature = read();
        if (beginTemperature > maximumTemperature)
        {
            write(0);
            putchar('\n');
            continue;
        }
        while (beginTemperature <= endTemperature)
        {
            if (numberOfAceepted[beginTemperature] && beginTemperature + block - 1 <= endTemperature)
            {
                cnt += numberOfAceepted[beginTemperature];
                beginTemperature+= block;
            }
            else if(prefixSum[beginTemperature] >= minAccord)
            {
                ++beginTemperature;
                ++cnt;
            }
            else
            {
                ++beginTemperature;
            }
        }
        write(cnt);
        putchar('\n');
    }
}

优化到极限了,怎么优化都过不了最后一个点,这道题一定得O(n),用分块优化到O(n*sqrt(n))都不行...结果就直接两个差分过了还是全场最优解...

2021/5/17 18:42
加载中...