這道題顯然要使用資料結構維護。但是n的規模十分大。我們便可以開n棵線段樹,動態開點。但是最後一列比較特殊,所以我們再開一棵線段樹維護最後一列。至於怎麼操作?我們考慮權值線段樹。權值線段樹一般是維護:權值為[l,r]的數有多少是滿足某種條件的。本道題目中我們維護區間[l,r]中有多少個數沒有操作過。線段樹的長度要開為 max(n,m)+q,這樣如果我們查詢乙個數的位置發現她超過了m,說明她已經不在原位置了,出去的數我們用vector儲存,每次直接訪問下標就可以查詢了。這裡的原理就是查詢該行排名為k的點。發現這個點之後就將其壓入維護最後一列的vector中,並將此時在最後一列中排名為k的點壓入改行,就行了。注意特判詢問的縱座標為m的情況
code:
#include#include#include#include#include#include#include#include#define max max
#define maxn 5000006
#define mod 1000000007
#define rep(i,a,b) for (int i=a;i<=b;++i)
#define erep(i,a) for (int i=head[a];i!=-1;i=e[i].next)
#define half (l+r)>>1
#define lson t[s].lc
#define pb push_back
#define all (zmd)
#define rson t[s].rc
using namespace std;
#define int long long
struct zmd
;struct hzw
t[maxn];
int n,m,mx,tot,q;
inline int max(int a,int b)
inline void update(int &s,int l,int r,int p)
int mid=half;
if (p<=mid) update(lson,l,mid,p);
else update(rson,mid+1,r,p);
t[s].sum=t[lson].sum+t[rson].sum;
}int root[maxn];
inline int query(int s,int l,int r,int p)
vectorv[300006];
inline int solve1(int x,int y)
return 0;
}
看,十分玄妙,所以不要亂define了
C 多型以及其注意事項
1 虛函式 覆蓋以及多型的概念 1 class 基類 的成員函式,稱為虛函式或方法。2 覆蓋 如果子類的成員函式和基類的虛函式具有 相同 的函式原型,那麼該成員函式就也是虛函式,無論其是否帶有virtual關鍵字,且對基類中的虛函式構成覆蓋。class 子類 public 基類 3 多型 如果子類提...
靜態的特點以及注意事項
static方法是類中的乙個成員方法,屬於整個類,即使不用建立任何物件也可以直接呼叫 優先於物件存在,被所有物件所共享 靜態方法 效率上要比例項化高,靜態方法 的缺點是不自動進行銷毀,而例項化的則可以做銷毀。靜態會隨著類的消失而消失,說明他的生命週期最長 1 靜態方法只能訪問靜態成員 2 靜態方法中...
git基本操作,以及注意事項
1 首先應該去把乙個專案轉殖下來 git clone 專案位址 這樣你才能獲得專案的分支,2 提交步驟 a git add 注意 add 後面有 而且需要有空格 b git commit m 引號後面為提交需要寫的說明 c git push 當只有一條主分支時,可以直接用 否則用 git push ...