【考试总结】2022-03-04
前缀
使用 求出来每个后缀 和全串的 长度,那么对应 的前缀又出现了一次
Code Display
const int N=1e7+10;
int z[N],ans,ton[N],n;
char s[N];
signed main(){
freopen("pre.in","r",stdin); freopen("pre.out","w",stdout);
scanf("%s",s+1); n=strlen(s+1);
z[1]=n;
for(int i=2,l=0,r=0;i<=n;++i){
if(i<=r) z[i]=min(z[i-l+1],r-i+1);
while(i+z[i]<=n&&s[z[i]+1]==s[i+z[i]]) ++z[i];
if(i+z[i]-1>r) l=i,r=i+z[i]-1;
}
for(int i=1;i<=n;++i) ton[z[i]]++;
Down(i,n,1) ton[i]+=ton[i+1],ans+=ton[i];
print(ans);
return 0;
}
斐波那契
使用线段树维护矩阵即可,每次区间加定值时可以乘一个对应次数的转移矩阵
那么区间求 的和就对应区间矩阵的和
Code Display
const int N=1e5+10;
struct mat{
int a[2][2]; mat(){a[0][0]=a[0][1]=a[1][0]=a[1][1]=0;}
mat(int b,int c,int d,int e){a[0][0]=b; a[0][1]=c; a[1][0]=d; a[1][1]=e;}
bool operator ==(const mat &e)const{
rep(i,0,1) rep(j,0,1) if(a[i][j]!=e.a[i][j]) return 0;
return 1;
}
}pw[40],val[N<<2],tag[N<<2];
inline mat Mul(mat &a,mat &b){
mat c;
c.a[0][0]=add(mul(a.a[0][0],b.a[0][0]),mul(a.a[0][1],b.a[1][0]));
c.a[0][1]=add(mul(a.a[0][0],b.a[0][1]),mul(a.a[0][1],b.a[1][1]));
c.a[1][0]=add(mul(a.a[1][0],b.a[0][0]),mul(a.a[1][1],b.a[1][0]));
c.a[1][1]=add(mul(a.a[1][0],b.a[0][1]),mul(a.a[1][1],b.a[1][1]));
return c;
}
inline mat Plus(mat a,mat b){
mat c;
rep(i,0,1) rep(j,0,1) c.a[i][j]=add(a.a[i][j],b.a[i][j]);
return c;
}
inline mat Minus(mat a,mat b){
mat c;
rep(i,0,1) rep(j,0,1) c.a[i][j]=del(a.a[i][j],b.a[i][j]);
return c;
}
inline mat Get(int n){
mat res=mat(1,0,0,1);
for(int i=1;i<=32;++i) if(n>>(i-1)&1) res=Mul(res,pw[i]);
return res;
}
int a[N],n,Q;
#define ls p<<1
#define rs p<<1|1
#define lson ls,l,mid
#define rson rs,mid+1,r
inline void push_tag(int p,mat now){
val[p]=Mul(val[p],now);
tag[p]=Mul(tag[p],now);
return ;
}
inline void push_down(int p){
if(tag[p]==pw[0]) return ;
push_tag(ls,tag[p]); push_tag(rs,tag[p]);
tag[p]=pw[0];
return ;
}
inline void push_up(int p){val[p]=Plus(val[ls],val[rs]);}
inline void build(int p,int l,int r){
tag[p]=pw[0]; if(l==r) return val[p]=Get(a[l]-1),void();
int mid=(l+r)>>1; build(lson); build(rson);
return push_up(p);
}
inline void upd(int st,int ed,mat d,int p=1,int l=1,int r=n){
if(st<=l&&r<=ed) return push_tag(p,d);
int mid=(l+r)>>1; push_down(p);
if(st<=mid) upd(st,ed,d,lson); if(ed>mid) upd(st,ed,d,rson);
return push_up(p);
}
inline mat query(int st,int ed,int p=1,int l=1,int r=n){
if(st<=l&&r<=ed) return val[p];
int mid=(l+r)>>1; push_down(p);
if(ed<=mid) return query(st,ed,lson);
if(st>mid) return query(st,ed,rson);
return Plus(query(st,ed,lson),query(st,ed,rson));
}
#undef ls
#undef rs
#undef lson
#undef rson
signed main(){
freopen("fib.in","r",stdin); freopen("fib.out","w",stdout);
n=read(); Q=read(); rep(i,1,n) a[i]=read();
pw[0]=mat(1,0,0,1); pw[1]=mat(0,1,1,1);
for(int i=2;i<=35;++i) pw[i]=Mul(pw[i-1],pw[i-1]);
build(1,1,n);
while(Q--){
if(read()-1){
int l=read(),r=read();
mat ans=query(l,r);
print(add(ans.a[0][0],ans.a[1][0]));
}else{
int l=read(),r=read();
upd(l,r,Get(read()));
}
}
return 0;
}
过路费
考虑枚举最短路上作为第 大的边的权值 ,全图的边都减掉 跑 将得数加 即可
这样做正确的原因是如果少于 条边不小于 那么必然附加的 是冗余的,而如果超过 条边大于 那么将 取更大的值时必然有更好的结果
Code Display
const int N=2010;
int S,T,n,m,k,b[N];
vector<pair<int,int> > G[N];
int dis[N];
int u[N],v[N],w[N];
inline void rebuild(int d){
for(int i=1;i<=n;++i) G[i].clear();
for(int i=1;i<=m;++i){
G[u[i]].push_back({v[i],max(0ll,w[i]-d)});
} return ;
}
bool vis[N];
signed main(){
freopen("fee.in","r",stdin); freopen("fee.out","w",stdout);
n=read(); m=read(); k=read(); S=read(); T=read();
int cnt_val=0;
for(int i=1;i<=m;++i){
u[i]=read(); v[i]=read(); w[i]=read();
b[++cnt_val]=w[i];
}
int ans=0x3f3f3f3f3f3f3f3f;
sort(b+1,b+cnt_val+1); cnt_val=unique(b+1,b+cnt_val+1)-b-1;
for(int p=1;p<=cnt_val;++p){
rebuild(b[p]);
memset(dis,0x3f,sizeof(dis));
priority_queue<pair<int,int> >q; q.push({0,S}); dis[S]=0;
rep(i,1,n) vis[i]=0;
while(q.size()){
int fr=q.top().sec; q.pop(); if(vis[fr]) continue; vis[fr]=1;
for(auto e:G[fr]){
if(dis[e.fir]>dis[fr]+e.sec){
dis[e.fir]=dis[fr]+e.sec;
q.push(make_pair(-dis[e.fir],e.fir));
}
}
}
ckmin(ans,dis[T]+k*b[p]);
} print(ans);
return 0;
}
这套题目相信很多同学联赛做和现在做得分并不会有什么不同
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律