@AkamemakA
2022-09-11T06:27:14.000000Z
字数 2241
阅读 157
模板 知识点 算法
#define lson (p<<1)#define rson (p<<1|1)
inline void build(int p,int l,int r){t[p].l=l,t[p].r=r; //每一部分的左右端点if(l==r){ //叶子节点t[p].sum=a[l];//创建所要维护的内容return ;}int mid=l+r>>1;build(lson,l,mid); //建左子树build(rson,mid+1,r); //建右子树pushup(p); //得到所维护内容}
区间+
inline void change(int p,int l,int r,ll k){if(t[p].l>=l&&t[p].r<=r){ //当前区间完全包含于所求区间t[p].sum+=k*(t[p].r-t[p].l+1); //直接加上t[p].lazy+=k; //更新懒标记return ;}pushdown(p); //标记下传int mid=l+r>>1;if(t[lson].r>=l) change(lson,l,r,k); //若左子树与所求区间有交集,则递归左子树求值if(t[rson].l<=r) change(rson,l,r,k); //右子树同理pushup(p) //更新所维护内容}
inline int query(int p,int l,int r){if(t[p].l>=l&&t[p].r<=r)return t[p].sum; ///当前区间完全包含于所求区间,直接返回当前区间的值pushdown(p); //标记下传int res=0;if(t[lson].r>=l) res+=query(lson,l,r);if(t[rson].l<=r) res+=query(rson,l,r);return res;}
inline void updata(int x,int y){for(int i=x;i<=n;i+=lowbit(i))c[i]+=y;}
inline int query(int x){int res=0;for(int i=x;i;i-=lowbit(i))res+=c[i];return res;}
inline void ins(int x){for(int i=62;i>=0;i--){if(!((x>>i)&1)) continue;if(!p[i]){p[i]=x;break;}x^=p[i];}}
int ans=0;for(int i=62;i>=0;i--)if((ans^p[i])>ans)ans^=p[i];
inline void tarjan(int u){dfn[u]=low[u]=++cnt;sta[++tp]=u;st[u]=1;for(int i=he[u];i;i=ne[i]){int v=go[i];if(!dfn[v]){tarjan(v);low[u]=min(low[u],low[v]);}else if(st[v]) low[u]=min(low[u],dfn[v]);}if(dfn[u]==low[u]){scc++;int t;do{t=sta[tp--];id[t]=scc;st[t]=0;vul[scc]+=val[t];}while(t!=u);}}
int j=0;for(int i=2;i<=lt;i++){while(j&&t[i]!=t[j+1]) j=ne[j];if(t[i]==t[j+1]) j++;ne[i]=j;}
j=0;for(int i=1;i<=ls;i++){while(j&&s[i]!=t[j+1]) j=ne[j];if(s[i]==t[j+1]) j++;if(j==lt) cout<<i-lt+1<<endl;}
inline void Gauss(){for(int r=1,c=1;c<=n;r++,c++){int mai=r;for(int i=r+1;i<=n;i++)if(fabs(a[i][c])>fabs(a[mai][c]))mai=i;for(int i=c;i<=n+1;i++)swap(a[mai][i],a[r][i]);if(a[r][c]==0){puts("No Solution");exit(0);}//无解或有自由元for(int i=n+1;i>=c;i--)a[r][i]/=a[r][c];for(int i=r+1;i<=n;i++)for(int j=n+1;j>=c;j--)a[i][j]-=a[r][j]*a[i][c];}for(int i=n;i>1;i--)for(int j=i-1;j>=1;j--){a[j][n+1]-=a[i][n+1]*a[j][i];a[j][i]=0;}}
int head=1,tail=1;for(int i=1;i<=n;i++){while(num[head]<i-k+1&&head<=tail) head++;while(a[num[tail]]>=a[i]&&head<=tail) tail--;num[++tail]=i;if(i>=k)printf("%d ",a[num[head]]);}//求所有长度为k的区间中的最小值