关于洛谷刷题的一些整理(待整理更新)

ST表
P3865

#include
#include
#include
using namespace std;
int Max[100100][21],Log2[100100];
int readd(){
    int ret=0;
    char ch=getchar();
    while('0'<=ch&&'9'>=ch){
        ret*=10;
        ret+=(ch-'0');
        ch=getchar();
    }
    return ret;
}
int main()
{
    ios::sync_with_stdio(false);
    int n,q,sj;
    n=readd();q=readd();
    sj=int(log2(n));
    for(int i=1;i<=n;i++)
        Max[i][0]=readd();
    for(int i=1;i<=n;i++)
        Log2[i]=(int)log2(i);
    for(int i=1;i<=sj;i++){
        for(int j=1;j+(1<

线性求逆元
3805

#include
#include
#include
using namespace std;
char y[52000100],a[102000100];
int b[52000100];
int main(){
    int ans=0;
    scanf("%s",y);
    int olen=strlen(y),len;
    a[0]='#';a[1]='#';
    for(register int i=0;imaxr){
            maxr=i+b[i];
            mid=i;
        }
        ans=max(b[i],ans);
    }
    cout<

3811

#include
#include
using namespace std;
long long a[3000005];
int main()
{
    int n,p;
    cin>>n>>p;
    a[1]=1;
    if(n>=1)printf("1\n");
    for(register int i=2;i<=n;i++){
        a[i]=(-((p/i)*(a[p%i]))%p+p)%p;
        printf("%lld\n",a[i]);
    }
    return 0;
}

线段树
3372

#include
using namespace std;
#define ll long long
ll data[100005];
struct point{
    ll sum;
    ll lazy_tag;
} a[400005];
inline int ls(int x){return x<<1;}
inline int rs(int x){return x<<1|1;}
void build(int u,int l,int r){
    a[u].lazy_tag=0;
    if(l==r){
        a[u].sum=data[l];
        //cout<>1;
    build(ls(u),l,mid);
    build(rs(u),mid+1,r);
    a[u].sum=a[ls(u)].sum+a[rs(u)].sum;
    //cout<>1;
    a[ls(u)].sum+=(a[u].lazy_tag*(mid-l+1));
    a[rs(u)].sum+=(a[u].lazy_tag*(r-mid));
    a[u].lazy_tag=0;
}
void add(int u,int al,int ar,int l,int r,int k){//l&r 所在区间 
    if(al<=l&&ar>=r){
        a[u].lazy_tag+=k;
        a[u].sum+=(k*(r-l+1));
        return;
    }
    int mid=(l+r)>>1;
    if(mid>=al){
        push_down(u,l,r);
        add(ls(u),al,ar,l,mid,k);
    }
    if(midr||ar=r){
        //cout<>1;
    if(mid>=al){
        push_down(u,l,r);
        ret+=query(ls(u),al,ar,l,mid);
    }
    if(mid>n>>m;
    for(int i=1;i<=n;i++)
        cin>>data[i];
    build(1,1,n);
    for(int i=0;i>opt;
        if(opt==1){
            cin>>x>>y>>z;
            add(1,x,y,1,n,z);
        }
        else{
            cin>>x>>y;
            cout<

3373

#include
using namespace std;
#define ll long long
ll mod;
ll data[100005];
struct point{
    ll sum;
    ll addtag;
    ll multag;
} a[400005];
inline int ls(int x){return x<<1;}
inline int rs(int x){return (x<<1)+1;}
void up(int root){
    a[root].sum=(a[ls(root)].sum+a[rs(root)].sum)%mod;
}
void build(int root,int l,int r){
    a[root].addtag=0;
    a[root].multag=1;
    if(l==r)
        a[root].sum=data[l];
    else{
        int mid=(l+r)>>1;
        build(ls(root),l,mid);
        build(rs(root),mid+1,r);
        up(root);
    }
}
void pd(int root,int l,int r){
    int mid=(r+l)>>1;
    a[ls(root)].addtag*=a[root].multag;
    a[rs(root)].addtag*=a[root].multag;
    a[ls(root)].addtag+=a[root].addtag;
    a[rs(root)].addtag+=a[root].addtag;
    a[ls(root)].addtag%=mod;
    a[rs(root)].addtag%=mod;
    a[ls(root)].multag*=a[root].multag;
    a[rs(root)].multag*=a[root].multag;
    a[ls(root)].multag%=mod;
    a[rs(root)].multag%=mod;
    a[ls(root)].sum=a[ls(root)].sum*a[root].multag+a[root].addtag*(mid-l+1);
    a[rs(root)].sum=a[rs(root)].sum*a[root].multag+a[root].addtag*(r-mid);
    a[ls(root)].sum%=mod;
    a[rs(root)].sum%=mod;
    a[root].addtag=0;
    a[root].multag=1;
}
void add(int root,int l,int r,int ql,int qr,ll x){
    if(ql<=l&&qr>=r){
        a[root].addtag+=x;
        a[root].addtag%=mod;
        a[root].sum+=(r-l+1)*x;
        a[root].sum%=mod;
        return;
    }
    if(rqr)
        return;
    int mid=(l+r)>>1;
    pd(root,l,r);
    if(ql<=mid)add(ls(root),l,mid,ql,qr,x);
    if(qr>mid)add(rs(root),mid+1,r,ql,qr,x);
    up(root);
    return;
}
void mul(int root,int l,int r,int ql,int qr,ll x){
    if(ql<=l&&qr>=r){
        a[root].addtag*=x;
        a[root].addtag%=mod;
        a[root].multag*=x;
        a[root].multag%=mod;
        a[root].sum*=x;
        a[root].sum%=mod;
        return;
    }
    if(rqr)
        return;
    int mid=(l+r)>>1;
    pd(root,l,r);
    if(ql<=mid)mul(ls(root),l,mid,ql,qr,x);
    if(qr>mid)mul(rs(root),mid+1,r,ql,qr,x);
    up(root);
    return;
}
ll query(int root,int l,int r,int ql,int qr){
    if(ql<=l&&qr>=r)
        return a[root].sum%mod;
    if(rqr)
        return 0;
    int mid=(l+r)>>1;
    ll ret=0;
    pd(root,l,r);
    if(ql<=mid)ret+=query(ls(root),l,mid,ql,qr);
    if(qr>mid)ret+=query(rs(root),mid+1,r,ql,qr);
    return ret%mod;
}
int main()
{
    ios::sync_with_stdio(false);
    ll n,m,opt,x,y,z;
    cin>>n>>m>>mod;
    for(int i=1;i<=n;i++)cin>>data[i];
    build(1,1,n);
    for(int i=0;i>opt;
        if(opt==1){cin>>x>>y>>z;mul(1,1,n,x,y,z);}
        if(opt==2){cin>>x>>y>>z;add(1,1,n,x,y,z);}
        if(opt==3){cin>>x>>y;cout<

树链剖分

#include
#define ll long long
#define MAXN 100005
using namespace std;
ll p;
int cnt=0;
struct edge{
    int v,next;
} g[2*MAXN];
int head[MAXN],ov[MAXN],val[MAXN],depth[MAXN],fa[MAXN],siz[MAXN];
int son[MAXN],id[MAXN],top[MAXN];
using namespace std;
struct point{
    ll sum,tag;
} a[400005];
ll data[100005];
int ls(int root){return root<<1;}
int rs(int root){return (root<<1)+1;}
void up(int root){
    a[root].sum=a[ls(root)].sum+a[rs(root)].sum;
}
void build(int root,int l,int r){
    a[root].tag=0;
    if(l==r)a[root].sum=val[l];
    else{
        int mid=(l+r)>>1;
        build(ls(root),l,mid);
        build(rs(root),mid+1,r);
        up(root);
    }
}
void pd(int root,int l,int r){
    a[ls(root)].tag+=a[root].tag;
    a[ls(root)].tag%=p;
    a[rs(root)].tag+=a[root].tag;
    a[rs(root)].tag%=p;
    int mid=(l+r)>>1;
    a[ls(root)].sum+=a[root].tag*(mid-l+1);
    a[ls(root)].sum%=p;
    a[rs(root)].sum+=a[root].tag*(r-mid);
    a[rs(root)].sum%=p;
    a[root].tag=0;
}
void add(int root,int l,int r,int ql,int qr,ll k){
    if(ql>qr)swap(ql,qr);
    k%=p;
    if(ql<=l&&qr>=r){
        a[root].tag+=k;a[root].sum+=k*(r-l+1);
        return;
    }
    pd(root,l,r);
    int mid=(l+r)>>1;
    if(mid>=ql)add(ls(root),l,mid,ql,qr,k);
    if(qr>mid) add(rs(root),mid+1,r,ql,qr,k);
    up(root);
}
ll query(int root,int l,int r,int ql,int qr){
    if(ql>qr)swap(ql,qr);
    if(ql<=l&&qr>=r){
        return a[root].sum;
    }
    pd(root,l,r);
    int mid=(l+r)>>1;
    ll ret=0;
    if(mid>=ql)ret+=query(ls(root),l,mid,ql,qr);
    if(qr>mid) ret+=query(rs(root),mid+1,r,ql,qr);
    up(root);
    return ret%p;
}
void addedge(int u,int v){
    cnt++;
    g[cnt].v=v;
    g[cnt].next=head[u];
    head[u]=cnt;
}
void dfs1(int n,int f,int deep){
    depth[n]=deep;
    fa[n]=f;
    siz[n]=1;
    if(g[head[n]].v==f&&g[head[n]].next==0){
        son[n]=n;
        return;
    }
    int maxx=0;
    for(int i=head[n];i;i=g[i].next){
        if(g[i].v==f)continue;
        dfs1(g[i].v,n,deep+1);
        siz[n]+=siz[g[i].v];
        maxx=(siz[g[i].v]>siz[maxx])?g[i].v:maxx;
    }
    son[n]=maxx;
}
void dfs2(int n,int htop){
    cnt++;
    id[n]=cnt;
    val[cnt]=ov[n];
    top[n]=htop;
    if(g[head[n]].v==fa[n]&&g[head[n]].next==0)return;
    dfs2(son[n],htop);
    for(int i=head[n];i;i=g[i].next){
        if(g[i].v==fa[n]||g[i].v==son[n])continue;
        dfs2(g[i].v,g[i].v);
    }
}
ll querychain(int x,int y,int n){
    ll ans=0;
    while(top[x]!=top[y]){
        if(depth[top[x]]>n>>m>>r>>p;
    for(int i=1;i<=n;i++)cin>>ov[i];
    for(int i=1;i>u>>v;
        addedge(u,v);
        addedge(v,u);
    }
    dfs1(r,0,1);
    cnt=0;
    dfs2(r,r);
    build(1,1,n);
    int opt,x,y,z;
    for(int i=0;i>opt;
        if(opt==1){
            cin>>x>>y>>z;
            addchain(x,y,n,z);
        }
        else if(opt==2){
            cin>>x>>y;
            cout<>x>>y;
            addtree(x,n,y);
        }
        else if(opt==4){
            cin>>x;
            cout<

树状数组

#include
using namespace std;
typedef long long ll;
ll b[500005],c[500005];
int n;
inline ll lowbit(ll x){return x&(-x);}
void add(int t,ll x){
    while(t<=n){
        c[t]+=x;
        t+=lowbit(t);
    }
}
ll sum(ll t){
    ll ret=0;
    while(t>0){
        ret+=c[t];
        t-=lowbit(t);
    }
    return ret;
}
int main()
{
    ios::sync_with_stdio(false);
    int m,x,y,k,opt;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>c[i];
        b[i]=c[i]-c[i-1];
    }
    for(int i=1;i<=n;i++)c[i]=0;
    for(int i=1;i<=n;i++)add(i,b[i]);
    for(int i=0;i>opt;
        if(opt==1){
            cin>>x>>y>>k;
            add(x,k);
            add(y+1,-k);
        }
        else{
            cin>>x;
            cout<

3374

#include
#define ll long long
using namespace std;
ll n;
ll c[500005];
inline ll lowbit(ll x){
    return x&(-x);
}
void add(ll t,ll x){
    while(t<=n){
        c[t]+=x;
        t+=lowbit(t);
    }
}
ll sum(ll t){
    ll ret=0;
    while(t>0){
        ret+=c[t];
        t-=lowbit(t);
    }
    return ret;
}
ll search(ll l,ll r){
    return sum(r)-sum(l-1);
}
int main()
{
    ios::sync_with_stdio(false);
    ll m,x,y,z;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>x;
        add(i,x);
    }
    for(int i=0;i>x>>y>>z;
        if(x==1)
            add(y,z);
        else
            cout<

网络流

#include
#include
#include
#define MAXN 100005
using namespace std;
struct fhq_treap{
    int val[MAXN],son[MAXN][2],rnd[MAXN],siz[MAXN],rt,cnt;
    void pushup(int root){
        siz[root]=siz[son[root][0]]+siz[son[root][1]]+1;
    }
    int newnode(int v){
        val[++cnt]=v;
        rnd[cnt]=rand();
        siz[cnt]=1;
        return cnt;
    }
    int merge(int x,int y){
        if(!x||!y)return x+y;
        if(rnd[x]>n;
    for(int i=0;i>opt>>x;
        if(opt==1)T.insert(x);
        else if(opt==2)T.del(x);
        else if(opt==3)cout<

当前弧优化3376

#include
#include
#define inf 2147483647
using namespace std;
struct edge{
    int val,to,next;
}a[200005];
int head[10005],q[10005],floor[10005],cnt=0;
bool vis[10005];
void add_edge(int u,int v,int val){
    cnt++;a[cnt].to=v;a[cnt].val=val;a[cnt].next=head[u];head[u]=cnt;}
bool bfs(int s,int t){
    memset(vis,0,sizeof(vis));
    memset(floor,0,sizeof(floor));
    int h=0,ta=1,x;
    q[0]=s;floor[s]=1;vis[s]=1;
    while(h>n>>m>>s>>t;
    for(int i=0;i>u>>v>>w;
        add_edge(u,v,w);add_edge(v,u,0);}
    while(bfs(s,t)){
        ans+=dfs(s,inf,t);
    }
    cout<

最小生成树 :
p3366

#include
#include
#include
using namespace std;
int bcj[200005];
int fa(int x)
{
    if(bcj[x]==0)
        return x;
    else{
        int temp=fa(bcj[x]);
        bcj[x]=temp;
        return temp;
    }
}
void merge(int x,int y)
{
    int fx=fa(x),fy=fa(y);
    if(fx!=fy)
        bcj[fy]=fx;
}
bool find(int x,int y)
{
    int fx=fa(x),fy=fa(y);
    if(fx==fy)    
        return true;
    return false;
}
struct edge{
    int val;
    int l,r;
} a[200005];
bool operator<(edge a,edge b){
    return a.val>n>>m;
    for(int i=0;i>a[i].l>>a[i].r>>a[i].val;
    sort(a,a+m);
    int cnt=0,ans=0;
    for(int i=0;cnt

匈牙利算法
3386

#include
#include
using namespace std;
bool map[1005][1005],used[1005];
int book[1005];
int n;
bool dfs(int x){
    for(int i=1;i<=n;i++){
        if(map[x][i]==1&&used[i]==false){
            used[i]=1;
            if(book[i]==0||dfs(book[i])){
                book[i]=x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int m,e,x,y,ans=0;
    cin>>n>>m>>e;
    for(int i=0;i>x>>y;
        if(x<=n&&y<=m)
            map[x][y]=1;
    }
    for(int i=1;i<=m;i++){
        memset(used,0,sizeof(used));
        if(dfs(i))
            ans++;
    }
    cout<

fhqtreap实现的区间翻转
3391

#include
#include
#define MAXN 100005
using namespace std;
struct fhqtreap{
    int rnd[MAXN],siz[MAXN],ch[MAXN][2],val[MAXN],root,cnt;
    bool rev[MAXN];
    void pushup(int rt){
        siz[rt]=siz[ch[rt][0]]+siz[ch[rt][1]]+1;
    }
    int newnode(int v){
        siz[++cnt]=1;
        rnd[cnt]=rand();
        val[cnt]=v;
        return cnt;
    }
    void pushdown(int rt){
        if(rev[rt]){
            swap(ch[rt][0],ch[rt][1]);
            if(ch[rt][0])rev[ch[rt][0]]^=1;
            if(ch[rt][1])rev[ch[rt][1]]^=1;
            rev[rt]=0;
        }
    }
    int merge(int x,int y){
        if(!x||!y)return x+y;
        if(rnd[x]

LCA

#include
#include
using namespace std;
struct edge{
    int v;int next;
} a[1000010];
int head[500005],depth[500005],lg[500005],fa[500005][30],cnt=0;
inline int read(){
    int x=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
    return x;
}
inline void add_edge(int u,int v){
    a[++cnt].v=v;
    a[cnt].next=head[u];
    head[u]=cnt;
}
void dfs(int n,int father){
    depth[n]=depth[father]+1;
    //cout<<"father="<depth[y])
        x=fa[x][lg[depth[x]-depth[y]]-1];
    if(x==y)return x;
    for(int i=lg[depth[x]]-1;i>=0;i--){
        if(fa[x][i]==fa[y][i])
            continue;
        else
            x=fa[x][i],y=fa[y][i];
        if(fa[x][0]==fa[y][0])
            return fa[x][0];
    }
}
int main(){
    int n,m,root,u,v;
    scanf("%d%d%d",&n,&m,&root);
    for(register int i=1;i

凸包极角序

#include
#include
#include
#include
using namespace std;
struct point{
    double x,y;
} a[300005],LTL,b[300005];
int top=0;
bool toleft(point p,point q,point r){
    return (0<(p.x*q.y-q.x*p.y+q.x*r.y-r.x*q.y+r.x*p.y-p.x*r.y));
}
bool operator<(point a,point b){
    return toleft(LTL,a,b);
}
double dis(point a,point b){
    return sqrt(abs(a.x-b.x)*abs(a.x-b.x)+abs(a.y-b.y)*abs(a.y-b.y));
}
int main(){
    /*point t,tt,ttt;
    t.x=-1;t.y=-2;
    tt.x=tt.y=4;
    ttt.x=0;ttt.y=1;
    cout<>n;
    LTL.x=LTL.y=1000000007;
    for(int i=1;i<=n;i++)cin>>a[i].x>>a[i].y;
    for(int i=1;i<=n;i++)
        if(LTL.y>a[i].y||(LTL.y==a[i].y&<L.x>a[i].x))
            LTL=a[i];
    bool bj=0;
    for(int i=1;i<=n;i++){
        if(a[i].x==LTL.x&&a[i].y==LTL.y)bj=1;
        if(bj==1&&i1){
            //cout<<"\n----\n";
            //for(int i=0;i

Dijkstra
4779

#include
#include
#include
#include
using namespace std;
struct point{
    int diss;
    int u;
};
point mk(int x,int y){
    point xx;
    xx.diss=x;
    xx.u=y;
    return xx;
}
bool operator<(point a,point b){
    return a.diss>b.diss;
}
priority_queue pq;
vector > a[100005];
int dis[100005];
bool book[100005];
void dijkstra(int s){
    while(!pq.empty()){
        s=pq.top().u;
        pq.pop();
        if(book[s])continue;
        book[s]=1;
        //cout<>n>>m>>s;
    for(int i=0;i>x>>y>>c;
        a[x].push_back(make_pair(y,c));
    }
    dis[s]=0;
    pq.push(mk(0,s));
    dijkstra(s);
    for(int i=1;i<=n;i++)cout<

你可能感兴趣的:(c++)