zoukankan      html  css  js  c++  java
  • 10.16NOIP模拟赛

    /*
    我是一个大sb
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    
    #define ll long long
    #define N 10000007
    #define mod 1000000000
    
    using namespace std;
    ll n,m,k,x,y,flag,ans,cnt;
    ll a[N],cur[N];
    priority_queue<ll>q;
    
    inline ll read()
    {
        ll x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    int main()
    {    
        freopen("shop.in","r",stdin);
        freopen("shop.out","w",stdout);
        n=read();m=read();
        x=read();y=read();
        a[1]=x;q.push(-a[1]);
        for(int i=2;i<=n;i++) 
        {
            a[i]=(y*a[i-1]+x)%mod;
            q.push(-a[i]);
            if(a[i]==0){k=i;break;}
        }
        if(!k)
        {
            for(int i=1;i<=m;i++)
            {
                ll res=q.top();q.pop();
                ans-=res;
            }
            cout<<ans<<endl;
            return 0;
        }
        int t=n/k,tt=n-t*k;a[t*k+1]=x;cur[++cnt]=x;
        for(int i=2;i<=tt;i++)
        {
            a[i+t*k]=(y*a[i+t*k-1]+x)%mod;
            cur[++cnt]=a[i];
        }
        sort(cur+1,cur+tt+1);
        if(m<=t) ans=0;
        else
        {
            while(!q.empty() && m)
            {
                int x=q.top();q.pop();x=-x;
                if(x<cur[1] || x>cur[tt]) 
                {
                    m-=t;ans+=x*t;
                }
                if(x>=cur[1] && x<=cur[tt])
                {
                    m-=(t+1);ans+=x*(t+1);
                }
            }
        }
        cout<<ans<<endl;
        fclose(stdin);fclose(stdout);
        return 0;
    }
    50找循环节。。。
    /*
    优先队列
    */
    #include<complex>
    #include<cstdio>
    #include<queue>
    using namespace std;
    const int mod=1e9;
    long long n,m,x,y,ans;
    priority_queue<int>q;
    int main()
    {
        freopen("shop.in","r",stdin);
        freopen("shop.out","w",stdout);
        scanf("%d%d%d%d",&n,&m,&x,&y);
        long long now=x;
        q.push(now);
        for(int i=2;i<=n;i++)
        {
            now=(now*y+x)%mod;
            if(i<=m)q.push(now);
            else if(now<q.top())
            {
                q.pop();
                q.push(now);
            }
        }
        while(!q.empty())
        {
            ans+=q.top();
            q.pop();
        }
        printf("%I64d
    ",ans);
        fclose(stdin);fclose(stdout);
        return 0;
    }

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    #define N 100007
    
    using namespace std;
    int n,m,k,cnt;
    int a[N],b[N];
    double c[N],ans;
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    void dfs(int now,int sum,double p)
    {
        if(now==n+1)
        {
            ans+=double(sum)*p;
            return;
        }
        if(a[now]==0)
        {
             dfs(now+1,sum & b[now],p*(1.000-c[now]));
             dfs(now+1,sum,p*c[now]);
        }
        if(a[now]==1)
        {
             dfs(now+1,sum | b[now],p*(1.000-c[now]));
             dfs(now+1,sum,p*c[now]);
        }
        if(a[now]==2)
        {
            dfs(now+1,sum ^ b[now],p*(1.000-c[now]));
            dfs(now+1,sum,p*c[now]);
        } 
    }
    
    int main()
    {
    //    freopen("exp.in","r",stdin);
    //    freopen("exp.out","w",stdout);
        n=read();
        for(int i=1;i<=n;i++) a[i]=read();
        for(int i=1;i<=n;i++) b[i]=read();
        for(int i=1;i<=n;i++) scanf("%lf",&c[i]);
        ans=0;dfs(1,0,1);
        printf("%.1lf
    ",ans);
        fclose(stdin);fclose(stdout);
        return 0;
    }
    40暴力
    /*
    把每一位拆开单独考虑
    f[i][0/1]表示到第i个运算,该位为0/1的概率
    对于每一个运算符分情况讨论 
    ans = sum[ f[n][1] * (1 << k) ]
    */
    #include<bits/stdc++.h>
    
    #define N 100007
    
    using namespace std;
    int n,a[N],b[N];
    double c[N], f[N][2];
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    double solve(int bit)
    {
        f[0][0]=1.00;
        for(int i=1;i<=n;i++)
        {
            int x = b[i] >> bit & 1;
            if(a[i]==0)
            {
                if(x==0)   f[i][0]=(f[i-1][1] + f[i-1][0]) * (1 - c[i]) + f[i-1][0] * c[i],
                           f[i][1]=f[i-1][1] * c[i];
                else        f[i][0]=f[i-1][0],
                           f[i][1]=f[i-1][1];
            }
    
            if(a[i]==1)
            {
                if(x==0)   f[i][0]=f[i-1][0],
                           f[i][1]=f[i-1][1];
                else        f[i][0]=f[i-1][0] * c[i],
                           f[i][1]=(f[i-1][0] + f[i-1][1]) * (1 - c[i]) + f[i-1][1] * c[i];
            }
    
            if(a[i] == 2)
            {
                if(x==0)   f[i][0]=f[i-1][0],
                           f[i][1]=f[i-1][1];
                else        f[i][0]=f[i-1][1] * (1 - c[i]) + f[i-1][0] * c[i],
                           f[i][1]=f[i-1][0] * (1 - c[i]) + f[i-1][1] * c[i];
            }
        }
        return f[n][1];
    }
    int main()
    {
        freopen("exp.in", "r", stdin);
        freopen("exp.out", "w", stdout);
        cin>>n;
        for(int i = 1;i<=n;i++) cin>>a[i];
        for(int i = 1;i<=n;i++) cin>>b[i];
        for(int i = 1;i<=n;i++) scanf("%lf",&c[i]);
        double ans = 0;
        for(int i = 31;i>=0;i--) ans+=(double)(1ll << i) * solve(i);
        printf("%.1lf",ans);
        return 0;
    }

    、、

    #include<bits/stdc++.h>
    
    #define N 50001
    
    using namespace std;
    int n,m,T,ans,cnt,res,num;
    int head[N],deep[N],sum[N];
    int f[N][26],tmp1[N],tmp2[N];
    struct edge{
        int u,v,w,net;
    }e[N<<1];
    
    inline int read()
    {
        int x=0,f=1;char c=getchar();
        while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    
    inline void add(int u,int v,int w)
    {
        e[++cnt].v=v;e[cnt].w=w;e[cnt].net=head[u];head[u]=cnt;
    }
    
    void dfs(int u,int fa,int c)
    {
        f[u][0]=fa;deep[u]=c;
        for(int i=head[u];i;i=e[i].net)
        {
            int v=e[i].v;
            if(v==fa) continue;
            sum[v]+=e[i].w+sum[u];
            dfs(v,u,c+1);
        }
    }
    
    void get()
    {
        for(int j=1;j<=25;j++)  for(int i=1;i<=n;i++)
        f[i][j]=f[f[i][j-1]][j-1];
    }
    
    int lca(int a,int b)
    {
        if(deep[a]<deep[b]) swap(a,b);
        int t=deep[a]-deep[b];
        for(int i=0;i<=25;i++) 
        if(t&(1<<i)) a=f[a][i];
        if(a==b) return a;
        for(int i=25;i>=0;i--)
        {
            if(f[a][i]!=f[b][i]) 
            a=f[a][i],b=f[b][i];
        }return f[a][0];
    }
    
    void solve1(int x,int L,int k)
    {
        cnt=0;
        while(x!=L)
        {
            tmp1[++cnt]=sum[x]-sum[f[x][0]];
            x=f[x][0];
        }
    }
    void solve2(int y,int L,int k)
    {
        num=0;
        while(y!=L)
        {
            tmp2[++num]=sum[y]-sum[f[y][0]];
            y=f[y][0];
        }
    } 
    
    int main()
    {
        //freopen("data.txt", "r", stdin);
        //freopen("2.out", "w", stdout);
        freopen("maze.in","r",stdin);
        freopen("maze.out","w",stdout);
        //freopen("ly.in","r",stdin);
        //freopen("ly.out","w",stdout);
        int x,y,z;
        n=read();
        for(int i=1;i<n;i++)
        {
            x=read();y=read();z=read();
            add(x,y,z);add(y,x,z);
        }
        dfs(1,1,1);get();
        m=read();
        for(int i=1;i<=m;i++)
        {
            x=read();y=read();z=read();
            int L=lca(x,y);
            memset(tmp1,0,sizeof tmp1);
            memset(tmp2,0,sizeof tmp2);
            solve1(x,L,z);
            solve2(y,L,z);reverse(tmp2+1,tmp2+num+1);
            ans=0;res=0;
            if(cnt)
            for(int i=1;i<=cnt;i++)
            {
                if(tmp1[i]<=res) res-=tmp1[i];
                else res=z,res-=tmp1[i],ans++;
            }
            if(num) 
            for(int i=1;i<=num;i++)
            {
                if(tmp2[i]<=res) res-=tmp2[i];
                else res=z,res-=tmp2[i],ans++;
            }
            printf("%d
    ",ans);
        }
        fclose(stdin);fclose(stdout);
        return 0;
    }
    35暴力
    /*
    LCA,压位
    算 LCA 是显然的, 由于两个点之间可能要走很多步, 所以我们预处理每一个点往上连续
    走六步会出现的各种情况,便能控制常数,从而在 8 秒内出解。由于边权只有两种,所以一
    个点往上走六步遇到的边权只有 2^6 = 64 种情况
    */
    #include <cstdio>
    #include <cstring>
    #define E 50010
    #define F 100010
    using namespace std;
    
    int n, m, head[E], to[F], next[F], value[F], cnt = 0, cost = 0, costa = 0;
    
    void Read(int &x)
    {
        char ch = getchar();
        x = 0;
        while (ch < '0' || ch > '9') ch = getchar();
        while (ch >= '0' && ch <= '9')
        {
            x = x * 10 + ch - '0';
            ch = getchar();
        }
    }
    
    void add(int x, int y, int z)
    {
        to[++cnt] = y; value[cnt] = z; next[cnt] = head[x]; head[x] = cnt;
    }
    
    int fa[E][20], dep[E], dist[E][7], type[E], jky[E][300], dd[E], jump[E];
    short czy[1<<8][300][300][2];
    
    void dfs(int u, int f, int d)
    {
        fa[u][0] = f;
        dep[u] = d;
        for (int j = head[u]; j; j = next[j])
        {
            int v = to[j];
            if (v == f) continue;
            dist[v][0] = value[j];
            dfs(v, u, d+1);
        }
    }
    
    void build()
    {
        for (int k = 1; k < 20; k++)
            for (int u = 1; u <= n; u++)
            {
                fa[u][k] = fa[fa[u][k-1]][k-1];
                if (k <= 5) dist[u][k] = dist[u][k-1] + dist[fa[u][k-1]][k-1];
            }
        
        for (int i = 1; i <= n; i++)
            if (dep[i] >= 6) dd[i] = dist[i][2] + dist[fa[i][2]][1];
            
        for (int i = 1; i <= n; i++)
        {
            if (dep[i] < 6) continue;
            int t = 0, u = i;
            for (int j = 0; j < 6; j++)
            {
                if (dist[u][0] == cost) t += 1 << j;
                u = fa[u][0];
            }
            jump[i] = u;
            type[i] = t;
        }
    
        for (int j = 0; j < (1<<6); j++)
            for (int k = cost; k <= cost * 6; k++)
                for (int rest = 0; rest <= k; rest++)
                {
                    int path = j, step = 0, re = rest;
                    for (int t = 1; t <= 6; t++)
                    {
                        int co;
                        if (path & 1) co = cost; else co = costa;
                        if (re < co) re = k, step++;
                        re -= co;
                        path >>= 1;
                    }
                    czy[j][k][rest][0] = step;
                    czy[j][k][rest][1] = re;
                }
            
        for (int i = 1; i <= n; i++)
        {
            int u = i, rest = 0;
            for (int j = 0; j < dd[i]; j++)
            {
                if (dep[u] > 0 && rest >= dist[u][0])
                {
                    rest -= dist[u][0];
                    u = fa[u][0];
                }
                jky[i][j] = u;
                rest++;
            }
        }
    }
    
    void swap(int& x, int& y)
    {
        int t = x; x = y; y = t;
    }
    
    
    int get(int x, int y)
    {
        if (dep[x] < dep[y]) swap(x, y);
        for (int k = 19; k >= 0; k--)
            if (dep[fa[x][k]] >= dep[y]) x = fa[x][k];
            
        if (x == y) return x;
        
        for (int k = 19; k >= 0; k--)
            if (fa[x][k] != fa[y][k]) x = fa[x][k], y = fa[y][k];
        if (x != y) x = fa[x][0];
        
        return x; 
    }
    
    struct hyd
    {
        int step, rest;
    };
    
    
    inline hyd work(int u, int f, int k)
    {
        int step = 0, rest = 0;
        
        if (k <= cost * 6)
            while (dep[u] > dep[f])
            {
                if (dep[u] - dep[f] < 6)
                {
                    if (rest >= dist[u][0]) rest -= dist[u][0];
                        else step++, rest = k - dist[u][0];
                    u = fa[u][0];
                    continue;
                }
            
                step += czy[type[u]][k][rest][0];
                rest = czy[type[u]][k][rest][1];
                u = jump[u];
    
            }
        
        else
            while (dep[u] > dep[f])
            {
                if (rest == 0) step++, rest = k;
                
                if (dep[u] - dep[f] < 6)
                {
                    if (rest >= dist[u][0]) rest -= dist[u][0];
                        else step++, rest = k - dist[u][0];
                    u = fa[u][0];
                    continue;
                }
                
                if (rest >= dd[u])
                {
                    rest -= dd[u];
                    u = jump[u];
                    continue;
                }
            
                u = jky[u][rest], rest = 0;
            }
        
        return (hyd) {step, rest};
    }
    
    int main()
    {
        freopen("data.txt", "r", stdin);
        freopen("1.out", "w", stdout);
        
        Read(n);
        memset(head, 0, sizeof(head));
        
        for (int i = 1; i < n; i++)
        {
            int x, y, z;
            Read(x), Read(y), Read(z);
            add(x, y, z);
            add(y, x, z);
            if (cost < z) cost = z;
            if (i == 1) costa = z; else if (costa > z) costa = z;
        }
        
        memset(fa, 0, sizeof(fa));
        memset(dep, 0, sizeof(dep));
        memset(dist, 0, sizeof(dist));
        
        dfs(1, 0, 0);
            
        build();
        
        Read(m);
        for (int i = 1; i <= m; i++)
        {
            int x, y, k;
            Read(x), Read(y), Read(k);
            int f = get(x, y);
            
            hyd ans1 = work(x, f, k), ans2 = work(y, f, k);
            int ans = ans1.step + ans2.step;
            ans -= (ans1.rest + ans2.rest) / k;
            
            printf("%d
    ", ans);
        }
        
        fclose(stdin); fclose(stdout);
        
        return 0;
    }
  • 相关阅读:
    选择学习Web前端开发的理由
    在Nginx下部署SSL证书并重定向至HTTPS
    使用pm2快速将项目部署到远程服务器
    DNS域名解析过程
    HTML5新特性总结
    基于 HTML5 Canvas 的智能安防 SCADA 巡逻模块
    react中使用css的7种方式
    原生JS实现滑动轮播图
    H5与企业微信jssdk集成
    img图片不存在显示默认图
  • 原文地址:https://www.cnblogs.com/L-Memory/p/9799878.html
Copyright © 2011-2022 走看看