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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

约会安排 HDU - 4553

發(fā)布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 约会安排 HDU - 4553 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

約會安排 HDU - 4553

題意:


題意又丑又長就不敘述了

題解:

這個題一開始理解錯了。。。題目相當(dāng)于是有三種情況占據(jù)時間,分別是學(xué)習(xí),女神和屌絲,我們用不同的lazy來表示女神和屌絲,根據(jù)優(yōu)先級去更新狀態(tài)。
學(xué)習(xí)pushdown時會講女神和屌絲的lazy清空,女神會把屌絲的清空。相同類型所占區(qū)間要進(jìn)行合并。但是要注意:學(xué)習(xí)時間可以被后面任意
在為屌絲安排時順序安排時間
為女神安排時,先看屌絲是否有空余時間,如果沒有直接無視屌絲(因為可以占用屌絲時間),直接判斷女神時間是否有連續(xù)x長的空余時間
ls,rs,ms分別表示左/右和整個區(qū)間最長連續(xù)空時間的長度
這個題是不錯的多l(xiāng)azy,區(qū)間合并的好題目

代碼:

#include <stdio.h> #include <string.h> #include <algorithm> using namespace std;const int L= 100000 + 10;struct node {int lazydiaosi, lazynvshen, lazystudy;int ls, rs, ms; //屌絲標(biāo)記int nsl, nsr, nsm; //女神標(biāo)記 } a[L << 2];void diaosi(int l, int r, int i) {a[i].lazydiaosi= 1;a[i].ls= a[i].rs= a[i].ms= 0; }void nvshen(int l, int r, int i) {a[i].lazynvshen= 1;a[i].lazydiaosi= 0;a[i].ls= a[i].rs= a[i].ms= 0;a[i].nsl= a[i].nsr= a[i].nsm= 0; }void xuexi(int l, int r, int i) {a[i].lazystudy= 1;a[i].lazydiaosi= a[i].lazynvshen= 0;//屌絲女神標(biāo)記清空a[i].ls= a[i].rs= a[i].ms= r - l + 1;a[i].nsl= a[i].nsr= a[i].nsm= r - l + 1; }void pushup(int l, int r, int i)//區(qū)間合并 {int mid= (l + r) >> 1;a[i].ms= max(a[2 * i].ms, a[2 * i + 1].ms);a[i].ms= max(a[i].ms, a[2 * i].rs + a[2 * i + 1].ls);a[i].ls= a[2 * i].ls;a[i].rs= a[2 * i + 1].rs;if (a[2 * i].ls == mid - l + 1)a[i].ls+= a[2 * i + 1].ls;if (a[2 * i + 1].rs == r - mid)a[i].rs+= a[2 * i].rs;a[i].nsm= max(a[2 * i].nsm, a[2 * i + 1].nsm);a[i].nsm= max(a[i].nsm, a[2 * i].nsr + a[2 * i + 1].nsl);a[i].nsl= a[2 * i].nsl;a[i].nsr= a[2 * i + 1].nsr;if (a[2 * i].nsl == mid - l + 1)a[i].nsl+= a[2 * i + 1].nsl;if (a[2 * i + 1].nsr == r - mid)a[i].nsr+= a[2 * i].nsr; }void pushdown(int l, int r, int i) {int mid= (l + r) >> 1;//按照優(yōu)先級依次下降lazyif (a[i].lazystudy) {xuexi(l, mid, 2 * i);xuexi(mid + 1, r, 2 * i + 1);a[i].lazystudy= 0;}if (a[i].lazydiaosi) {diaosi(l, mid, 2 * i);diaosi(mid + 1, r, 2 * i + 1);a[i].lazydiaosi= 0;}if (a[i].lazynvshen) {nvshen(l, mid, 2 * i);nvshen(mid + 1, r, 2 * i + 1);a[i].lazynvshen= 0;} }void study(int L, int R, int l, int r, int i) {if (L == l && R == r) {xuexi(l, r, i);return;}int mid= (l + r) >> 1;pushdown(l, r, i);if (R <= mid)study(L, R, l, mid, 2 * i);else if (L > mid)study(L, R, mid + 1, r, 2 * i + 1);else {study(L, mid, l, mid, 2 * i);study(mid + 1, R, mid + 1, r, 2 * i + 1);}pushup(l, r, i); }void insert(int flag, int L, int R, int l, int r, int i) {if (l == L && r == R) {if (!flag)diaosi(l, r, i);elsenvshen(l, r, i);return;}int mid= (l + r) >> 1;pushdown(l, r, i);if (R <= mid)insert(flag, L, R, l, mid, 2 * i);else if (L > mid)insert(flag, L, R, mid + 1, r, 2 * i + 1);else {insert(flag, L, mid, l, mid, 2 * i);insert(flag, mid + 1, R, mid + 1, r, 2 * i + 1);}pushup(l, r, i); }int query(int flag, int t, int l, int r, int i) {if (l == r)return l;int mid= (l + r) >> 1;pushdown(l, r, i);if (!flag) {//屌絲if (a[2 * i].ms >= t)//左子樹有時間return query(flag, t, l, mid, 2 * i);else if (a[2 * i].rs + a[2 * i + 1].ls >= t)//右子樹+右子樹有時間return mid - a[2 * i].rs + 1;else//右子樹有時間return query(flag, t, mid + 1, r, 2 * i + 1);}else {if (a[2 * i].nsm >= t)return query(flag, t, l, mid, 2 * i);else if (a[2 * i].nsr + a[2 * i + 1].nsl >= t)return mid - a[2 * i].nsr + 1;elsereturn query(flag, t, mid + 1, r, 2 * i + 1);} }int main() {int t, i, x, y, ans, cas= 1, n, m;char str[20];scanf("%d", &t);while (t--) {scanf("%d%d", &n, &m);printf("Case %d:\n", cas++);study(1, n, 1, n, 1);while (m--) {scanf("%s", str);if (str[0] == 'D') {scanf("%d", &x);if (a[1].ms < x) //線段樹最大的區(qū)間都小于給定的時間就不用找了printf("fly with yourself\n");else {ans= query(0, x, 1, n, 1);insert(0, ans, ans + x - 1, 1, n, 1);printf("%d,let's fly\n", ans);}}else if (str[0] == 'N') {scanf("%d", &x);if (a[1].ms < x) {if (a[1].nsm < x)printf("wait for me\n");else {ans= query(1, x, 1, n, 1);insert(1, ans, ans + x - 1, 1, n, 1);printf("%d,don't put my gezi\n", ans);}}else {ans= query(0, x, 1, n, 1);insert(1, ans, ans + x - 1, 1, n, 1);printf("%d,don't put my gezi\n", ans);}}else {scanf("%d%d", &x, &y);study(x, y, 1, n, 1);printf("I am the hope of chinese chengxuyuan!!\n");}}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的约会安排 HDU - 4553的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。