11月

好久没上博客了。。。 今天什么都没有干 。。。心里崩溃了。。。

好多东西要学啊自己智商低下 懒惰 (在颓废就去舔厕所(真的))

记录一些模板

dinic codevs1993

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge
{
    int to,f,nxt;
}e[10010];
int n,m,cnt=1;
int d[10010],q[10010],g[10010];
inline void Init()
{
    memset(d,0x3f3f3f3f,sizeof(d));
    d[1]=1;
}
inline void link(int u,int v,int c)
{
    e[++cnt].nxt=g[u];
    g[u]=cnt;
    e[cnt].to=v;
    e[cnt].f=c;
}
inline int Min(int x,int y)
{
    return x<y?x:y;
}
inline int read()
{
    int x=0,f=1; char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x*=10;x+=c-'0';c=getchar();}
    return x*f;
}
bool bfs()
{
    Init(); 
    queue<int>q;
    q.push(1);
    while(!q.empty())
    {
        int u=q.front(); q.pop();
        for(int i=g[u];i;i=e[i].nxt)
        {
            int v=e[i].to;
            if(e[i].f&&d[v]==inf)
            {
                d[v]=d[u]+1;
                q.push(v);
            }
        }
    }    
    return d[n]!=inf;
}
int dfs(int u,int delta)
{
    if(u==n) return delta;
    int ret=0;
    for(int i=g[u];i&&delta;i=e[i].nxt)
    {
        int v=e[i].to;
        if(d[v]==d[u]+1)
        {
            int dd=dfs(v,Min(delta,e[i].f));
            e[i].f-=dd;
            e[i^1].f+=dd;
            delta-=dd;
            ret+=dd;
        }
    }
    return ret;
}
inline void dinic()
{
    int tot=0;
    while(bfs())
    {
        tot+=dfs(1,inf);
    }
    printf("%d",tot);
}
int main()
{
    m=read(); n=read();
    for(int i=1;i<=m;i++)
    {
        int u,v,c; u=read(); v=read(); c=read();
        link(u,v,c); link(v,u,0);
    }
    dinic();
    return 0;
}

费用流 codevs 1227

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
struct edge
{
    int to,nxt,c,f;
}e[30011];
int n,k,cur,ans,cnt=1;
int dist[30011],used[30011],pree[30011],prev[30011],g[30011];
void link(int u,int v,int f,int c)
{
    e[++cnt].nxt=g[u];
    g[u]=cnt;
    e[cnt].f=f;
    e[cnt].to=v;
    e[cnt].c=c;
}
void ins(int u,int v,int f,int c)
{
    link(u,v,f,c);
    link(v,u,0,-c);
}
int Min(int x,int y)
{
    return x<y?x:y;
}
bool spfa()
{
    queue<int>q;
    memset(dist,-1,sizeof(dist));
    memset(used,0,sizeof(used));
    dist[0]=0;
    q.push(0);
    while(!q.empty())
    {
        int u=q.front(); q.pop(); 
        used[u]=0;
        for(int i=g[u];i;i=e[i].nxt)
        {
            int v=e[i].to,w=e[i].c;
            if(e[i].f&&dist[v]<dist[u]+w)
            {
                dist[v]=dist[u]+w;
                prev[v]=u; pree[v]=i;
                if(!used[v])
                {
                    q.push(v); 
                    used[v]=1;
                }
            }
        }
    }
    return dist[10010]!=-1;
}
int MinCostFlow()
{
    int u=10010,sum=inf;
    while(u)
    {
        e[pree[u]].f--;
        e[pree[u]^1].f++;
        u=prev[u];
    }
//    cout<<dist[10010]<<endl;
    return dist[10010];
}
void MinFlow()
{
    while(spfa())
    {
        cur+=MinCostFlow();
        if(cur>ans) ans=cur;
    }
    printf("%d",ans);
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            int x; scanf("%d",&x);
            ins((i-1)*n+j,(i-1)*n+j+n*n,1,x);
            ins((i-1)*n+j,(i-1)*n+j+n*n,k,0);
            if(i!=n)
            {
                ins((i-1)*n+j+n*n,i*n+j,k,0);
            }
            if(j!=n)
            {
                ins((i-1)*n+j+n*n,(i-1)*n+j+1,k,0);
            }
        }
    }
    ins(0,1,k,0);
    ins(n*n*2,10010,k,0);
    MinFlow();
    return 0;
}

