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