NOIP2024 前集训:多校A层冲刺NOIP2024模拟赛 27 终结篇

前言

music
《蜂鸟》

传说中人类在远早

住于黑暗的地下之遥

派出了娇小的蜂鸟

找到通往光明的隧道

飞过了一座一座岛

好想有一个地方落脚

把一个一个梦制造

会不会有人能够听到

寻找太阳的梦 自不量力说

自己也变成太阳的念头

有时候寂寞 几乎扛不动

咽在喉咙里无人诉说

我们到底在追求些什么

为何一直不断往前冲

捏出血的双手

忘了也能够 稍微退后

我们总是以为能够自由

回过头那世界却依旧

哎 爱它来的时候

紧握的拳头 别忘了捉那个梦

传说中愤怒的恶魔

曾让这地球四处着火

一只蜂鸟收集云朵

火在雨中变成了彩虹

我们在孤单中探索

危险世界美丽的渴求

就算这力量再微弱

也想牵你手一起挣脱

寻找太阳的梦 自不量力说

自己也变成太阳的念头

有时候寂寞 几乎扛不动

咽在喉咙里无人诉说

我们到底在追求些什么

为何一直不断往前冲

捏出血的双手

忘了也能够 稍微退后

我们总是以为能够自由

回过头那世界却依旧

哎 爱它来的时候

紧握的拳头 别忘了捉

那个梦 来到我的身旁 收拢世界的光

我想要成为自己 也成为你的光

我们到底在追求些什么

为何不断往前冲

捏出血的双手

忘了也能够 稍微退后

我们到底在追求些什么

为何一直不断往前冲

捏出血的双手

忘了也能够 稍微退后

我们总是以为能够自由

回过头那世界却依旧

哎 爱它来的时候

紧握的拳头 别忘了捉那个梦

我那个梦

我那个梦

寂寞中拍打的翅膀

终于找到你一起飞翔

渺小却带来了神话

你看这世界开满了花

今天中午放的每日一歌,虽然放了好多次了,今天还是放上来了,算是唱出 OIer 们的心声了。

终结赛,没挂分是好的,因为本来也没多少分可以挂,暴力没打满,确切地说是没打完,T2 构造直接跳了,T3 一直想怎么优化 DP 没想过去推结论。

考完后高二放假高一不放,因为他们下周学考所以我们下周放的时间长,不过好像脑瘫老班不想让我们放,到时候再说吧反正我肯定是不接受的,回来就要补文化课了,可能到时候就要和好多人说再见了,所以《一期一会》等游记或补文化课的时候推。

NOIP rp++。

自觉忽略题目名称。

T1 【模板】分治FFT