树剖 自己写错了 老师给调出来的

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> 
#define N 200010
using namespace std;
typedef long long ll;
const int inf=1<<29;
struct edge
{
    int nxt,to;
}e[N*2];
int n,Time,q,cnt=1;
int top[N],tid[N],size[N],used[N],head[N],dep[N],son[N];
ll tree[N*10],sum[N],fa[N],w[N];
char s[10];
void insert(int u,int v)
{
    e[++cnt].nxt=head[u];
    head[u]=cnt;
    e[cnt].to=v;
}
void dfs1(int u)
{
    used[u]=1; size[u]=1; int Max=0;
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if(!used[v]) 
        {
            fa[v]=u;
            dep[v]=dep[u]+1; dfs1(v); size[u]+=size[v];
            if(size[v]>Max) {Max=size[v];son[u]=v;}
        }
    }
}
void dfs2(int u,int ancestor)
{
    used[u]=1; top[u]=ancestor; tid[u]=++Time;
    if(son[u]) 
    {
        dfs2(son[u],ancestor);
    }
    for(int i=head[u];i;i=e[i].nxt)
    {
        int v=e[i].to;
        if(!used[v]) dfs2(v,v);
    }
}
void update(int l,int r,int x,int pos,int k)
{
    if(l==r) {tree[x]=k; sum[x]=k; return;}
    if(pos<=(l+r)/2)
    {
        update(l,(l+r)/2,2*x,pos,k);
        tree[x]=max(tree[x],tree[2*x]);    
    }
    else if(pos>(l+r)/2) 
    {
        update((l+r)/2+1,r,2*x+1,pos,k);
        tree[x]=max(tree[x],tree[2*x+1]);    
    }    
    sum[x]=sum[2*x]+sum[2*x+1];
}
ll querysm(int l,int r,int x,int a,int b)
{
    if(l>b||r<a) return 0;
    if(l==a&&r==b) return sum[x];
    int mid=(l+r)/2;
    if(mid>=b) return querysm(l,mid,2*x,a,b);
    else if(mid<a) return querysm(mid+1,r,2*x+1,a,b);
    else return querysm(l,mid,2*x,a,mid)+querysm(mid+1,r,2*x+1,mid+1,b);
}
int querymx(int l,int r,int x,int a,int b)
{
    if(l>b||r<a) return -inf;
    if(l>=a&&r<=b) return tree[x];
    return max(querymx(l,(l+r)/2,2*x,a,b),querymx((l+r)/2+1,r,2*x+1,a,b));
}
int Max(int u,int v)
{
    int ret=-inf;
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        ret=max(ret,querymx(1,n,1,tid[top[u]],tid[u]));
        u=fa[top[u]];
    }
    if(tid[u]<tid[v]) swap(u,v);
    ret=max(ret,querymx(1,n,1,tid[v],tid[u])); 
    return ret;
}
ll Sum(int u,int v)
{
    ll ret=0;
    while(top[u]!=top[v])
    {
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        ret+=querysm(1,n,1,tid[top[u]],tid[u]);
        u=fa[top[u]];
    }
    if(tid[u]<tid[v]) swap(u,v);
    ret+=querysm(1,n,1,tid[v],tid[u]); 
    return ret;
}

void solve()
{
    for(int i=1;i<=n;i++)
    {
        int u=tid[i];
        update(1,n,1,u,w[i]);
    }
    scanf("%d",&q);
    for(int i=1;i<=q;i++)
    {
        int u,v; scanf("%s%d%d",s,&u,&v);
        if(s[1]=='H') update(1,n,1,tid[u],v);
        if(s[1]=='M') printf("%d\n",Max(u,v));
        if(s[1]=='S') printf("%lld\n",Sum(u,v));
    }
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int u,v; scanf("%d%d",&u,&v);
        insert(u,v); insert(v,u);
    }    
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&w[i]);
    }
    dfs1(1); 
    memset(used,0,sizeof(used));
    dfs2(1,1);
    solve();
    return 0;
}

