P4623题解
题目传送门
解题思路:桶+差分
看到题解好多大奆都用树状数组,扫描线什么的完全不会啊。但这题其实可以用简单的桶数组来解决。代码量小,时间短。
Part 1 暴力
最简单的想法,对于每条直线,找哪些三角形满足条件。时间复杂度
Part 2 桶优化
接下来就要思考如何在
设置两个桶
Part 3 差分维护桶
很容易发现,对于每个三角形,总是在一段区间内
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000007;
int n,m,boxx[maxn],boxy[maxn];
int main(){
scanf("%d",&n);
int x,y;
for(int i=1;i<=n;i++){
int maxx=-1*(1e9+7),maxy=-1*(1e9+7),minx=1e9+7,miny=1e9+7;
for(int j=1;j<=3;j++){
scanf("%d%d",&x,&y);
maxx=max(maxx,x);maxy=max(maxy,y);
minx=min(minx,x);miny=min(miny,y);
}
boxx[minx+1]++;boxy[miny+1]++;
boxx[maxx]--;boxy[maxy]--;
}
for(int i=1;i<=1000000;i++){
boxx[i]+=boxx[i-1];boxy[i]+=boxy[i-1];//直接用差分数组还原,压缩空间
}
scanf("%d",&m);
char dir,no;int num=0;
for(int i=1;i<=m;i++){
scanf(" %c %c %d",&dir,&no,&num);//这个no只是为了读入方便
if(dir=='x')printf("%d\n",boxx[num]);
else printf("%d\n",boxy[num]);
}
}
ps:建议全程用scanf……别问为什么
(做了一点小改动)