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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ2155二维线段树

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ2155二维线段树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給一個n*n的01矩陣,然后有兩種操作(m次)C x1 y1 x2 y2是把這個小矩形內所有數字異或一遍,Q x y 是詢問當前這個點的值是多少?n<=1000 m<=50000.


思路:
? ? ?做的有點蛋疼,昨天自己用了將近5個小時自己研究了兩個二維線段樹的算法,都失敗了,其實我想到的第二個算法和網上那個差不多(后來看網上的思路才發現),但是我考慮的是段更新的PushDown的問題,其實這個題目是段更新,*點詢問*,根據這個可以簡化問題,思路很容易想到可以是線段樹的線段樹,就是線段樹跑X確定區間后再線段樹去更新y,但是有幾點需要注意
1. 可以不用Pushup,Pushdown(因為是點詢問,一開始我就考慮段詢問,各種自己設想,研究而且還寫了個上下左右更新,就是把線段映射成平面,最后悲劇了..你懂的)
2.*當更新大矩形的時候那么他里面的小矩形也相當于更新了,就是假如現在更新

(1,1)(5,5)(1,5),(5,1)這個矩形的時候我們是找到位置直接就return了,其實(1,1)(2,2),(1,2),(2,1)也更新了,但是我們沒有繼續往下走,所以當我們尋找答案的時候要一路加過來,這個是重點,這么說可能不懂,但是可以看幾遍代碼,我當時看了下代碼馬上就懂了,可能是我昨天想的要比正解難很多,想到頭疼,而且思路相近,所以一看就懂了,但是不管是誰,只要考慮過,應該很容易懂,很可惜下面的代碼的思路并不是我自己想出來的。


#include<stdio.h> #include<string.h>#define xlson xl ,xmid ,xt << 1 #define xrson xmid+1 ,xr ,xt << 1 | 1 #define ylson yl ,ymid ,yt << 1 #define yrson ymid+1 ,yr ,yt << 1 | 1 #define N 1005int cnt[N<<2][N<<2] ,n ,ans; void UpdateY(int yl ,int yr ,int yt ,int c ,int d ,int xt) {if(c <= yl && d >= yr){cnt[xt][yt] ++;return ;}int ymid = (yl + yr) >> 1;if(c <= ymid) UpdateY(ylson ,c ,d ,xt);if(d > ymid) UpdateY(yrson ,c ,d ,xt);return ; }void UpdateX(int xl ,int xr ,int xt ,int a ,int b ,int c ,int d) {if(a <= xl && b >= xr){UpdateY(1 ,n ,1 ,c ,d ,xt);return ;}int xmid = (xl + xr) >> 1;if(a <= xmid) UpdateX(xlson ,a ,b ,c ,d);if(b > xmid) UpdateX(xrson ,a ,b ,c ,d);return ; }void QueryY(int yl ,int yr ,int yt ,int b ,int xt) {ans += cnt[xt][yt];if(yl == yr) return ;int ymid = (yl + yr) >> 1;if(b <= ymid) QueryY(ylson ,b ,xt);else QueryY(yrson ,b ,xt);return ;}void QueryX(int xl ,int xr ,int xt ,int a ,int b) {QueryY(1 ,n ,1 ,b ,xt);if(xl == xr) return ;int xmid = (xl + xr) >> 1;if(a <= xmid) QueryX(xlson ,a ,b);else QueryX(xrson ,a ,b);return ; }int main () {int t ,m ,i ,x1 ,y1 ,x2 ,y2;char str[5];scanf("%d" ,&t);while(t--){scanf("%d %d" ,&n ,&m);memset(cnt ,0 ,sizeof(cnt));while(m--){scanf("%s" ,str);if(str[0] == 'C'){scanf("%d %d %d %d" ,&x1 ,&y1 ,&x2 ,&y2);UpdateX(1 ,n ,1 ,x1 ,x2 ,y1 ,y2);}else{scanf("%d %d" ,&x1 ,&y1);ans = 0;QueryX(1 ,n ,1 ,x1 ,y1);if(ans % 2)printf("1\n");else printf("0\n");}}if(t) printf("\n");}return 0; }

總結

以上是生活随笔為你收集整理的POJ2155二维线段树的全部內容,希望文章能夠幫你解決所遇到的問題。

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