可并堆

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1000010
using namespace std;
int n,m;
int l[N],r[N],d[N],a[N],die[N],fa[N];
int merge(int u,int v)
{
    if(!u) return v;
    if(!v) return u;
    if(a[u]>a[v]) swap(u,v);
    r[u]=merge(r[u],v);
    if(d[r[u]]>d[l[u]]) swap(l[u],r[u]);
    if(!r[u]) d[u]=0;
    else d[u]=d[r[u]]+1;
    return u;
}
int find(int x)
{
    return x==fa[x]?fa[x]:find(fa[x]);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        fa[i]=i;
    }
    scanf("%d",&m);
    while(m--)
    {
        char s[10]; int u,v; scanf("%s",s);
        if(s[0]=='M')
        {
            scanf("%d%d",&u,&v);
            int p=find(u),q=find(v);
            if(die[u]||die[v]||p==q) continue;
            fa[p]=fa[q]=merge(p,q);
        }
        else 
        {
            scanf("%d",&u);
            if(die[u])
            {
                printf("0\n");
                continue;
            }
            v=find(u);
            die[v]=1;
            printf("%d\n",a[v]);
            fa[v]=merge(l[v],r[v]);
            fa[fa[v]]=fa[v];
        }
    }
    return 0;
}

manacher

#include<iostream>
#include<cstdio>
using namespace std;
int n;
char a[10010];
string s;
int p[10010];
void manacher()
{
    int pos=0,mx=0;
    for(int i=0;i<s.length();i++) 
    {
        if(i<mx)
        {
            p[i]=min(mx-i,p[2*pos-mx]);
        }
        while(s[i-p[i]]==s[i+p[i]])
            p[i]++;
        p[i]--;
        if(i+p[i]>mx)//当前范围大 
        {
            mx=i+p[i];
            pos=i;//zx
        }
    }
    mx=0;
    for(int i=0;i<s.length();i++) 
    {
        if(p[i]>mx) 
        {
            mx=p[i];
            n=i;
        }
    }
}
int main()
{
    scanf("%s",a);
    for(int i=0;i<strlen(a)-1;i++)
    {
        s=s+a[i]; 
        s=s+'#';
    }
    s=s+a[strlen(a)-1];
    manacher();
    for(int i=n-p[n];i<=n+p[n];i++)
    {
        if(s[i]!='#') printf("%c",s[i]);
    }
    return 0;
}

splay bzoj1588 调了好长时间

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct data
{
    int fa,l,r,size,cnt,key;
}tree[100010];
bool flag1,flag2;
int root,n,tot,ans,a,b;
int abs(int x)
{
    return x>0?x:-x;
}
void update(int x)
{
    tree[x].size=tree[tree[x].l].size+tree[tree[x].r].size+tree[x].cnt;
}
void zig(int x)
{
    int y=tree[x].fa;
    int z=tree[x].r;
    tree[y].l=z;
    tree[z].fa=y;
    tree[x].fa=tree[y].fa;
    if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
    else tree[tree[y].fa].r=x;
    tree[x].r=y;
    tree[y].fa=x;
    update(x);
    update(y);
}
void zag(int x)
{
    int y=tree[x].fa;
    int z=tree[x].l;
    tree[y].r=z;
    tree[z].fa=y;
    tree[x].fa=tree[y].fa;
    if(y==tree[tree[y].fa].l) tree[tree[y].fa].l=x;
    else tree[tree[y].fa].r=x;
    tree[x].l=y;
    tree[y].fa=x;
    update(x);
    update(y);
}
void splay(int x)
{
    if(!root)
    {
        root=x;
        return;        
    }
    while(tree[x].fa)
    {
        int y=tree[x].fa;
        int z=tree[y].fa;
        if(y==root) 
        {            
            if(x==tree[root].l) zig(x); else zag(x);
            update(x);
            break;
        }
        else if(y==tree[z].l&&x==tree[y].l) {zig(y); zig(x);}
        else if(y==tree[z].r&&x==tree[y].r) {zag(y); zag(x);}
        else if(y==tree[z].l&&x==tree[y].r) {zag(x); zig(x);}
        else if(y==tree[z].r&&x==tree[y].l) {zig(x); zag(x);}
        update(x);
    }
    root=x;
}
void insert(int x,int k)
{    
    if(tree[x].key<k) 
    {
        if(tree[x].r==0)
        {
            ++tot;
            tree[tot].fa=x;
            if(x) tree[x].r=tot;
            tree[tot].key=k;
            tree[tot].cnt=1;
            update(tot);
            update(x);
            splay(tot);
            return;
        }
        insert(tree[x].r,k);
        update(x);
    }
    else
    {
        if(tree[x].l==0)
        {
            ++tot;
            tree[tot].fa=x;
            if(x) tree[x].l=tot;
            tree[tot].key=k;
            tree[tot].cnt=1;
            update(tot);
            update(x);
            splay(tot);
            return;
        }
        insert(tree[x].l,k);
        update(x);
    }
}
void findnxt(int x,int k,int pd)
{
    if(x==0) return;
    if(pd==0)
    {
        if(tree[x].key<=k)
        {
            flag1=true;
            a=tree[x].key;
            findnxt(tree[x].r,k,pd);
        } else findnxt(tree[x].l,k,pd);
    }
    else 
    {
        if(tree[x].key>=k)
        {
            flag2=true;
            b=tree[x].key;
            findnxt(tree[x].l,k,pd);
        } else findnxt(tree[x].r,k,pd);
    }
}
int main()
{
    scanf("%d",&n);
    while(n--)
    {
        int x; scanf("%d",&x);
        findnxt(root,x,0);
        findnxt(root,x,1);    
        int temp=0;
        bool flag=false;
//        printf("%d %d\n",a,b);
        if(flag1) 
        {
            temp=abs(a-x);
            flag=true;
        }
        if(flag2)
        {
            if(flag) temp=min(temp,abs(b-x));
            else temp=abs(b-x);
        }
        if(tree[root].size==0) ans+=x;
        else ans+=temp;
        insert(root,x);
        flag1=false;
        flag2=false;
        a=0; 
        b=0;
    }
    printf("%d",ans);
    return 0;
}

