2017-11-4離線賽總結

題目

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 100005
int 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 500005
int 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 100005
using 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 100005
using 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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章