2017-11-4离线赛总结

来源:互联网 发布:吴江js华腾公寓自提柜 编辑:程序博客网 时间:2024/06/05 19:32

    • 题目
    • 失分小结
      • 估分
      • 实际分数
    • 题解
      • T1
        • P65
          • CODE
        • P100
          • CODE
      • T2
        • P100
          • CODE
      • T3
        • P80
          • CODE
        • P100
          • CODE

题目

3802,3803,3804.

失分小结

估分

100+20+80=200

实际分数

65+0+0=65
小C:你是打酱油的么
我:我本来可以拿200的!
小C:骗谁啊
三题都炸,最烂的一次…
第一题内存开小…
第二题…本来也就只写了P20然后还编译错误…
第三题依旧编译错误…我恨重载!!少加了个const…以及ans没开long long

题解

T1

P65

真的只是无聊给你们看看内存开小的后果

CODE
#include<cstdio>#include<algorithm>#define N 100005int n,m;int Q[N],Q2[N],l1=1,l2=1,r1,r2;inline int top() {    int t1=-2e9,t2=-2e9;    if(l1<=r1)t1=Q[l1];    if(l2<=r2)t2=Q2[l2];    if(t1>=t2) {        l1++;        return t1;    }    l2++;    return t2;}bool cmp(int _,int __) {return _>__;}int main() {    int i;    scanf("%d%d",&n,&m);    for(i=1; i<=n; i++)scanf("%d",&Q[i]);    std::sort(Q+1,Q+1+n,cmp);    r1=n;    i=0;    while(++i) {        int x=top();        if(x<i) {            --i;            break;        }        if(x==i)break;        Q2[++r2]=x-m+1;    }    printf("%d",i);    return 0;}

P100

CODE
#include<cstdio>#include<algorithm>#define N 500005int n,m;int Q[N],Q2[N],l1=1,l2=1,r1,r2;inline int top() {    int t1=-2e9,t2=-2e9;    if(l1<=r1)t1=Q[l1];    if(l2<=r2)t2=Q2[l2];    if(t1>=t2) {        l1++;        return t1;    }    l2++;    return t2;}bool cmp(int _,int __) {return _>__;}int main() {    int i;    scanf("%d%d",&n,&m);    for(i=1; i<=n; i++)scanf("%d",&Q[i]);    std::sort(Q+1,Q+1+n,cmp);    r1=n;    i=0;    while(++i) {        int x=top();        if(x<i) {            --i;            break;        }        if(x==i)break;        Q2[++r2]=x-m+1;    }    printf("%d",i);    return 0;}

T2

状压dp.

P100

O(2kk).

CODE
#include<cstdio>#include<cmath>#include<memory.h>#define M 20#define reg register/*不要在意这些细节*/typedef long long LL;inline void rd(int &x) {    x=0;char c;    while(c=getchar(),c<48);    do x=(x<<3)+(x<<1)+(c&15);    while(c=getchar(),c>47);}int cnt[M],A[100005];LL cost[1<<M][M];LL dp[1<<M],val[M][M];inline void Min(LL &a,LL b) {if(a>b)a=b;}int main() {    int n,k;    rd(n),rd(k);    for(reg int i=1; i<=n; i++)rd(A[i]),A[i]--;    for(reg int i=n; i>=1; i--) {        for(reg int j=0; j<k; j++)            if(j!=A[i])                val[A[i]][j]+=cnt[j];        cnt[A[i]]++;    }    for(reg int i=0; i<k; i++)        for(reg int j=1; j<(1<<k); j++)            if(!(j&(1<<i))) {                reg int x=j&-j;                cost[j][i]=cost[j-x][i]+val[i][(int)log2(x)];            }    memset(dp,127,sizeof dp);    dp[0]=0;    for(reg int i=0; i<(1<<k); i++)        for(reg int j=0; j<k; j++)            if(!(i&(1<<j)))                Min(dp[i|(1<<j)],dp[i]+cost[i][j]);    printf("%lld\n",dp[(1<<k)-1]);    return 0;}

T3

P80