发现每一种情况的结果都是一样的,所以直接乘上方案数即可,方案数为 \(\prod\limits_{i=2}^n\text{C}_i^2\)

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=1e5+10,P=998244353;
template<typename Tp> inline void read(Tp&x)
{
	x=0;register bool z=true;
	register char a=getchar_unlocked();
	for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
	for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
	x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,a[N]; ll ans,sum;
inline ll qpow(ll a,int b)
{ll res=1; for(;b;(a*=a)%=P,b>>=1) (b&1)&&((res*=a)%=P); return res;}
inline int mod(int x,int y) {return (x+=y)>=P?x-P:x;}
signed main()
{
    freopen("fft.in","r",stdin),freopen("fft.out","w",stdout);
	read(n); for(int i=1;i<=n;i++)
        read(a[i]),ans=mod(ans,a[i]*sum%P),sum=mod(sum,a[i]);
    sum=1; for(int i=2;i<=n;i++)
        (ans*=sum)%=P,(sum*=(i+1)*qpow(i-1,P-2)%P)%=P;
    return write(ans),puts(""),0;
}

T2 【模板】最近公共祖先

好像这种贪心加构造的题从来就没做出来过?

考虑跑出来一棵生成树,那么根据子节点有无非树边进行贪心,显然先选深度最大且有非树边的,没有非树边了之后就要和父亲连了,之后删掉这个点即可。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
using namespace std;
const int N=3e5+10;
template<typename Tp> inline void read(Tp&x)
{
	x=0;register bool z=true;
	register char a=getchar_unlocked();
	for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
	for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
	x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m,tot=1,head[N],nxt[N<<1],to[N<<1]; bool vis1[N],vis2[N<<1];
struct aa {int x,y,z;}; vector<aa>ans; vector<int>e[N];
inline void add(int x,int y) {nxt[++tot]=head[x],to[tot]=y,head[x]=tot;}
inline bool dfs(int x,int t)
{
	if(vis1[x]) return 1; vis1[x]=1;
	for(int i=head[x],y;y=to[i];i=nxt[i]) if(y!=t&&!vis2[i])
	{vis2[i]=vis2[i^1]=1; if(dfs(y,x)) e[x].push_back(y);}
	for(int i=1;i<e[x].size();i+=2) ans.push_back({e[x][i],x,e[x][i-1]});
	if(!(e[x].size()&1)) return 1;
	if(t) ans.push_back({e[x].back(),x,t}); return 0;
}
signed main()
{
	freopen("lca.in","r",stdin),freopen("lca.out","w",stdout);
	read(n,m); for(int i=1,x,y;i<=m;i++) read(x,y),add(x,y),add(y,x);
	for(int i=1;i<=n;i++) if(!vis1[i]) dfs(i,0);
	write(ans.size()),puts(""); for(auto x:ans) write(x.x,x.y,x.z),puts("");
}

T3 【模板】普通平衡树

这是真结论题了,虽然结论很好证,但赛时光想着优化 DP 了,所以有时候 DP 做不了的要想想别的。

因为 \(x\) 互不相同啊,手玩一下发现答案就是 \(\sum\limits_{i=2}^{len-1}[a_{i-1}<a_i\wedge a_i>a_{i+1}]+[a_{i-1}>a_i\wedge a_i<a_{i+1}]\),这个东西可以线段树直接维护,具体的,分别维护两个左右端点,全是单点查所以没有 pushup 只有 pushdown,考虑 pushdown 下去的东西的一定在接在之前的后面,所以直接转移即可,特判 \(len<2\) 的情况。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define sort stable_sort
#define mid (l+r>>1)
#define ls (mid<<1)
#define rs (mid<<1|1)
using namespace std;
const int N=3e5+10;
template<typename Tp> inline void read(Tp&x)
{
	x=0;register bool z=true;
	register char a=getchar_unlocked();
	for(;!isdigit(a);a=getchar_unlocked()) if(a=='-') z=0;
	for(;isdigit(a);a=getchar_unlocked()) x=(x<<1)+(x<<3)+(a^48);
	x=(z?x:~x+1);
}
template<typename T,typename ...Tp> inline void read(T &x,Tp &...y){read(x);read(y...);}
template<typename Tp> inline void wt(Tp x){if(x>9)wt(x/10);putchar_unlocked((x%10)+'0');}
template<typename Tp> inline void write(Tp x){if(x<0)putchar_unlocked('-'),x=~x+1;wt(x);}
template<typename T,typename ...Tp> inline void write(T x,Tp ...y){write(x);putchar_unlocked(' ');write(y...);}
int n,m;
inline bool check(int x,int y,int z) {return (x<y&&y>z)||(x>y&&y<z);}
struct aa
{
	int len,num,l1,l2,r1,r2;
	inline aa() {len=num=l1=l2=r1=r2=0;}
	inline aa(int x) {len=1,num=0,l1=l2=r1=r2=x;}
	inline void operator += (aa const &a)
	{
		if(!a.len) return ; if(!len) return *this=a,void();
		num+=(len>1&&check(r1,r2,a.l1)),num+=(a.len>1&&check(r2,a.l1,a.l2));
		len==1&&(l2=a.l1),r1=a.len==1?r2:a.r1,num+=a.num,len+=a.len,r2=a.r2;
	}
}t[N<<1];
inline void spread(int p,int l,int r) {t[ls]+=t[p],t[rs]+=t[p],t[p]=aa();}
inline void add(int p,int l,int r,int vl,int vr,int d)
{
	if(vl<=l&&vr>=r) return t[p]+=aa(d),void(); spread(p,l,r);
	if(vl<=mid) add(ls,l,mid,vl,vr,d); if(vr>mid) add(rs,mid+1,r,vl,vr,d);
}
inline int ask(int p,int l,int r,int x)
{
	if(l==r) return min(t[p].num+2,t[p].len); spread(p,l,r);
	return x<=mid?ask(ls,l,mid,x):ask(rs,mid+1,r,x);
}
signed main()
{
	freopen("odt.in","r",stdin),freopen("odt.out","w",stdout);
	for(read(n,m);m;m--)
	{
		int op,l,r,x; read(op);
		if(op&1) read(l,r,x),add(1,1,n,l,r,x);
		else read(x),write(ask(1,1,n,x)),puts("");
	}
}

T4 【模板】平面最近点对

2-sat,不改。

posted @ 2024-11-28 19:42  卡布叻_周深  阅读(88)  评论(7)    收藏  举报