cdq bzoj3224

#include<cstdio>
#include<vector>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
#define K 3000010
struct data
{
    int s,c,m,type,pos,size;
}f[K],F[K];
vector<data> c;
int n,k,tot;
int tree[K],ans[K],temp[K],size[K];
int lowbit(int x)
{
    return x&(-x);
}
void update(int pos,int delta)
{
    for(int i=pos;i<=k;i+=lowbit(i))
        tree[i]+=delta;
}
int sum(int pos)
{
    int ret=0;
    for(int i=pos;i>0;i-=lowbit(i)) 
        ret+=tree[i];
    return ret;
}
bool cp(data x,data y)
{
    if(x.s!=y.s) return x.s<y.s;
    if(x.c!=y.c) return x.c<y.c;
    return x.m<y.m;
}
bool cp1(data x,data y)
{
    if(x.c!=y.c) return x.c<y.c;
    if(x.m!=y.m) return x.m<y.m;
    return x.type<y.type;
}
void cdq(int l,int r)
{
    if(l>=r) return; int mid=(l+r)/2; 
    cdq(l,mid); cdq(mid+1,r);
    c.clear();
    for(int i=l;i<=mid;i++)
    {
        data t=f[i]; t.type=1;
        c.push_back(t);
    }
    for(int i=mid+1;i<=r;i++)
    {
        data t=f[i]; t.type=2;
        c.push_back(t);
    }
    sort(c.begin(),c.end(),cp1);
    for(int i=0;i<c.size();i++)
    {
        if(c[i].type==1) update(c[i].m,c[i].size);
        if(c[i].type==2) 
        {
            temp[c[i].pos]+=sum(c[i].m);
        }
    }
    for(int i=0;i<c.size();i++)
    {
        if(c[i].type==1) update(c[i].m,-c[i].size);
    }
}
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&F[i].s,&F[i].c,&F[i].m);
        F[i].size++;
    }
    sort(F+1,F+n+1,cp);
    f[++tot]=F[1];
    f[1].pos=1;
    for(int i=2;i<=n;i++)
    {
        if(F[i].s!=F[i-1].s||F[i].c!=F[i-1].c||F[i].m!=F[i-1].m) 
        {
            f[++tot]=F[i]; f[tot].pos=tot;
        }
        else f[tot].size++;
    }
    cdq(1,tot);
    for(int i=1;i<=tot;i++)
    {
        temp[i]+=f[i].size-1;
        ans[temp[i]]+=f[i].size;
    }
    for(int i=0;i<n;i++)
    {
        printf("%d\n",ans[i]);
    }
    return 0;
}

