46 清華集訓2014 玄學

2021-08-03 15:43:27 字數 2753 閱讀 1982

一開始腦子進水了、把這題想簡單了、複雜度算錯了、每次都用nlogn的時間修改、而且還狂寫stl、然後就直播自爆8小時qaq。

先掛個5分**。

#include#include#include#include#include#includeusing namespace std;

#define rep(i,j,k) for(i=j;i<=k;++i)

#define per(i,j,k) for(i=j;i>=k;--i)

#define pii pair#define mkp make_pair

#define x first

#define y second

#define ll long long

ll n,m,m,w[100005],mx,ans;

struct modifymdf0,sb;

vectort[7000000];

ll qa,qb;

void write(ll l,ll r,ll num)

bool cmp1(modify x,modify y)

void ins(modify in,ll x,ll l,ll r,ll num),cmp1);

ll tmpi=ll->i,tmpj=ll->j,tmpa=ll->a,tmpb=ll->b;

if(tmpi=in.j),cmp1);

if(tmpj>in.j)t[num].insert(rr,(modify));

rr=lower_bound(t[num].begin(),t[num].end(),(modify),cmp2);

*rr=(modify);

} else,cmp2);

if(tmpj>in.j)t[num].insert(rr,(modify));

ll=--upper_bound(t[num].begin(),t[num].end(),(modify),cmp1);

rr=lower_bound(t[num].begin(),t[num].end(),(modify),cmp2);

*ll=(modify);

*rr=(modify);

for(ii=++ll;ii!=rr;++ii)

*ii=(modify);

} if(l==r)return;

// write(l,r,num);

ll mid=l+r>>1ll;

if(x>mid)ins(in,x,mid+1,r,num<<1ll|1ll);

else ins(in,x,l,mid,num<<1ll);

}void query(ll l,ll r,ll x,ll l,ll r,ll num),cmp2);

qa=ii->a*qa%m;qb=(ii->b+ii->a*qb)%m;

return;

} ll mid=l+r>>1ll;

if(l<=mid)query(l,r,x,l,mid,num<<1ll);

if(r>mid)query(l,r,x,mid+1ll,r,num<<1ll|1ll);

}int main();sb=(modify);

build(1ll,mx,1ll);

while(q--),++m,1ll,mx,1ll);

} else

} write(1,mx,1);

return 0;

}

到現在才知道這題的思路用多恐怖。

實際上這題是修改log,查詢log^2的。

相當於離線。由於每次的query只會對已修改的操作,所以可以

分步進行預處理

。每次對乙個l==r的節點x修改,然後對包含它的節點進行線段樹合併,當且僅當這個節點的r恰好為x的r(或l)。

然後查詢時使用二分查詢。

最後注意對stl say goodbye!!!

ac**:

#include#include#include#include#include#includeusing namespace std;

#define rep(i,j,k) for(i=j;i<=k;++i)

#define per(i,j,k) for(i=j;i>=k;--i)

#define ll long long

#define pll pair#define mkp make_pair

#define x first

#define y second

ll n,m,m,w[100000],mx,ans;

struct modifymdf,qj[7000000];

pll t[400000];ll id;

ll l,r,wz,qa,qb;

void ins(ll l,ll r,ll num);

qj[++id]=mdf;

if(mdf.j>1;

if(m>mid)ins(mid+1,r,num<<1|1);

else ins(l,mid,num<<1);

if(m==r);

k=qj[l2].j+1;++l2;

}else;

k=qj[l1].j+1;++l1;++l2;

}} t[num]=mkp(l0,id); }}

bool cmp(modify u,modify v)

int main();++m;

ins(1ll,mx,1ll);

} else

} return 0;

}

清華集訓 2014 玄學

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

題解 清華集訓2014 玄學

題目傳送門 給出乙個 n 個點的序列,有 m 次操作,每次操作為以下兩種 二進位制分組好啊!考慮修改操作,我們發現其實每次修改,都會有一段一段的區間是相同的變化規則,我們可以根據這個將兩個操作進行合併。考慮時間複雜度,你每次增加的時候最多增加 3 段,於是總段數就是 n log 2 n 總時間複雜度...

清華集訓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...