定義第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 處歸隊。求每次離隊事件...