济南day3

连续几天都有点炸

预计的分拿不到,调整好心态,考试的时候多想一下,think twice,code once

唉,什么情况啊

题解链接

0+0+0

T1读错题输出反了

n*m%2判断是否==1

T2

40分暴力忘记取mod了,全炸了gg

T3

70分暴力输出了中间变量,然后主席树写成了区间第k小,gg

建立10颗线段树维护前k大,因为k<=10

总结:以后认真点.....多推一下样例,合理分配时间,多思考

做完之后检查,最后几分钟不调新程序

下午

题解链接

我可能只能口头ac了,考完后都能说出正解,就是写不来,也许不吃饭就考不好????,我好菜啊

10+20+10

没状态,笔记本不好用,其实T2和T3是都可以切的,但是做了T1,虽然最后想出来了,没写不出来,不值。

T1 找环dfs瞎搞找错了,做了2h,后边没法做了

#include<cstdio> 
#include<vector>
#include<cstring>
using namespace std;
const int maxn = 100086;
struct node{
    int v,next;
}edge[maxn*4];
int head[maxn*4];
const int mod =1e9+7;int num;
inline void add_edge(int u,int v) {
    edge[++num].v=v;edge[num].next=head[u];head[u]=num;
}
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=x*10+c-'0',c=getchar();
    return x*f;
}
bool vis[maxn*2];
int n,m;bool flag=0;
int dfs(int u,int f) {
    int cnt=1;
    vis[u]=1;
    for(int i=head[u];i;i=edge[i].next) {
        int v=edge[i].v;
        if(v==f)continue;
        if(vis[v])flag=1;
        else cnt=(cnt+dfs(v,u))%mod; 
    }
    return cnt%mod;
}
int rd[maxn];
int main () {
    n=read();m=read();
    for(int i=1;i<=m;++i) {
        int a=read(),b=read();
        add_edge(a,b);add_edge(b,a);
    }
    long long ans=1;
    for(int i=1;i<=n;++i) {
        if(!vis[i]){
            flag=0;
            int qqq=dfs(i,0)%mod;
            if(!flag)ans=(ans%mod*qqq%mod)%mod;
            else ans=(ans<<1)%mod;
        }
    }
    printf("%lld
",ans);
}

T2 想出来了正解,没时间写了,暴力写炸

#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;
LL n,ans,cnt;
LL a[66],k;
int main() {
//    freopen("endless.in","r",stdin);
//    freopen("endless.out","w",stdout);
    cin>>n>>k;
    LL x=n;
    while(x) {
        a[++cnt]=x%k;
        x/=k;
    }
    if(cnt%2==0) ans=pow(k,cnt/2);
    else {
        for(int i=cnt;i>=1;i--) {
            if(a[i]>0&&i%2==0) {
                ans+=pow(k,i/2);
                break;
            }
            if(a[i]==0&&i%2) continue;
            ans+=a[i]*pow(k,i/2);
            if(i==1&&a[i]>0) ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

T3 想出来了正解,没写,暴力写炸

#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
#define maxn 200007
#define LL long long
int n,K;
int num=0;
int val[maxn<<2],pos[maxn<<2],fa[maxn<<2];
int clo[maxn<<2],cle[maxn<<2],lason[maxn<<2],tot=0;
struct node{
    int v,next;
}edge[maxn<<1];
int head[maxn<<1];
LL dis[maxn<<1],tree[maxn<<1],tag[maxn<<1],ans=0;//I64d见祖宗 
void add_edge(int u,int v){
  edge[++num].v=v;edge[num].next=head[u];head[u]=num;
}
void dfs(int rt) {
    clo[rt]=++tot;cle[tot]=rt;
    for(int i=head[rt];i;i=edge[i].next) {
        if(edge[i].v==fa[rt]) continue;
        fa[edge[i].v]=rt;dis[edge[i].v]=dis[rt]+(LL)val[edge[i].v];
        dfs(edge[i].v);
    }
    lason[rt]=tot;
}
void merge(int l,int r,int rt) {
    tree[rt]=tree[rt<<1];pos[rt]=pos[rt<<1];
    if(tree[rt] < tree[rt<<1|1]) tree[rt]=tree[rt<<1|1],pos[rt]=pos[rt<<1|1];
    return ;
}
void pushdown(int rt) {
    if(!tag[rt]) return ;
    tag[rt<<1]+=tag[rt];tag[rt<<1|1]+=tag[rt];
    tree[rt<<1]-=tag[rt];tree[rt<<1|1]-=tag[rt];
    tag[rt]=0;return ;
}
void build(int l,int r,int rt) {
    if(l==r) {
        tree[rt]=dis[cle[r]];
        pos[rt]=cle[r];return ;
    }
    int mid=(l+r)>>1;
    build(l,mid,rt<<1);
    build(mid+1,r,rt<<1|1);
    merge(l,r,rt);
}
void update(int l,int r,int rt,int ll,int rr,int c) {
    if(ll<=l&& r<=rr) {
        tree[rt]-=(LL)c;tag[rt]+=(LL)c;return ;
    }
    pushdown(rt);
    int mid=(l+r)>>1;
    if(ll<=mid) update(l,mid,rt<<1,ll,rr,c);
    if(rr>mid) update(mid+1,r,rt<<1|1,ll,rr,c);
    merge(l,r,rt);
}
int main() {
    //freopen("tour.in","r",stdin);
    //freopen("tour.out","w",stdout);
    int u,v,now;
    scanf("%d%d",&n,&K);
    for(int i=1;i<=n;i++) scanf("%d",val+i);
    for(int i=1;i<n;i++)
        scanf("%d%d",&u,&v),add_edge(u,v),add_edge(v,u);
    dis[1]=val[1];
    dfs(1);
    build(1,n,1);
    while(K--) {
        if(!tree[1]) break;
        ans+=tree[1];now=pos[1];
        while(val[now]) {
            update(1,n,1,clo[now],lason[now],val[now]);val[now]=0;now=fa[now];
        }
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/sssy/p/7753810.html