bzoj3718 樹狀陣列

2022-05-20 03:01:40 字數 2509 閱讀 6261

有時候,要透過題面看到本質

題意 你的老闆命令你將停車場裡的車移動成他想要的樣子。

停車場是乙個長條矩形,寬度為w。我們以其左下角頂點為原點,座標軸平行於矩形的邊,建立直角座標系。停車場很長,我們可以認為它一直向右邊伸展到無窮遠處。

車都是邊平行於座標軸的矩形,大小可能不同。你可以將車任意地平移(但不能旋轉),只要他們不超出停車場的邊界,且不能互相碰撞,但緊挨著是允許的(即任意時刻任兩輛車的重疊面積為0)。

你知道目前各輛車的擺放位置,以及老闆心中所想的位置。你需要判斷是否可以辦到老闆的任務。

乍一看覺得毫無地方可以下手,仔細一想會貪心的想到去乙個個排列,但也覺得不太好做,但是事實上一輛汽車的移動我們可以用三個條件來描述,他的起始點s,他的終點e,他的寬度w,如果有兩輛車滿足 s1 < s2 && e1 > e2 && w1 + w2 > w的時候,就是否定情況,否則位肯定情況。因為在這種情況下的兩輛車必定需要併排交錯。

這就成了乙個三維問題,考慮用排序+樹狀陣列維護字首最大值解決即可,注意加乙個離散化。

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define for(i, x, y) for(int i=x;i<=y;i++)

#define _for(i, x, y) for(int i=x;i>=y;i--)

#define mem(f, x) memset(f,x,sizeof(f))

#define sca(x) scanf("%d", &x)

#define sca2(x,y) scanf("%d%d",&x,&y)

#define sca3(x,y,z) scanf("%d%d%d",&x,&y,&z)

#define scl(x) scanf("%lld",&x);

#define pri(x) printf("%d\n", x)

#define prl(x) printf("%lld\n",x);

#define clr(u) for(int i=0;i<=n;i++)u[i].clear();

#define ll long long

#define ull unsigned long long

#define mp make_pair

#define pii pair#define pil pair#define pll pair#define pb push_back

#define fi first

#define se second typedef vector

vi;const

double eps = 1e-9

;const

int maxn = 5e4 + 10

;const

int inf = 0x3f3f3f3f

;const

int mod = 1e9 + 7

; int

n,m,k,w;

inttree[maxn];

struct

points[maxn],e[maxn];

struct

carcar[maxn];

inthash[maxn];

int lowbit(int

t)void add(int x,int

t)int getmax(int

t)bool

cmp(car a,car b)

intmain()

for(i,

1,n)

sort(hash + 1,hash + 1 +n);

int cnt = unique(hash + 1,hash + 1 + n) - hash - 1

; for(i,

1,n) car[i].s = lower_bound(hash + 1,hash + 1 + cnt,car[i].s) -hash;

sort(car + 1,car + 1 +n,cmp);

bool flag = 1

; for(i,

1,n)

if(flag) puts("

tak"

);

else puts("

nie"

); }

#ifdef vscode

system(

"pause");

#endif

return0;

}

bzoj1246(樹狀陣列)

樹狀陣列的靈活運用,維護的是最大值,因為整個陣列就是乙個字首最大值,所以可以用實現,求乙個字首最大值,和更新pos之後的最大值。很好的運用,多回顧思考 include include include include includeusing namespace std const int n 200...

bzoj 2762 樹狀陣列

題意 給出一些形如 ax b 1 新加入乙個不等式 2 刪除乙個不等式 3 詢問當x k時滿足的不等式的個數 對於每乙個不等式,通過變形就可以得到使它成立的x的範圍 那麼就變成區間修改,單點查詢,樹狀陣列維護就好 注意 1 討論a 0 a 0 a 0的情況 2 由於k有非正數,所以要加上10 6 1...

bzoj 1935(樹狀陣列)

傳送門 題解 由於是靜態問題所以可以離線處理,所有點 詢問拆成4個 按x排序,二維可以轉成一維,相當於每次query到的就是當前已插入的點,而只有這些點能對query的返回值造成貢獻。p.s.對於x座標相同的插入 詢問,要考慮這幾個操作的先後順序 include using namespace st...