日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【离散化】【差分】幻灯片(jzoj 1609)

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【离散化】【差分】幻灯片(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。