#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))都不行...结果就直接两个差分过了还是全场最优解...