題解 清華集訓2014 玄學

2022-05-01 19:42:09 字數 1252 閱讀 3745

題目傳送門

給出乙個 \(n\) 個點的序列,有 \(m\) 次操作,每次操作為以下兩種:

二進位制分組好啊!!!

考慮修改操作,我們發現其實每次修改,都會有一段一段的區間是相同的變化規則,我們可以根據這個將兩個操作進行合併。

考慮時間複雜度,你每次增加的時候最多增加 \(3\) 段,於是總段數就是 \(n\log^2 n\),總時間複雜度也是 \(\theta(n\log^2 n)\)(假設 \(n,m\) 同階)

#include using namespace std;

#define int register int

#define maxm 600005

#define maxn 100005

template inline void read (t &t)while (c >= '0' && c <= '9') t *= f;}

template inline void read (t &t,args&... args)

template inline void write (t x)if (x > 9) write (x / 10);putchar (x % 10 + '0');}

int n,m,k,q,cnt,ans,kase,val[maxn],lef[maxm << 2],rig[maxm << 2];

struct node

node (int _l,int _r,int _a,int _b)

}p[maxm * 200];

void pushup (int x)

else

rig[x] = cnt;

}void find (int x,int t,int &s)

s = (1ll * s * p[l].a % m + p[l].b) % m;

}void modify (int x,int l,int r,int pos,node &t)

int mid = (l + r) >> 1;

if (pos <= mid) modify (x << 1,l,mid,pos,t);

else modify (x << 1 | 1,mid + 1,r,pos,t);

if (pos == r) pushup (x);

}void query (int x,int l,int r,int ql,int qr)

signed main()

else

} return 0;

}

清華集訓 2014 玄學

update text update 我之前講的是個什麼鬼 如果想看看人話版本 戳這。感覺自己被坑騙了。題目明明寫了所有資料不超過int,敢情是輸入資料不超int?迷惑行為 題目感覺有點繞,我盡量 不口胡。首先我們搞一顆線段樹1,樹表示插入序列的編號。如,在q行中第i個出現插入操作 其實拿到這道題我...

46 清華集訓2014 玄學

一開始腦子進水了 把這題想簡單了 複雜度算錯了 每次都用nlogn的時間修改 而且還狂寫stl 然後就直播自爆8小時qaq。先掛個5分 include include include include include includeusing namespace std define rep i,j,...

清華集訓2014 玄學 二進位制分組

鏈結 考慮對操作二進位制分組。每個塊內維護這個區間的操作把整個序列分成的段數 每一段有兩個值a,b a,ba,b代表這一段的真實值為ax bax b ax b 比如相交的兩個操作會形成3段,分別為a1x b a 1x b a1 x b a 1a 2x a 2b1 b2,a 2x b 2a 1a 2x...