NOIP2017 列隊(樹狀陣列)

2022-03-07 04:48:12 字數 884 閱讀 3984

定義第i行為所有的點(i,j),0

可以發現,每一行是相對獨立的,每一次操作只會影響到當前行和最後一列

考慮每一行和最後一列各開乙個樹狀陣列,但這樣顯然會爆空間

實際上,對於沒有離隊過的點是沒必要儲存的,可以直接算出編號,

因此只要用vector儲存每一行和最後一列後加入的點即可

還需要預處理乙個陣列d[i]表示第i次詢問當前行的離隊的點的縱座標

這個可以離線做出來,然後只需要對最後一列維護乙個樹狀陣列即可

#include #include #include #include #define ll long long

#define lowbit(x) ((x)&(-x))

#define n 300010

using namespace std;

struct infoa[n];

int n,m,qn,mx,d[n],a[n<<1],q[n][2];

vectort[n];

vectorv[n],lst;

inline int read()

while(ch>='0'&&ch<='9')

return x*f;

}void add(int x,int y)

int q(int x)

int find(int r)

return tmp;

}void init());

} for(int i=1;i<=mx;++i) add(i,1);

for(int i=1;i<=n;++i)

}void solve()

lst.push_back(ans);

printf("%lld\n",ans); }}

int main()

線段樹 資料結構 NOIP2017列隊

很簡單的線段樹水題。不知道為啥一年前不會。每行開乙個線段樹,最後一列再開乙個線段樹。對每個操作分兩種情況討論 在最後一列,不在最後一列。如果不在最後一列,現在行線段樹上把那個位置刪去,在列線段樹末尾插入它。並且找到列線段樹對應的行的值,把他從列線段樹中刪除,加入到行線段樹中去。用動態加點的方式可以避...

NOIP2017提高組 列隊

noip2017提高組 day2 t3 sylvia 是乙個熱愛學習的女孩子。前段時間,sylvia 參加了學校的軍訓。眾所周知,軍訓的時候需要站方陣。sylvia 所在的方陣中有 n m 名學生,方陣的行數為 n,列數為 m 為了便於管理,教官在訓練開始時,按照從前到後,從左到右的順序給方陣中的學...

NOIp2017提高組 列隊

乙個 n times m n,m le3 times10 5 的方陣,每個格仔裡的人都有乙個編號。初始時第 i 行第 j 列的編號為 i 1 m j q q le3 times10 5 次事件,每次在 x,y 位置上的人離隊。剩下的人向左 向前填補空位,然後離隊的人在 n,m 處歸隊。求每次離隊事件...