前言
点击查看代码
《蜂鸟》传说中人类在远早住于黑暗的地下之遥派出了娇小的蜂鸟找到通往光明的隧道飞过了一座一座岛好想有一个地方落脚把一个一个梦制造会不会有人能够听到寻找太阳的梦 自不量力说自己也变成太阳的念头有时候寂寞 几乎扛不动咽在喉咙里无人诉说我们到底在追求些什么为何一直不断往前冲捏出血的双手忘了也能够 稍微退后我们总是以为能够自由回过头那世界却依旧哎 爱它来的时候紧握的拳头 别忘了捉那个梦传说中愤怒的恶魔曾让这地球四处着火一只蜂鸟收集云朵火在雨中变成了彩虹我们在孤单中探索危险世界美丽的渴求就算这力量再微弱也想牵你手一起挣脱寻找太阳的梦 自不量力说自己也变成太阳的念头有时候寂寞 几乎扛不动咽在喉咙里无人诉说我们到底在追求些什么为何一直不断往前冲捏出血的双手忘了也能够 稍微退后我们总是以为能够自由回过头那世界却依旧哎 爱它来的时候紧握的拳头 别忘了捉那个梦 来到我的身旁 收拢世界的光我想要成为自己 也成为你的光我们到底在追求些什么为何不断往前冲捏出血的双手忘了也能够 稍微退后我们到底在追求些什么为何一直不断往前冲捏出血的双手忘了也能够 稍微退后我们总是以为能够自由回过头那世界却依旧哎 爱它来的时候紧握的拳头 别忘了捉那个梦我那个梦我那个梦寂寞中拍打的翅膀终于找到你一起飞翔渺小却带来了神话你看这世界开满了花
今天中午放的每日一歌,虽然放了好多次了,今天还是放上来了,算是唱出 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,不改。