主席树 poj2104 自己想不出来 zz

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000010
using namespace std;
int n,cnt,m;
int rt[N],l[N],r[N],a[N],b[N],c[N],sum[N];
bool cp(int x,int y)
{
    return a[x]<a[y];
}
void build(int ll,int rr,int&x)
{
    x=++cnt;
    if(ll==rr) return;
    build(ll,(ll+rr)/2,l[x]);
    build((ll+rr)/2+1,rr,r[x]);
}
void update(int ll,int rr,int&x,int last,int pos)
{
    x=++cnt;
    l[x]=l[last];
    r[x]=r[last];
    sum[x]=sum[last]+1;
    if(ll==rr) return;
    if(pos>(ll+rr)/2) update((ll+rr)/2+1,rr,r[x],r[last],pos);
    else update(ll,(ll+rr)/2,l[x],l[last],pos);
}
int query(int ll,int rr,int x,int y,int k)
{
    if(ll==rr) return ll;
    int temp=sum[l[x]]-sum[l[y]];
//    printf("%d\n",temp);
    if(temp>=k) return query(ll,(ll+rr)/2,l[x],l[y],k);
    else return query((ll+rr)/2+1,rr,r[x],r[y],k-temp);
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        c[i]=i;
    }
    sort(c+1,c+n+1,cp);//c是编号 
    for(int i=1;i<=n;i++)
    {
        b[c[i]]=a[i];
    }
    build(1,n,rt[0]);
    for(int i=1;i<=n;i++)
    {
        update(1,n,rt[i],rt[i-1],c[i]);
    }
    while(m--)
    {
        int l,r,k; scanf("%d%d%d",&l,&r,&k);
//        printf("%d\n",query(1,n,rt[r],rt[l-1],k));
        printf("%d\n",b[query(1,n,rt[r],rt[l-1],k)]);
    }
    return 0;
}

gauss

#include<iostream>
#include<cstdio>
using namespace std;
int n;
double a[20][20],b[20][20];
void Init()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            b[i][j]=2*a[i][j]-2*a[i+1][j];
            b[i][n+1]+=a[i][j]*a[i][j]-a[i+1][j]*a[i+1][j];
        }
    }
}
void gauss()
{
    for(int now=1;now<=n;now++)
    {
        int x=now;
        for(int j=now+1;j<=n;j++) 
        {
            if(b[j][now]>b[x][now]) x=j;
        }
        for(int j=1;j<=n+1;j++)
            swap(b[now][j],b[x][j]);
        double t=b[now][now];
        for(int i=now;i<=n+1;i++)
            b[now][i]/=t;
        for(int row=now+1;row<=n;row++)
        {
            t=b[row][now];
            for(int i=now;i<=n+1;i++)
                b[row][i]-=b[now][i]*t;
        }
    }
    for(int now=n;now>=2;now--)
        for(int row=now-1;row>=1;row--)
            b[row][n+1]-=b[now][n+1]*b[row][now];
    for(int i=1;i<n;i++)
        printf("%.3lf ",b[i][n+1]);
    printf("%.3lf",b[n][n+1]);
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n+1;i++)
        for(int j=1;j<=n;j++)
        {
            scanf("%lf",&a[i][j]);
        }    
    Init();
    gauss();
    return 0;
}

看毛片 matrix67

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int j;
string a,b;
int nxt[110];
int main()
{
    cin>>a>>b;
    a=' '+a;
    b=' '+b;
    for(int i=2;i<b.length()-1;i++)
    {
        while(j>0&&b[j+1]!=b[i]) j=nxt[j];//推下一个 
        if(b[j+1]==b[i]) j++;//相等 
        nxt[i]=j;//最大相等串 
    }
    j=0;
    for(int i=1;i<a.length();i++)
    { 
        while(j>0&&a[i]!=b[j+1]) j=nxt[j];
        if(a[i]==b[j+1]) j++;
        if(j==b.length()-1)
        {
            printf("%d",i-j+1);
            return 0;
        }
    }
    return 0;
}

 

ac自动机调不对a

哭晕在厕所里

 

posted @ 2016-12-12 21:30  19992147  阅读(137)  评论(0编辑  收藏  举报