高一上十一月下旬日记

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

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

闲话

做题纪要

11.30

闲话

做题纪要

posted @ 2024-11-20 21:22  hzoi_Shadow  阅读(116)  评论(7编辑  收藏  举报
扩大
缩小