高一上十一月下旬日记
11.21
闲话
- 侯操时又被通知加圈了;早读时 \(huge\) 说让我们注意原文、注释、赏析的理解背诵,要看清楚再读,他上次见有个人背《兰亭集序》自己背错了都不知道还搁那里背呢。
- 临下早读时 \(huge\) 说一会儿 \(HS,FY\) 高一的会有人来我们机房一起集训,让我们把空位上的东西都收拾收拾。
- 上午 \(7:30 \sim 12:00\) 打 accoders NOI 的模拟赛。
- 下午放 \(huge\) 的每日一歌《七里香》,由 @wkh2008 和 @wang54321 “激情”演唱;然后听多校讲题,讲完题就去上体育课了。回来后 \(huge\) 说明天多校的安排是晚上讲 noip杂题选讲 ,但我们明天还是得打学校 \(OJ\) 的模拟赛,让我们自己抽时间做。
- \(huge\) 给今天新来的人讲解了下时间安排。
- 吃晚饭前 \(huge\) 貌似给没关显示器的电脑关机了。回来后 \(huge\) 又专门强调了下这个东西,说离开电脑桌时建议把电脑关机,但我们只关显示器也行。
- 晚上 \(huge\) 说以后牛奶、酸奶之类的东西也别往机房带了,估计是看见我塞到两台电脑显示器中间的酸奶了。
做题纪要
P509. 图 (a)
luogu P8890 [入门赛 #7] 打 ACM 最快乐的就是滚榜读队名了 (Hard Version)
-
多倍经验: luogu B3692 [语言月赛202212] 打 ACM 最快乐的就是滚榜读队名了(Easy Version)
-
模拟。
点击查看代码
struct submit { int tim,id,state,problem; bool operator < (const submit &another) const { return (problem==another.problem)?id<another.id:problem<another.problem; } }; struct team { int acsum,penalty,order,cnt[27]; string name; deque<submit>roll; bool operator < (const team &another) const { if(acsum!=another.acsum) { return acsum>another.acsum; } return (penalty==another.penalty)?order<another.order:penalty<another.penalty; } bool operator > (const team &another) const { if(acsum!=another.acsum) { return acsum>another.acsum; } return (penalty==another.penalty)?order<another.order:penalty<another.penalty; } }e[200010],tmp; unordered_map<string,int>f; priority_queue<team>q; int get_tim() { int x,y,z; char pd; cin>>x>>pd>>y>>pd>>z; return x*3600+y*60+z; } int get_problem(char x) { return x-'A'+1; } void work(team &x,int tim,int state,int problem) { if(x.cnt[problem]!=-1) { if(state==1) { x.acsum++; x.penalty+=x.cnt[problem]*20+tim; x.cnt[problem]=-1; } else { x.cnt[problem]++; } } } void read(int &cnt,int id) { char c; string name,pd; int tim=get_tim(); cin>>c>>name; getline(cin,pd); int state=(pd[1]=='A'); int problem=get_problem(c); if(f.find(name)==f.end()) { cnt++; f[name]=cnt; e[f[name]].order=cnt; e[f[name]].name=name; } if(tim<=14400) { work(e[f[name]],tim/60,state,problem); } else { e[f[name]].roll.push_back((submit){tim/60,id,state,problem}); } } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,k,cnt=0,i; cin>>n>>m>>k; for(i=1;i<=k;i++) { read(cnt,i); } for(i=1;i<=cnt;i++) { sort(e[i].roll.begin(),e[i].roll.end()); q.push(e[i]); } while(q.empty()==0) { tmp=q.top(); q.pop(); cout<<tmp.name<<endl; if(q.empty()==0) { while(tmp.roll.empty()==0&&q.top()>tmp) { work(tmp,tmp.roll.front().tim,tmp.roll.front().state,tmp.roll.front().problem); tmp.roll.pop_front(); } if(tmp>q.top()) { q.push(tmp); } } } return 0; }
P510. 序列 (b)
P512. 字符串 (d)
11.22
闲话
- 上午 \(7:30 \sim 12:00\) 打学校 \(OJ\) 的模拟赛。模拟赛结束后 \(huge\) 说这次模拟赛成绩估计会很接近 \(NOIP\) 的得分情况, \(T1,T2\) 还是建议切掉的,像这种写了八九十分的自己找找原因,要不然损失太大了
- 下午放 \(huge\) 的每日一歌《七里香》;然后讲题。
- 晚上德育主任来我们宿舍转悠时说“听说 \(201\) 班的同学学习很刻苦,怎么这么早就回来了”。
做题纪要
HZTG5683. 镜的绮想 (mirror)
HZTG5684. 万物有灵 (animism)
HZTG5685. 白石溪 (creek)
BZOJ3786 星系探索
HZTG5686. 上山岗 (uphill)
11.23
闲话
- 记录下昨晚上的梦,有点抽象。
- 末世背景下,“始皇”降临,梦里的外形是蛛形、人脸朝上、八足(或者更多)、两翅,比 飞诞鸟 的外形大点。并带来了“土皇”、“木皇”,但我并不记得这在我的梦里对情节有什么推动作用,仅依稀记得有人说“土皇”貌似站在了人类历程但因为一些原因被“木皇”一刀秒了。
- 因为一些原因(记不清了),人类损失很大。我在某个农村宅子里出现,家里只有我活了下来。在某人的邀请下去到他家里补充物资,我记不清他到底是不是人(感觉有点像黄鼠狼),临走时还给我抓了一大把零食,并投喂给了他养的“鸡”,且“鸡”还能说人话。然后突然有两个人出现在屋里,他直接消失了,然后那两人拿着老式猎枪砰砰给我来了两枪,但我没倒下还往外走并看见了另外两个刚从门外进来的人。
- 然后我突然出现在了 \(HZ\) 西扩的操场头(整个校园没有半点末世降临的痕迹)上,然后我开始非常中二地喊“HZ,我叫你一声你敢答应吗”,然后连叫喊三声,接着就校园里就响起了音乐,我顺势穿过校园,沿途看见的老师和同学也都在跟着唱。然后我被要求去操场拍优秀班级体合影,身边都是初三同学和原班主任。回宿舍午休后我楼道里有三、四个宿管在转悠,不时听见宿管大声怒斥午休期间某宿舍的违纪,我当时在下铺来回举凳子,但啥事没有。
- 然后我就出现在了我家里,家长跟我说我的什么证件落在学校里了,但已经找人让送回来了。然后说我前面昏迷了,说胡话的时候说我为了保护我奶奶,把门把手又卸下来了(现实中我以前卸了一个了)、门夹页的螺丝也弄断了,家长怀疑我是遇见什么脏东西或被“大力神”附体了,然后放了个手掌大小的玩偶娃娃在我床头就没事了,还解释说怪不得学校床的栏杆上都贴着学校发的中高考加油的笑脸。还问我是不是晚上玩手机了,家长听见我给前面提到的那个人打电话了,且我始终不知道家长是怎么知道我给那个人打电话了,因为梦中的我记得自己根本没有做这件事且手机没有通信记录。
- 惊醒后回味着这一切突然发现不合理可能是因为“我死了”。
- 上午 \(7:30 \sim 12:00\) 打梦熊联盟的模拟赛。
- 下午放 \(feifei\) 的每日一歌《东风破》;然后听多校的讲题。讲完题后 \(feifei\) 说看我们报名 \(WC\) 的热情比较强烈,今年举办地点在绍兴,时间在一周左右,主要是因为要选拔国家队才顺带举办的冬令营,讲课也基本都是省选 \(+\) 的难度,要是我们单纯想去绍兴旅游或者去玩一周的话,那建议就不要去了,而且去年只有 @APJifengc 报名了,让我们重新决定下要不要报名,要是报名的人还是很多教练和省特派员那里都会卡一下。
- \(feifei\) 说明天多校的安排是打 【MX-S7】梦熊 NOIP 2024 模拟赛 3 & SMOI Round 2(同步赛) 。
- 体活回来后开始感觉有点难受,从出虚汗开始,上次出现这种感觉大概是在去年这个时候,前几次也不知道怎么就突然好了,可能是吃了什么东西导致的。
做题纪要
2025--炼石计划-- 11 月 23 日 --NOIP 模拟赛 #23 T1 A. 排序
2025--炼石计划-- 11 月 23 日 --NOIP 模拟赛 #23 T2 B. 交换
luogu P11310 无穷的迭代器
-
\((k+\frac{1}{2})(k+1)=k^{2}+\frac{3k}{2}+1\) ,用 \(k^{2}+\frac{3k}{2}\) 代替继续迭代的过程中要求 \(k\) 为偶数。
-
故二进制表示下 \(0\) 的个数加 \(1\) 即为所求。
点击查看代码
int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll t,n,i; cin>>t; for(i=1;i<=t;i++) { cin>>n; if(n==0) { cout<<"NO!"<<endl; } else { cout<<__builtin_ctzll(n)+1<<endl; } } return 0; }
11.24
闲话
- 早起一觉睡到了 \(6:40\) ,但无大碍。
- 上午 \(8:30 \sim 12:15\) 打梦熊联盟的模拟赛。临吃午饭时 \(feifei\) 问我们“有没有想中午不睡觉把比赛打完的”,我们刚打算表态, \(feifei\) 就接着说“有这种想法的赶紧撤回”。感觉 \(feifei\) 每次说话都像这样“一波三折”的。
- 模拟赛打到一半又开始难受,但愿到 \(NOIP\) 前能恢复正常,之前好歹还能在教室吃个面包,原班主任看见后也没管我,但现在就不一定了,还得符合“零食饮料禁止入内”的规定。
- 下午到机房后正好赶上上午模拟赛的讲评。
- 晚上去食堂的路上看见学校把 \(HZ\) 第二届学生代表大会的参会人员挂出来了(大头照加个人简介)。貌似高一要开冬三月动员大会。
- \(20:00\) 左右 \(feifei\) 说一会儿讨论时间我们可以下去活动一下,但是不能出科教馆,他给我们想了个好主意是爬楼梯,遂在科教馆闲逛。到 \(7\) 楼的天文台后发现受到神秘力量封锁。
- 回来后 \(feifei\) 突然严肃地问我们知道厕所那头是谁的办公室吗,点了两个 \(FY\) 的问校长是谁,说那是 \(FY\) 校长的办公室, \(feifei\) 和 \(huge\) 想把我们开回家还得层层申请,但他想把我们开回家可就是一句话的事情。还说刚才 \(505\) 机房有人都转悠到他办公室去了,让我们以后都不要去那里转悠了,“那里是危险区域”。
- 详见 2024 NOIP 游记 11.24 。
做题纪要
luogu P4839 P 哥的桶
-
线段树维护线性基合并,时间复杂度为 \(O(m \log n \log^{2} V)\) 。
-
为减小常数,合并线性基时仅插入非零值。
点击查看代码
struct Liner_Base { int d[32]; void clear() { memset(d,0,sizeof(d)); } void insert(int x) { for(int i=31;i>=0;i--) { if((x>>i)&1) { if(d[i]==0) { d[i]=x; break; } x^=d[i]; } } } void merge(Liner_Base x) { for(int i=31;i>=0;i--) { if(x.d[i]!=0) { insert(x.d[i]); } } } int query() { int ans=0; for(int i=31;i>=0;i--) { ans=max(ans,ans^d[i]); } return ans; } }ans; struct SMT { struct SegmentTree { Liner_Base info; }tree[200010]; int lson(int x) { return x*2; } int rson(int x) { return x*2+1; } void update(int rt,int l,int r,int pos,int val) { tree[rt].info.insert(val); if(l==r) { return; } int mid=(l+r)/2; if(pos<=mid) { update(lson(rt),l,mid,pos,val); } else { update(rson(rt),mid+1,r,pos,val); } } void query(int rt,int l,int r,int x,int y) { if(x<=l&&r<=y) { ans.merge(tree[rt].info); return; } int mid=(l+r)/2; if(x<=mid) { query(lson(rt),l,mid,x,y); } if(y>mid) { query(rson(rt),mid+1,r,x,y); } } }T; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,pd,l,r,i; cin>>m>>n; for(i=1;i<=m;i++) { cin>>pd>>l>>r; if(pd==1) { T.update(1,1,n,l,r); } else { ans.clear(); T.query(1,1,n,l,r); cout<<ans.query()<<endl; } } return 0; }
CF1100F Ivan and Burgers
-
考虑猫树分治优化查询时的线性基合并。
-
时间复杂度为 \(O(n \log n \log V+m \log^{2} V)\) 。
点击查看代码
int a[500010],ans[500010]; vector<pair<int,int> >q[500010]; struct Liner_Base { int d[23]; void clear() { memset(d,0,sizeof(d)); } void insert(int x) { for(int i=20;i>=0;i--) { if((x>>i)&1) { if(d[i]==0) { d[i]=x; break; } x^=d[i]; } } } int query() { int ans=0; for(int i=20;i>=0;i--) { ans=max(ans,ans^d[i]); } return ans; } }L[500010]; int merge(Liner_Base a,Liner_Base b) { for(int i=20;i>=0;i--) { if(b.d[i]!=0) { a.insert(b.d[i]); } } return a.query(); } void solve(int l,int r) { if(l==r) { for(ll i=0;i<q[r].size();i++) { if(q[r][i].first==l) { ans[q[r][i].second]=a[l]; } } return; } int mid=(l+r)/2; L[mid].clear(); L[mid].insert(a[mid]); for(ll i=mid-1;i>=l;i--) { L[i]=L[i+1]; L[i].insert(a[i]); } L[mid+1].clear(); L[mid+1].insert(a[mid+1]); for(ll i=mid+2;i<=r;i++) { L[i]=L[i-1]; L[i].insert(a[i]); } for(ll i=mid+1;i<=r;i++) { for(ll j=0;j<q[i].size();j++) { if(l<=q[i][j].first&&q[i][j].first<=mid) { ans[q[i][j].second]=merge(L[i],L[q[i][j].first]); } } } solve(l,mid); solve(mid+1,r); } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,l,r,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; } cin>>m; for(i=1;i<=m;i++) { cin>>l>>r; q[r].push_back(make_pair(l,i)); } solve(1,n); for(i=1;i<=m;i++) { cout<<ans[i]<<endl; } return 0; }
luogu P3292 [SCOI2016] 幸运数字
-
树剖加线段树维护线性基合并,时间复杂度为 \(O(n \log n \log V+m \log^{2} n \log^{2} V)\) 。
点击查看代码
struct node { ll nxt,to; }e[40010]; ll head[20010],fa[20010],siz[20010],dep[20010],son[20010],top[20010],dfn[20010],c[20010],cc[20010],cnt=0,tot=0; void add(ll u,ll v) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; head[u]=cnt; } void dfs1(ll x,ll father) { siz[x]=1; fa[x]=father; dep[x]=dep[father]+1; for(ll i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=father) { dfs1(e[i].to,x); siz[x]+=siz[e[i].to]; son[x]=(siz[e[i].to]>siz[son[x]])?e[i].to:son[x]; } } } void dfs2(ll x,ll id) { top[x]=id; tot++; dfn[x]=tot; cc[tot]=c[x]; if(son[x]!=0) { dfs2(son[x],id); for(ll i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=fa[x]&&e[i].to!=son[x]) { dfs2(e[i].to,e[i].to); } } } } struct Liner_Base { ll d[62]; void clear() { memset(d,0,sizeof(d)); } void insert(ll x) { for(ll i=60;i>=0;i--) { if((x>>i)&1) { if(d[i]==0) { d[i]=x; break; } x^=d[i]; } } } void merge(Liner_Base x) { for(ll i=60;i>=0;i--) { if(x.d[i]!=0) { insert(x.d[i]); } } } ll query() { ll ans=0; for(ll i=60;i>=0;i--) { ans=max(ans,ans^d[i]); } return ans; } }ans; struct SMT { struct SegmentTree { Liner_Base info; }tree[80010]; ll lson(ll x) { return x*2; } ll rson(ll x) { return x*2+1; } void build(ll rt,ll l,ll r) { for(ll i=l;i<=r;i++) { tree[rt].info.insert(cc[i]); } if(l==r) { return; } ll mid=(l+r)/2; build(lson(rt),l,mid); build(rson(rt),mid+1,r); } void query(ll rt,ll l,ll r,ll x,ll y) { if(x<=l&&r<=y) { ans.merge(tree[rt].info); return; } ll mid=(l+r)/2; if(x<=mid) { query(lson(rt),l,mid,x,y); } if(y>mid) { query(rson(rt),mid+1,r,x,y); } } }T; ll query1(ll u,ll v,ll n) { ans.clear(); while(top[u]!=top[v]) { if(dep[top[u]]>dep[top[v]]) { T.query(1,1,n,dfn[top[u]],dfn[u]); u=fa[top[u]]; } else { T.query(1,1,n,dfn[top[v]],dfn[v]); v=fa[top[v]]; } } if(dep[u]<dep[v]) { T.query(1,1,n,dfn[u],dfn[v]); } else { T.query(1,1,n,dfn[v],dfn[u]); } return ans.query(); } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,m,u,v,i; cin>>n>>m; for(i=1;i<=n;i++) { cin>>c[i]; } for(i=1;i<=n-1;i++) { cin>>u>>v; add(u,v); add(v,u); } dfs1(1,0); dfs2(1,1); T.build(1,1,n); for(i=1;i<=m;i++) { cin>>u>>v; cout<<query1(u,v,n)<<endl; } return 0; }
luogu P5607 [Ynoi2013] 无力回天 NOI2017
-
考虑将区间修改转化为 \(l,r+1\) 的单点修改。
-
设 \(b_{i}=a_{i}\bigoplus a_{i-1}\) ,相应地有 \(a_{i}=\bigoplus\limits_{j=1}^{i}b_{j}\) 。
-
那么 \(a_{l \sim r}\) 的线性基就等价于 \(a_{l}\) 与 \(b_{l+1 \sim r}\) 构成的线性基,线段树维护即可。
点击查看代码
int a[50010],b[50010]; struct Liner_Base { int d[32]; void clear() { memset(d,0,sizeof(d)); } void insert(int x) { for(int i=31;i>=0;i--) { if((x>>i)&1) { if(d[i]==0) { d[i]=x; break; } x^=d[i]; } } } void merge(Liner_Base x) { for(int i=31;i>=0;i--) { if(x.d[i]!=0) { insert(x.d[i]); } } } int query(int ans) { for(int i=31;i>=0;i--) { ans=max(ans,ans^d[i]); } return ans; } }ans; struct SMT { struct SegmentTree { Liner_Base info; }tree[200010]; int lson(int x) { return x*2; } int rson(int x) { return x*2+1; } void pushup(int rt) { tree[rt].info=tree[lson(rt)].info; tree[rt].info.merge(tree[rson(rt)].info); } void build(int rt,int l,int r) { for(int i=l;i<=r;i++) { tree[rt].info.insert(b[i]); } if(l==r) { return; } int mid=(l+r)/2; build(lson(rt),l,mid); build(rson(rt),mid+1,r); } void update(int rt,int l,int r,int pos,int val) { if(l==r) { tree[rt].info.clear(); b[l]^=val; tree[rt].info.insert(b[l]); return; } int mid=(l+r)/2; if(pos<=mid) { update(lson(rt),l,mid,pos,val); } else { update(rson(rt),mid+1,r,pos,val); } pushup(rt); } void query(int rt,int l,int r,int x,int y) { if(x<=l&&r<=y) { ans.merge(tree[rt].info); return; } int mid=(l+r)/2; if(x<=mid) { query(lson(rt),l,mid,x,y); } if(y>mid) { query(rson(rt),mid+1,r,x,y); } } }T; struct BIT { int c[50010]; int lowbit(int x) { return (x&(-x)); } void add(int n,int x,int val) { for(int i=x;i<=n;i+=lowbit(i)) { c[i]^=val; } } int getsum(int x) { int ans=0; for(int i=x;i>=1;i-=lowbit(i)) { ans^=c[i]; } return ans; } }B; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,pd,l,r,v,i; cin>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]^a[i-1]; B.add(n,i,b[i]); } T.build(1,1,n); for(i=1;i<=m;i++) { cin>>pd>>l>>r>>v; if(pd==1) { B.add(n,l,v); T.update(1,1,n,l,v); if(r+1<=n) { B.add(n,r+1,v); T.update(1,1,n,r+1,v); } } else { if(l==r) { cout<<max(v,v^B.getsum(l))<<endl; } else { ans.clear(); ans.insert(B.getsum(l)); T.query(1,1,n,l+1,r); cout<<ans.query(v)<<endl; } } } return 0; }
luogu P11323 【MX-S7-T1】「SMOI-R2」Happy Card
luogu P11324 【MX-S7-T2】「SMOI-R2」Speaker
[ABC022C] Blue Bird
-
无向图包含特定点最小环。
点击查看代码
int vis[10010],dis[10010],N; vector<pair<int,int> >broke,e[10010],ee[10010]; void add(int u,int v,int w,vector<pair<int,int> >e[]) { e[u].push_back(make_pair(v,w)); } void dijkstra(int s,vector<pair<int,int> >e[]) { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); priority_queue<pair<int,int> >q; dis[s]=0; q.push(make_pair(-dis[s],-s)); while(q.empty()==0) { int x=-q.top().second; q.pop(); if(vis[x]==0) { vis[x]=1; for(int i=0;i<e[x].size();i++) { if(dis[e[x][i].first]>dis[x]+e[x][i].second) { dis[e[x][i].first]=dis[x]+e[x][i].second; q.push(make_pair(-dis[e[x][i].first],-e[x][i].first)); } } } } } int main() { int t,n,m,ans=0x7f7f7f7f,u,v,w,i,j,k; cin>>n>>m; N=log2(n)+1; for(i=1;i<=m;i++) { cin>>u>>v>>w; if(u==1||v==1) { if(u==1) { broke.push_back(make_pair(v,w)); } if(v==1) { broke.push_back(make_pair(u,w)); } } else { add(u,v,w,e); add(v,u,w,e); } } for(i=0;i<=N;i++) { for(j=1;j<=n;j++) { ee[j]=e[j]; } for(j=0;j<broke.size();j++) { if((broke[j].first>>i)&1) { add(1,broke[j].first,broke[j].second,ee); add(broke[j].first,1,broke[j].second,ee); } else { add(n+1,broke[j].first,broke[j].second,ee); add(broke[j].first,n+1,broke[j].second,ee); } } dijkstra(1,ee); if(dis[n+1]!=0x3f3f3f3f) { ans=min(ans,dis[n+1]); } } cout<<(ans>=0x7f7f7f7f?-1:ans)<<endl; return 0; }
luogu P8078 [WC2022] 秃子酋长
-
只加不减莫队仍需要寻找前驱后继。考虑只减不加莫队,沿途双向链表记录前驱、后继,用栈储存更改支持撤销,写法同 luogu P9340 [JOISC 2023 Day3] Tourism 。
-
常数较大。
点击查看代码
namespace IO{ #ifdef LOCAL FILE*Fin(fopen("test.in","r")),*Fout(fopen("test.out","w")); #else FILE*Fin(stdin),*Fout(stdout); #endif class qistream{static const size_t SIZE=1<<16,BLOCK=64;FILE*fp;char buf[SIZE];int p;public:qistream(FILE*_fp=stdin):fp(_fp),p(0){fread(buf+p,1,SIZE-p,fp);}void flush(){memmove(buf,buf+p,SIZE-p),fread(buf+SIZE-p,1,p,fp),p=0;}qistream&operator>>(char&x){x=getch();while(isspace(x))x=getch();return*this;}template<class T>qistream&operator>>(T&x){x=0;p+BLOCK>=SIZE?flush():void();bool flag=false;for(;!isdigit(buf[p]);++p)flag=buf[p]=='-';for(;isdigit(buf[p]);++p)x=x*10+buf[p]-'0';x=flag?-x:x;return*this;}char getch(){p+BLOCK>=SIZE?flush():void();return buf[p++];}qistream&operator>>(char*str){char ch=getch();while(ch<=' ')ch=getch();int i=0;for(;ch>' ';++i,ch=getch())str[i]=ch;str[i]='\0';return*this;}}qcin(Fin); class qostream{static const size_t SIZE=1<<16,BLOCK=64;FILE*fp;char buf[SIZE];int p;public:qostream(FILE*_fp=stdout):fp(_fp),p(0){}~qostream(){fwrite(buf,1,p,fp);}void flush(){fwrite(buf,1,p,fp),p=0;}template<class T>qostream&operator<<(T x){int len=0;p+BLOCK>=SIZE?flush():void();x<0?(x=-x,buf[p++]='-'):0;do buf[p+len]=x%10+'0',x/=10,++len;while(x);for(int i=0,j=len-1;i<j;++i,--j)std::swap(buf[p+i],buf[p+j]);p+=len;return*this;}qostream&operator<<(char x){putch(x);return*this;}void putch(char ch){p+BLOCK>=SIZE?flush():void();buf[p++]=ch;}qostream&operator<<(char*str){for(int i=0;str[i];++i)putch(str[i]);return*this;}qostream&operator<<(const char*s){for(int i=0;s[i];++i)putch(s[i]);return*this;}}qcout(Fout); } #define cin IO::qcin #define cout IO::qcout struct quality { int pre,nxt,pos; }s[500010]; struct ask { int l,r,id; }q[500010]; int a[500010],pos[500010],L[500010],R[500010],pre[500010],nxt[500010],id[500010],klen,ksum,top; ll ans[500010],sum; bitset<500010>cnt; bool q_cmp(ask a,ask b) { return (pos[a.l]==pos[b.l])?(a.r>b.r):(a.l<b.l); } void init(int n,int m) { klen=sqrt(n*2); ksum=n/klen; for(int i=1;i<=ksum;i++) { L[i]=R[i-1]+1; R[i]=R[i-1]+klen; } if(R[ksum]<n) { ksum++; L[ksum]=R[ksum-1]+1; R[ksum]=n; } for(int i=1;i<=ksum;i++) { for(int j=L[i];j<=R[i];j++) { pos[j]=i; } } } void del1(int x) { cnt[x]=0; if(pre[x]) { sum-=abs(id[pre[x]]-id[x]); } if(nxt[x]) { sum-=abs(id[x]-id[nxt[x]]); } if(pre[x]&&nxt[x]) { sum+=abs(id[pre[x]]-id[nxt[x]]); } pre[nxt[x]]=pre[x]; nxt[pre[x]]=nxt[x]; } void del2(int x) { cnt[x]=0; s[++top]=(quality){pre[x],nxt[x],x}; if(pre[x]) { sum-=abs(id[pre[x]]-id[x]); } if(nxt[x]) { sum-=abs(id[x]-id[nxt[x]]); } if(pre[x]&&nxt[x]) { sum+=abs(id[pre[x]]-id[nxt[x]]); } pre[nxt[x]]=pre[x]; nxt[pre[x]]=nxt[x]; } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,l=1,r,last,i,j; ll tmp; cin>>n>>m; for(i=1;i<=n;i++) { cin>>a[i]; id[a[i]]=i; } for(i=1;i<=m;i++) { cin>>q[i].l>>q[i].r; q[i].id=i; } init(n,m); sort(q+1,q+1+m,q_cmp); for(i=1;i<=m;i++) { if(pos[q[i].l]!=pos[q[i-1].l]) { cnt.reset(); for(j=L[pos[q[i].l]];j<=n;j++) { cnt[a[j]]=1; } sum=last=0; for(j=1;j<=n;j++) { pre[j]=last; if(cnt[j]) { last=j; if(pre[j]) { sum+=abs(id[pre[j]]-id[j]); } } } last=0; for(j=n;j>=1;j--) { nxt[j]=last; if(cnt[j]) { last=j; } } r=n; } l=L[pos[q[i].l]]; while(r>q[i].r) { del1(a[r]); r--; } tmp=sum; while(l<q[i].l) { del2(a[l]); l++; } ans[q[i].id]=sum; sum=tmp; while(top) { nxt[s[top].pre]=s[top].pos; pre[s[top].nxt]=s[top].pos; cnt[s[top].pos]=1; top--; } } for(i=1;i<=m;i++) { cout<<ans[i]<<endl; } return 0; }
luogu P8251 [NOI Online 2022 提高组] 丹钓战
-
设 \(nxt_{i}\) 表示 \(i\) 是被谁弹出去的,倍增维护即可。
点击查看代码
int a[500010],b[500010],nxt[500010][25]; stack<int>s; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,l,r,ans,i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } for(i=1;i<=n;i++) { scanf("%d",&b[i]); while(s.empty()==0&&(a[s.top()]==a[i]||b[s.top()]<=b[i])) { nxt[s.top()][0]=i; s.pop(); } s.push(i); } for(j=1;j<=20;j++) { for(i=1;i<=n;i++) { nxt[i][j]=nxt[nxt[i][j-1]][j-1]; } } for(j=1;j<=m;j++) { scanf("%d%d",&l,&r); ans=1; for(i=20;i>=0;i--) { if(nxt[l][i]!=0&&nxt[l][i]<=r) { ans+=(1<<i); l=nxt[l][i]; } } printf("%d\n",ans); } return 0; }
11.25
闲话
- 早起后发现下雨了,遂直接来机房了。 \(huge\) 调侃“还是早上起床不跑操爽”。
- 上午又开始想吐,但催吐无果。要是真到 \(NOIP\) 的时候还这样,我真不能保证我可以全程坚持下来。
- 详见 2024 NOIP 游记 11.25 。
- 下午放 \(huge\) 的每日一歌《七里香》,由 @DanhengYinyue 和 @hh弟中弟 “激情”演唱。
做题纪要
CF785E Anton and Permutation
-
转化查询为区间内 \(>\) 某个数的数的个数。
-
树状数组套主席树。
点击查看代码
int a[200010],n; struct PDS_SMT { int root[200010],rt_sum; struct SegmentTree { int ls,rs,sum; }tree[200010<<7]; #define lson(rt) (tree[rt].ls) #define rson(rt) (tree[rt].rs) int build_rt() { rt_sum++; lson(rt_sum)=rson(rt_sum)=tree[rt_sum].sum=0; return rt_sum; } void update(int &rt,int l,int r,int pos,int val) { rt=(rt==0)?build_rt():rt; tree[rt].sum+=val; if(l==r) { return; } int mid=(l+r)/2; if(pos<=mid) { update(lson(rt),l,mid,pos,val); } else { update(rson(rt),mid+1,r,pos,val); } } int query(int rt,int l,int r,int x,int y) { if(x<=l&&r<=y) { return tree[rt].sum; } int mid=(l+r)/2,ans=0; if(x<=mid) { ans+=query(lson(rt),l,mid,x,y); } if(y>mid) { ans+=query(rson(rt),mid+1,r,x,y); } return ans; } }T; struct BIT { int lowbit(int x) { return (x&(-x)); } void update(int x,int pos,int val) { for(int i=x;i<=n;i+=lowbit(i)) { T.update(T.root[i],1,n,pos,val); } } ll getsum(int x,int l,int r) { ll ans=0; for(int i=x;i>=1;i-=lowbit(i)) { ans+=T.query(T.root[i],1,n,l,r); } return ans; } ll query(int l,int r,int x,int y) { return (x>y||l>r)?0:getsum(r,x,y)-getsum(l-1,x,y); } }B; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int m,l,r,i; ll ans=0; cin>>n>>m; for(i=1;i<=n;i++) { a[i]=i; B.update(i,a[i],1); } for(i=1;i<=m;i++) { cin>>l>>r; if(l>r) { swap(l,r); } ans-=B.query(l+1,r-1,1,a[l]-1); ans+=B.query(l+1,r-1,a[l]+1,n); ans-=B.query(l+1,r-1,a[r]+1,n); ans+=B.query(l+1,r-1,1,a[r]-1); ans+=(l!=r)*((a[l]<a[r])?1:-1); B.update(l,a[l],-1); B.update(r,a[r],-1); swap(a[l],a[r]); B.update(l,a[l],1); B.update(r,a[r],1); cout<<ans<<endl; } return 0; }
luogu P9340 [JOISC 2023 Day3] Tourism
luogu P11325 【MX-S7-T3】「SMOI-R2」Monotonic Queue
- 详见 【MX-S7】梦熊 NOIP 2024 模拟赛 3 & SMOI Round 2(同步赛) T3 luogu P11325 【MX-S7-T3】「SMOI-R2」Monotonic Queue 。
luogu P11230 [CSP-J 2024] 接龙
-
观察到 \(r \le 100\) 。设 \(f_{i,j}\) 表示进行了 \(i\) 轮接龙后末尾字符为 \(j\) 时的最后一个人(若有多个人符合题意则为 \(0\) )。
点击查看代码
int f[110][200010]; vector<int>s[100010]; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int t,n,m,q,len,x,r,c,i,j,k,h; scanf("%d",&t); for(h=1;h<=t;h++) { scanf("%d%d%d",&n,&m,&q); for(i=1;i<=n;i++) { scanf("%d",&len); s[i].clear(); for(j=1;j<=len;j++) { scanf("%d",&x); s[i].push_back(x); } } memset(f,-1,sizeof(f)); f[0][1]=0; for(i=1;i<=100;i++) { for(j=1;j<=n;j++) { len=0; for(k=0;k<s[j].size();k++) { len-=(len>=1); if(len>=1) { if(f[i][s[j][k]]==-1) { f[i][s[j][k]]=j; } else { if(f[i][s[j][k]]!=j) { f[i][s[j][k]]=0; } } } if(f[i-1][s[j][k]]!=-1&&f[i-1][s[j][k]]!=j) { len=m; } } } } for(i=1;i<=q;i++) { scanf("%d%d",&r,&c); printf("%d\n",(f[r][c]!=-1)); } } return 0; }
2025--炼石计划-- 11 月 23 日 --NOIP 模拟赛 #23 T4 D. 莫队
luogu P2886 [USACO07NOV] Cow Relays G
-
设 \(dis_{i,j,t}\) 表示从 \(i\) 到 \(j\) 经过 \(t\) 条边的最短路,则可以通过 \(dis_{i,j,t_{1}+t_{2}}=\min(dis_{i,j,t_{1}+t_{2}},dis_{i,k,t_{1}}+dis_{k,j,t_{2}})\) 进行更新。
-
广义矩阵乘法加速即可。
点击查看代码
int id[1000010],n; struct Matrix { int ma[210][210]; Matrix() { memset(ma,0x3f,sizeof(ma)); } Matrix operator * (const Matrix &another) { Matrix ans; for(ll k=1;k<=n;k++) { for(ll i=1;i<=n;i++) { for(ll j=1;j<=n;j++) { ans.ma[i][j]=min(ans.ma[i][j],ma[i][k]+another.ma[k][j]); } } } return ans; } }f; Matrix qpow(Matrix a,ll b) { Matrix ans; ans=a; b--; while(b) { if(b&1) { ans=ans*a; } b>>=1; a=a*a; } return ans; } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int b,m,s,e,u,v,w,i; cin>>b>>m>>s>>e; for(i=1;i<=m;i++) { cin>>w>>u>>v; if(id[u]==0) { n++; id[u]=n; } if(id[v]==0) { n++; id[v]=n; } f.ma[id[u]][id[v]]=f.ma[id[v]][id[u]]=min(f.ma[id[u]][id[v]],w); } f=qpow(f,b); cout<<f.ma[id[s]][id[e]]<<endl; return 0; }
luogu P1503 鬼子进村
-
插入 \(0,n+1\) 哨兵后
set
维护被摧毁的房子即可。点击查看代码
set<int>s; set<int>::iterator pre,nxt; stack<int>st; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,x,i; char pd; cin>>n>>m; s.insert(0); s.insert(n+1); for(i=1;i<=m;i++) { cin>>pd; if(pd=='D') { cin>>x; st.push(x); s.insert(x); } if(pd=='R') { s.erase(st.top()); st.pop(); } if(pd=='Q') { cin>>x; if(s.find(x)==s.end()) { nxt=s.upper_bound(x); pre=prev(nxt); cout<<*nxt-*pre-1<<endl; } else { cout<<0<<endl; } } } return 0; }
11.26
闲话
- 吃完早饭回来后 \(miaomiao\) 给所有人电脑重启了,尝试上传虚拟机相关文件,但因为有人为避免关机把网线拔了导致未全部上传成功, \(miaomiao\) 说以后要是再让他发现有私自拔网线的他就只给我们用局域网了(只能上内网)。然后又用屏幕广播了打乱后的位置。
- 上午 \(7:40 \sim 12:15\) 打昨天 accoders NOI 的模拟赛。途中 \(miaomiao\) 尝试通过传输文件把下发文件给我们,但传输的文件有密码,但他并不知道密码是什么,遂又让我们直接去 \(OJ\) 下载。
- 下午放 \(huge\) 的每日一歌《七里香》,宣誓,上体育课,讲题。不知道突然为啥把全网开了,且一直没关。去上体育课的路上看见高一的来上信息课了。
- 详见 2024 NOIP 游记 11.26 | 2024 CSP-S 游记 11.26。
- 临吃晚饭时 \(huge\) 说去吃饭前都保存好文件并关机, \(miaomiao\) 要给我们传 虚拟机以至明天能直接使用。但吃完晚饭回来 \(miaomiao\) 貌似没整好,导致 \(Windows\) 直接死了,只能用 \(Linux\) 。
- 晚上下课时看见 \(miaomiao\) 又开始重新传虚拟机文件了。
做题纪要
P585. 随机游走
P586. 分发奖励
P587. 卡路里
11.27
闲话
- 侯操时又被通知加圈了。早读到机房后发现虚拟机基本配好了,但登录不了博客园, \(field\) 说他没有什么好的解决方法。
- 上午 \(7:30 \sim 12:00\) 打学校 \(OJ\) 的模拟赛。
- 下午起床时小腿抽筋了但无大碍;放 @hh弟中弟 的每日一歌《爱在西元前》,然后讲题。
- 详见 2024 NOIP 游记 。
- 晚上 \(field\) 和后面新来的几个交谈时说这周 \(HS\) 安排了放假,我们一回到学校就要补 \(whk\) ,且分班前要参加考试。
做题纪要
HZTG5781. flandre
HZTG5782. meirin
HZTG5783. sakuya
HZTG5784. 红楼 ~ Eastern Dream
luogu P8724 [蓝桥杯 2020 省 AB3] 限高杆
-
分层图板子。
点击查看代码
struct node { int nxt,to,w; }e[6000010]; int head[6000010],dis[6000010],vis[6000010],cnt=0; void add(int u,int v,int w) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt; } void dijsktra(int s) { memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); priority_queue<pair<int,int> >q; dis[s]=0; q.push(make_pair(-dis[s],s)); while(q.empty()==0) { int x=q.top().second; q.pop(); if(vis[x]==0) { vis[x]=1; for(int i=head[x];i!=0;i=e[i].nxt) { if(dis[e[i].to]>dis[x]+e[i].w) { dis[e[i].to]=dis[x]+e[i].w; q.push(make_pair(-dis[e[i].to],e[i].to)); } } } } } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,u,v,w,d,i; cin>>n>>m; for(i=1;i<=m;i++) { cin>>u>>v>>w>>d; if(d==0) { add(u,v,w); add(v,u,w); add(u+n,v+n,w); add(v+n,u+n,w); add(u+2*n,v+2*n,w); add(v+2*n,u+2*n,w); } else { add(u,v+n,w); add(v,u+n,w); add(u+n,v+2*n,w); add(v+n,u+2*n,w); } } dijsktra(1); cout<<dis[n]-min({dis[n],dis[2*n],dis[3*n]}); return 0; }
11.28
闲话
- 早上起床后发现腿还在抽筋,应付着跑了个早操。
- 上午 \(7:30 \sim 12:00\) 打 accoders NOI 的模拟赛。
- 高一来五楼上信息课时都在念叨墙上贴着的“距离 NOIP2024 仅有 \(02\) 天” 。楼道有点吵, \(field\) 还专门出去维持了下纪律。
- 下午放 @5k_sync_closer 的每日一歌《蜂鸟》,然后听多校讲题。因为上一节体育课直接硬钢体育老师了,所以这次没有统一集合环节,改成了各老师直接到对应场地自己集合。在和 @lxyt_415x 打乒乓球时,乒乓球老师过来了,让我们过去集合,我说我是高一的,她问我们怎么高一的也来上体育课了,接着我们向她解释了 \(miaomiao\) 让我们来
上体育课活动活动玩,她得知后又说高二的过去集合,高一的接着玩,还问我们哪个班的,并得知了她也教我们班体育课,且知道我们班两个多月了一节体育课也没上过。 - 详见 2024 NOIP 游记 11.28 。
做题纪要
P593. 【模板】分治FFT
P594. 【模板】最近公共祖先
P595. 【模板】普通平衡树
luogu P9432 [NAPC-#1] rStage5 - Hard Conveyors
-
换根预处理完树剖加 \(ST\) 表维护即可。
点击查看代码
struct node { int nxt,to,w; }e[200010]; int head[200010],fa[200010],siz[200010],dep[200010],dis[200010],son[200010],top[200010],dfn[200010],pos[200010],f[200010],g[200010],tot=0,cnt=0; void add(int u,int v,int w) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt; } void dfs1(int x,int father) { siz[x]=1; fa[x]=father; dep[x]=dep[father]+1; for(int i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=father) { dis[e[i].to]=dis[x]+e[i].w; dfs1(e[i].to,x); f[x]=min(f[x],f[e[i].to]+2*e[i].w); siz[x]+=siz[e[i].to]; son[x]=(siz[e[i].to]>siz[son[x]])?e[i].to:son[x]; } } } void reroot(int x) { for(int i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=fa[x]) { g[e[i].to]=min(f[e[i].to],g[x]+2*e[i].w); reroot(e[i].to); } } } void dfs2(int x,int id) { top[x]=id; tot++; dfn[x]=tot; pos[tot]=x; if(son[x]!=0) { dfs2(son[x],id); for(int i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=fa[x]&&e[i].to!=son[x]) { dfs2(e[i].to,e[i].to); } } } } struct ST { int fminn[200010][25]; void init(int n) { memset(fminn,0x3f,sizeof(fminn)); for(int i=1;i<=n;i++) { fminn[i][0]=g[pos[i]]; } for(int j=1;j<=log2(n);j++) { for(int i=1;i+(1<<j)-1<=n;i++) { fminn[i][j]=min(fminn[i][j-1],fminn[i+(1<<(j-1))][j-1]); } } } int query(int l,int r) { int t=log2(r-l+1); return min(fminn[l][t],fminn[r-(1<<t)+1][t]); } }S; int lca(int u,int v) { int minn=0x7f7f7f7f,ans=dis[u]+dis[v]; while(top[u]!=top[v]) { if(dep[top[u]]>dep[top[v]]) { minn=min(minn,S.query(dfn[top[u]],dfn[u])); u=fa[top[u]]; } else { minn=min(minn,S.query(dfn[top[v]],dfn[v])); v=fa[top[v]]; } } if(dep[u]<dep[v]) { minn=min(minn,S.query(dfn[u],dfn[v])); return ans-2*dis[u]+minn; } else { minn=min(minn,S.query(dfn[v],dfn[u])); return ans-2*dis[v]+minn; } } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,k,u,v,w,i; cin>>n>>m>>k; for(i=1;i<=n-1;i++) { cin>>u>>v>>w; add(u,v,w); add(v,u,w); } memset(f,0x3f,sizeof(f)); for(i=1;i<=k;i++) { cin>>u; f[u]=0; } dfs1(1,0); g[1]=f[1]; reroot(1); dfs2(1,1); S.init(n); for(i=1;i<=m;i++) { cin>>u>>v; cout<<lca(u,v)<<endl; } return 0; }
luogu P9433 [NAPC-#1] Stage5 - Conveyors
-
钦定某个关键点为根节点,倍增跳到在关键点构成上的虚树上直接做就行了。
点击查看代码
struct node { int nxt,to,w; }e[200010]; int head[200010],fa[200010][25],siz[200010],dep[200010],dis[200010],vis[200010],cnt=0,ans=0; void add(int u,int v,int w) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt; } void dfs1(int x,int father) { siz[x]=vis[x]; fa[x][0]=father; dep[x]=dep[father]+1; for(int i=1;i<=20;i++) { fa[x][i]=fa[fa[x][i-1]][i-1]; } for(int i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=father) { dis[e[i].to]=dis[x]+e[i].w; dfs1(e[i].to,x); siz[x]+=siz[e[i].to]; } } } void dfs2(int x) { if(siz[x]==0) { return; } vis[x]=1; for(int i=head[x];i!=0;i=e[i].nxt) { if(e[i].to!=fa[x][0]) { dfs2(e[i].to); ans+=2*vis[e[i].to]*e[i].w; } } } int jump(int x) { if(vis[x]==1) { return x; } for(int i=20;i>=0;i--) { if(fa[x][i]!=0&&vis[fa[x][i]]==0) { x=fa[x][i]; } } return fa[x][0]; } int lca(int x,int y) { if(dep[x]>dep[y]) { swap(x,y); } for(int i=20;i>=0;i--) { if(dep[x]+(1<<i)<=dep[y]) { y=fa[y][i]; } } if(x==y) { return x; } else { for(int i=20;i>=0;i--) { if(fa[x][i]!=fa[y][i]) { x=fa[x][i]; y=fa[y][i]; } } return fa[x][0]; } } int get_dis(int x,int y) { return dis[x]+dis[y]-2*dis[lca(x,y)]; } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif int n,m,k,u,v,w,i; cin>>n>>m>>k; for(i=1;i<=n-1;i++) { cin>>u>>v>>w; add(u,v,w); add(v,u,w); } for(i=1;i<=k;i++) { cin>>u; vis[u]=1; } dfs1(u,0); dfs2(u); for(i=1;i<=m;i++) { cin>>u>>v; cout<<ans-get_dis(jump(u),jump(v))+get_dis(u,jump(u))+get_dis(v,jump(v))<<endl; } return 0; }
11.29
闲话
- 详见 2024 NOIP 游记 11.29 。
做题纪要
11.30
闲话
- 详见 2024 NOIP 游记 11.30 。
做题纪要
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18559340,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。