码迷,mamicode.com
首页 > 其他好文 > 详细

清北刷题冲刺 10-30 p.m

时间:2017-10-30 17:05:21      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:isp   include   ide   opened   bool   void   std   包括   12c   

少女

技术分享

 

技术分享
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstdlib>
#define maxn 200010
#define mod 1000000007
using namespace std;
int n,m,head[maxn],num,c[maxn],du[maxn];
int ans=1;
bool vis[maxn];
struct node{
    int to,pre,v;
}e[maxn*2];
void Insert(int from,int to,int id,int v){
    e[id].to=to;
    e[id].v=v;
    e[id].pre=head[from];
    head[from]=id;
}
int Pow(int a,int b){
    int res=1;
    while(b){
        if(b&1)res=1LL*res*a%mod;
        a=1LL*a*a%mod;
        b>>=1;
    }
    return res;
}
void bfs(int s){
    int count=0;
    queue<int>q;
    q.push(s);vis[s]=1;
    int cnt=0;//记录联通块中有多少边 
    while(!q.empty()){
        int now=q.front();q.pop();
        count+=c[now];
        while(count>=mod)count-=mod;
        for(int i=head[now];i;i=e[i].pre){
            if(e[i].v){
                e[i].v=0;
                int nxt;
                if(i>m)nxt=i-m;
                if(i<=m)nxt=i+m;
                e[nxt].v=0;
                cnt+=1;
                if(!vis[e[i].to]){
                    vis[e[i].to]=1;
                    q.push(e[i].to);
                }
            }
        }
    }
    int w=Pow(2,cnt)-count;
    if(w<=0){
        puts("0");exit(0);
    }
    ans=1LL*ans*w%mod;
    while(ans>=mod)ans-=mod;
}
int main(){
    freopen("girl.in","r",stdin);freopen("girl.out","w",stdout);
//    freopen("Cola.txt","r",stdin);
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        if(x==y)y+=n,n++;
        Insert(x,y,i,1);Insert(y,x,i+m,1);
        du[x]++;du[y]++;
    }
    for(int i=1;i<=n;i++){
        c[i]=Pow(2,du[i])-1-du[i];
        while(c[i]<0)c[i]+=mod;
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            bfs(i);
        }
    }
    printf("%d",ans);
    return 0;
}
0分

 

终末

技术分享

 

技术分享
#include<iostream>
#include<cstdio>
using namespace std;
long long n,bin[1000],ans,a[1000];
int k,cnt=-1;
long long Pow(long long a,long long b){
    long long res=1;
    while(b){
        if(b&1)res=1LL*res*a;
        a=1LL*a*a;
        b>>=1;
    }
    return res;
}
int main(){
//    freopen("Cola.txt","r",stdin);
//    freopen("endless.in","r",stdin);freopen("endless.out","w",stdout);
    cin>>n>>k;
    int t=0;
    while(1){
        cnt=cnt+1;
        bin[cnt]=Pow(k,cnt);
        if(bin[cnt]>n)break;
    }
    for(long long i=0;i<=n;i++){
        bool flag=0;
        long long now=i;
        for(int j=cnt;j>=0;j--){
            a[j]=now/bin[j];
            if(a[j]&&(j&1)){
                flag=1;break;
            }
            now-=a[j]*bin[j];
        }
        if(flag==0)ans++;
    }
    cout<<ans;
}
40分 暴力

 

旅行

技术分享

技术分享

 

技术分享
#include<iostream>
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,num,head[maxn],v[maxn],k,le[maxn],cnt;
long long w[maxn],ans,sum;
int top[maxn],fa[maxn],son[maxn],sz[maxn],dep[maxn];
struct node{
    int to,pre;
}e[maxn*2];
void Insert(int from,int to){
    e[++num].to=to;
    e[num].pre=head[from];
    head[from]=num;
}
void dfs1(int now,int father){
    dep[now]=dep[father]+1;
    fa[now]=father;
    sz[now]=1;
    w[now]=w[father]+v[now];
    bool flag=0;
    for(int i=head[now];i;i=e[i].pre){
        int to=e[i].to;
        if(to==father)continue;
        dfs1(to,now);
        sz[now]+=sz[to];
        if(!son[now]||sz[to]>sz[son[now]])son[now]=to;
        flag=1;
    }
    if(!flag)le[++cnt]=now;
}
void dfs2(int now,int father){
    top[now]=father;
    if(son[now])dfs2(son[now],father);
    for(int i=head[now];i;i=e[i].pre){
        int to=e[i].to;
        if(to==fa[now]||to==son[now])continue;
        dfs2(to,to);
    }
}
int lca(int a,int b){
    while(top[a]!=top[b]){
        if(dep[top[a]]<dep[top[b]])swap(a,b);
        a=fa[top[a]];
    }
    if(dep[a]>dep[b])swap(a,b);
    return a;
}
int q[maxn];
void count(){
    long long now=0;
    for(int i=1;i<=k;i++)now+=w[q[i]];
    for(int i=1;i<=k;i++)
        for(int j=i+1;j<=k;j++)
            now-=w[lca(q[i],q[j])];
    ans=max(ans,now);
}
void dfs(int pos,int c){
    if(c==k+1){
        count();
        return;
    }
    if(pos>cnt)return;
    if(cnt-pos<k-c)return;
    q[c]=le[pos];
    dfs(pos+1,c+1);
    dfs(pos+1,c);
}
bool flag=1;
bool cmp(int x,int y){return x>y;}
int main(){
    freopen("tour.in","r",stdin);freopen("tour.out","w",stdout);
//    freopen("Cola.txt","r",stdin);
    scanf("%d%d",&n,&k);
    if(k==0){
        puts("0");
        return 0;
    }
    int x,y;
    for(int i=1;i<=n;i++)scanf("%d",&v[i]),sum+=v[i];
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        Insert(x,y);Insert(y,x);
        if(x!=1&&y!=1)flag=0;
    }
    if(flag){
        ans=v[1];
        v[1]=0;
        sort(v+1,v+n+1,cmp);
        for(int i=1;i<=k;i++){
            ans+=v[i];
        }
        cout<<ans;
        return 0;
    }
    dfs1(1,0);
    dfs2(1,1);
    if(k>=cnt){
        cout<<sum;
        return 0;
    }
    dfs(1,1);
    cout<<ans;
    return 0;
}
30分 暴力

 

 

 

技术分享
预计得分100+40+30
实际得分0+40+30
T1错误比较大,是思路有误,根本原因在于自己造的样例没有包括全部的情况,以后引以为戒,不光要多造样例,更要尽可能想到更多的情况。T2T3写的时间不多,T2暴力分拿到了,T3wa了好几个,不知道为什么
今天下午时间把握不好,T1上浪费的时间太多而且思路偏离,T2T3草草写了暴力,难免出错,下不为例
小结

 

清北刷题冲刺 10-30 p.m

标签:isp   include   ide   opened   bool   void   std   包括   12c   

原文地址:http://www.cnblogs.com/thmyl/p/7754961.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!