一開始腦子進水了、把這題想簡單了、複雜度算錯了、每次都用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...