之前寫過這個演算法,時間長了就忘掉了,,現在不看書自己努力回想起來,對演算法的理解,對線段樹的理解感覺也更深了一點(可能心理作用,哈哈哈)
思路簡單說一下吧
從做到右遍歷每一條矩陣的邊(左右邊),看該邊對右邊的面積貢獻是正還是負(矩陣左邊為正,右邊為負),在y軸上用線段樹維護在y軸的貢獻值,與x軸上該邊與下一條邊的差值相乘即可
1定義控制台應用程式的入口點。2//
3 #include4 #include5 #include6 #include7 #include8 #include
9 #include10 #include11 #include
12 #include13 #include14 #include15 #include16
using
namespace
std;
17 typedef long
long
ll;18 typedef long
long
lint;
19const ll mod=1e9+7;20
const
int maxn=1e2+7;21
const
int maxm=1e5+7;22
const
double eps=1e-3;23
intar1[maxn],ar2[maxn],m,n;
24bool
bo[maxn];
25struct
lineli[maxn*2
];29
30struct
nodeno[maxn*8
];35
double
xl[maxn],yl[maxn];
36bool
cmp(line l1,line l2)
39void build(int x,int y,int
o)49
void down(int
x)54
else57}
58void update(int o,line &limid)
63else
68down(o);69}
70int
main()
7188 sort(li,li+2*n,cmp);
89 sort(yl,yl+2*n);
90int len=unique(yl,yl+2*n)-yl;
91 build(0,len-1,1
);92
double ans=0;93
for(int i=0;i<2*n-1;i++)
97 printf("
test case #%d\ntotal explored area: %.2lf\n\n
",++fir,ans);98}
99return0;
100 }
hdu1542(線段樹 掃瞄線)
裸的掃瞄線,學習掃瞄線的題目。具體掃瞄線的原理我不講了,我是看大神們的部落格懂得,就算寫也沒大神屌。下面我給出我的 裡面的注釋是我認為比較重要的地方 include include include includeusing namespace std const int max 210 int n ...
hdu 1542 掃瞄線 線段樹
題目大意 求矩形面積的並 思路 按y軸排序,然後將x投影到線段樹上做乙個線段覆蓋問題即可 注意 為了避免重複,線段座標右端點是開區間,更新時需要加上1 include include include include include define fo i,a,b for int i a i b i ...
hdu1542(線段樹 掃瞄線)
題目連線 又看到了幾個月前做的題,感覺那時候就是個sb 也怪自己剛開始沒搞清楚線段樹,瞎摸索 用連續線段樹很好理解這個題,之前的 稍微改了一下就好理解多了 1 include2 include3 include4 define lson l,m,rt 1 5 define rson m,r,rt 1...