【离散化】【差分】幻灯片(jzoj 1609)
生活随笔
收集整理的這篇文章主要介紹了
【离散化】【差分】幻灯片(jzoj 1609)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
幻燈片
題目大意:
有n個幻燈片映在一起,每個幻燈片的的左上角是a1,a2,右上角是a3,a4,顏色是a5當多個幻燈片在同一個位置時,顏色就是他們的和,求有所少種顏色
樣例輸入
3
2 2 3 3 2
2 0 4 4 1
1 1 3 5 3
樣例輸出
4
數據范圍限制
提示
數據說明:
對于50%的數據,0<=X1,Y1,X2,Y2<=10^2。
對于100%的數據,0<=X1,Y1,X2,Y2<=10^9。
解題思路:
這道題只能拿50分暴力,想拿100分首先要離散化(注意:這里要加0.5或減0.5,要不然會有bug),離散化要排序,去重,然后還要將去重后的位置放回原處,這樣就可以省下很多空間,時間,然后用一種差分,快速推出每一個地方的顏色
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> using namespace std; int w,n,len,ans,b[1005][1005],pd[10005]; double f[1005]; struct rec {double x1,x2,y1,y2;//每一個幻燈片int c; }a[105]; int main() {freopen("b.in","r",stdin);freopen("b.out","w",stdout);scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%lf %lf %lf %lf %d",&a[i].x1,&a[i].y1,&a[i].x2,&a[i].y2,&a[i].c);f[++w]=a[i].x1-0.5;//全是避免bugf[++w]=a[i].y1-0.5;f[++w]=a[i].x2+0.5;f[++w]=a[i].y2+0.5;f[++w]=(a[i].x1+=0.5);f[++w]=(a[i].y1+=0.5);f[++w]=(a[i].x2-=0.5);f[++w]=(a[i].y2-=0.5);}sort(f+1,f+1+w);//排序len=unique(f+1,f+1+w)-f-1;//去重for (int i=1;i<=n;i++){a[i].x1=lower_bound(f+1,f+1+len,a[i].x1)-f;//先二分查找,再放回去,離散化a[i].y1=lower_bound(f+1,f+1+len,a[i].y1)-f;a[i].x2=lower_bound(f+1,f+1+len,a[i].x2)-f;a[i].y2=lower_bound(f+1,f+1+len,a[i].y2)-f;b[(int)a[i].x1][(int)a[i].y1]+=a[i].c;//左上角b[(int)a[i].x2+1][(int)a[i].y2+1]+=a[i].c;//右下角b[(int)a[i].x1][(int)a[i].y2+1]-=a[i].c;//右上角b[(int)a[i].x2+1][(int)a[i].y1]-=a[i].c;//左下角}for (int i=1;i<=len;i++)for (int j=1;j<=len;j++){b[i][j]+=b[i-1][j]+b[i][j-1]-b[i-1][j-1];//差分if ((b[i][j])&&(!pd[b[i][j]]))//判斷是否記錄過和是否有顏色ans++,pd[b[i][j]]++;//顏色種數加一}printf("%d",ans);//輸出fclose(stdin);fclose(stdout);return 0; }總結
以上是生活随笔為你收集整理的【离散化】【差分】幻灯片(jzoj 1609)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2024 款飞凡 R7 官宣 11 月上
- 下一篇: 医院(jzoj 1611)