CODE
#include<cstdio>#include<memory.h>#include<algorithm>#define N 100005using namespace std;struct node2 {int to,nxt;}edge[N<<1];int head[N],tot;int dep[N],fa[N],sz[N],son[N],top[N];struct node {    int a,b,lca;    bool operator<(const node _)const/*就是这个const!!!*/ {return dep[lca]>dep[_.lca];}} A[N];void dfs1(int x) {    sz[x]=1;    for(int i=head[x]; ~i; i=edge[i].nxt) {        node2 y=edge[i];        if(y.to==fa[x])continue;        fa[y.to]=x;        dep[y.to]=dep[x]+1;        dfs1(y.to);        sz[x]+=sz[y.to];        if(sz[son[x]]<sz[y.to])            son[x]=y.to;    }}void dfs2(int x,int tp) {    top[x]=tp;    if(son[x])dfs2(son[x],tp);    for(int i=head[x]; ~i; i=edge[i].nxt) {        int y=edge[i].to;        if(y==fa[x]||y==son[x])continue;        dfs2(y,y);    }}int LCA(int a,int b) {    while(top[a]!=top[b]) {        if(dep[top[a]]>dep[top[b]])a=fa[top[a]];        else b=fa[top[b]];    }    return dep[a]>dep[b]?b:a;}int du[N];bool cmp(node a,node b) {return a.a<b.a;}int main() {    int n,m,a,b;    scanf("%d %d",&n,&m);    memset(head,-1,sizeof head);    bool flag=1;    for(int i=1; i<n; i++) {        scanf("%d %d",&a,&b);        edge[tot]=(node2) {b,head[a]},head[a]=tot++;        edge[tot]=(node2) {a,head[b]},head[b]=tot++;        du[a]++;        du[b]++;        if(a!=b+1&&b!=a+1)flag=0;    }    dfs1(1);    dfs2(1,1);    for(int i=1; i<=m; i++) {        scanf("%d %d",&A[i].a,&A[i].b);        A[i].lca=LCA(A[i].a,A[i].b);        if(A[i].a>A[i].b) {            int t=A[i].a;            A[i].a=A[i].b;            A[i].b=t;        }    }    long long ans=0;    if(!flag) {//非链        sort(A+1,A+m+1);        for(int i=1; i<=m; i++) {            for(int j=i+1; j<=m; j++) {                int lcai=A[i].lca,lcaj=A[j].lca;                if(lcai!=lcaj&&lcai!=A[j].a&&lcai!=A[j].b) {                    if(dep[lcai]==dep[lcaj])continue;                    int cnt=0;                    bool f=0;                    if(dep[lcai]<=dep[A[j].a])cnt++;                    if(dep[lcai]<=dep[A[j].b])f=1,cnt++;                    if(cnt==0)continue;                    else if(cnt==1) {                        if(f&&LCA(lcai,A[j].b)==lcai)ans++;                        else if(LCA(lcai,A[j].a)==lcai)ans++;                    } else {                        cnt=0;                        if(LCA(lcai,A[j].a)!=lcai)cnt++;                        if(LCA(lcai,A[j].b)!=lcai)cnt++;                        if(cnt==1)ans++;                    }                } else ans++;            }        }    } else {//链        sort(A+1,A+m+1,cmp);        for(int i=1; i<m; i++) {            int x=A[i].b,pos=i;            int L=i+1,R=m;            while(L<=R) {                int mid=(L+R)>>1;                if(A[mid].a<=x) {                    L=mid+1;                    pos=mid;                } else R=mid-1;            }            ans+=pos-i;        }    }    printf("%lld\n",ans);    return 0;}

P100

CODE
#include<cstdio>#include<memory.h>#define N 100005using namespace std;inline void rd(int &x){    x=0;char c;    while(c=getchar(),c<48);    do x=(x<<1)+(x<<3)+(c&15);    while(c=getchar(),c>47);}struct node2 {int to,nxt;}edge[N<<1];int head[N],tot;int dep[N],fa[N],sz[N],son[N],top[N];void dfs1(int x) {    sz[x]=1;    for(register int i=head[x]; ~i; i=edge[i].nxt) {        node2 y=edge[i];        if(y.to==fa[x])continue;        fa[y.to]=x;        dep[y.to]=dep[x]+1;        dfs1(y.to);        sz[x]+=sz[y.to];        if(sz[son[x]]<sz[y.to])            son[x]=y.to;    }}void dfs2(int x,int tp) {    top[x]=tp;    if(son[x])dfs2(son[x],tp);    for(register int i=head[x]; ~i; i=edge[i].nxt) {        register int y=edge[i].to;        if(y==fa[x]||y==son[x])continue;        dfs2(y,y);    }}int LCA(int a,int b) {    while(top[a]!=top[b]) {        if(dep[top[a]]>dep[top[b]])a=fa[top[a]];        else b=fa[top[b]];    }    return dep[a]>dep[b]?b:a;}int sum[N],cnt[N];long long ans=0;void DFS(int x) {    for(register int i=head[x]; ~i; i=edge[i].nxt) {        register int y=edge[i].to;        if(y==fa[x])continue;        DFS(y);        sum[x]+=sum[y];    }    ans+=1LL*cnt[x]*sum[x]+1LL*cnt[x]*(cnt[x]-1)/2;}int main() {    int n,m,a,b,lca;    rd(n),rd(m);    memset(head,-1,sizeof head);    for(register int i=1; i<n; i++) {        rd(a),rd(b);        edge[tot]=(node2) {b,head[a]},head[a]=tot++;        edge[tot]=(node2) {a,head[b]},head[b]=tot++;    }    dfs1(1);    dfs2(1,1);    for(register int i=1; i<=m; i++) {        rd(a),rd(b);        lca=LCA(a,b);        sum[a]++;sum[b]++;sum[lca]-=2;cnt[lca]++;    }    DFS(1);    printf("%lld\n",ans);    return 0;}