省赛选拔

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36651153/article/details/80034005

今天是第一天,做的很不理想

也想明白一个道理:大抵是你是一个什么样的人,就会遇到什么样的人

之前也一直纠结队友 的问题,现在看来也就是上述道理

过去的时间不在纠结,只是有点后悔罢了,但没有退路,还有半年多,必须要加油了

无论如何,今天的境地是一步一步影响导致这样的

改变的只能是未来

2018.4.21 第一次选拔赛的题目

hdu 4864 (贪心)

poj 3928 (树状数组)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[20005],c[20005],d[20005];
int bit[100005];
int lowbit(int x)
{
    return x&(-x);
}
int sum(int i)
{
    int s=0;
    while(i>0) {
        s+=bit[i];
        i-=lowbit(i);
    }
    return s;
}
void Add(int i)
{
    while(i<=100000) {
        bit[i]+=1;
        i+=lowbit(i);
    }
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--) {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        memset(bit,0,sizeof(bit));
        for(int i=1;i<=n;i++) {
            c[i]=sum(a[i]-1);
            Add(a[i]);
        }
        memset(bit,0,sizeof(bit));
        for(int i=n;i>=1;i--) {
            d[i]=sum(a[i]-1);
            Add(a[i]);
        }
        long long ans=0;
        for(int i=2;i<n;i++) {
            ans+=c[i]*(n-i-d[i])+(i-1-c[i])*d[i];
        }
        printf("%lld\n",ans);
    }
}

hdu 4366 (分块,线段树)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=50020;
int ha[1000020],ma[maxn*4],pre,cnt,s[maxn],e[maxn],ans[maxn],k,t,n,m;
struct Node
{
    int L,A,num;
}S[maxn];
vector<int> v[maxn];
void dfs(int i)
{
    s[i]=++cnt;
    for(int j=0;j<v[i].size();j++) {
        dfs(v[i][j]);
    }
    e[i]=cnt;
}
void Build(int o,int l,int r)
{
    ma[o]=-1;
    if(l==r) {
        return ;
    }
    int mid=l+r>>1;
    Build(o<<1,l,mid);
    Build(o<<1|1,mid+1,r);
}
bool cmp(Node a,Node b)
{
    return a.A>b.A;
}
void Update(int o,int l,int r,int v,int x)
{
    if(l==r) {
        ma[o]=v; return ;
    }
    int mid=l+r>>1;
    if(x<=mid) {
        Update(o<<1,l,mid,v,x);
    }
    else{
        Update(o<<1|1,mid+1,r,v,x);
    }
    ma[o]=max(ma[o<<1],ma[o<<1|1]);
}
int Query(int o,int l,int r,int x,int y)
{
    if(x>y) {
        return -1;
    }
    int ans=-1;
    if(x<=l&&r<=y) {
        return ma[o];
    }
    int mid=l+r>>1;
    if(x<=mid) {
        ans=max(ans,Query(o<<1,l,mid,x,y));
    }
    if(y>mid) {
        ans=max(ans,Query(o<<1|1,mid+1,r,x,y));
    }
    return ans;
}
int main()
{
    scanf("%d",&t);
    while(t-- ){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++) {
            v[i].clear();
        }
        for(int i=1;i<n;i++) {
            scanf("%d%d%d",&pre,&S[i].L,&S[i].A);
            v[pre].push_back(i);
            ha[S[i].L]=i; S[i].num=i;
        }
        cnt=0;
        dfs(0);
        Build(1,1,n-1);
        sort(S+1,S+n,cmp);
        int i=1,j;
        while(i<n) {
            j=i;
            while(j<n&&S[i].A==S[j].A) {
                k=Query(1,1,n-1,s[S[j].num],e[S[j].num]-1);
                if(k==-1) {
                    ans[S[j].num]=-1;
                }
                else{
                    ans[S[j].num]=ha[k];
                }
                j++;
            }
            j=i;
            while(j<n&&S[i].A==S[j].A) {
                Update(1,1,n-1,S[j].L,s[S[j].num]-1);
                j++;
            }
            i=j;
        }
        while(m--) {
            scanf("%d",&k);
            printf("%d\n",ans[k]);
        }
    }
}

hdu 4705 (树形Dp,dfs)

poj 1651 (区间Dp)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a[155],dp[155][155];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    memset(dp,0,sizeof(dp));
    for(int p=2;p<=n;p++) {
        for(int i=1;i<=n-p;i++) {
            int j=i+p;
            dp[i][j]=1e9;
            for(int k=i+1;k<j;k++) {
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+a[i]*a[k]*a[j]);
            }
        }
    }
    printf("%d\n",dp[1][n]);
}

hdu 4355 (三分)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
double ans;
double x[50005];
double w[50005];
int n;
double cal(double D)
{
    double d=0;
    for(int i=0;i<n;i++) {
        double dd=fabs(D-x[i]);
        d+=dd*dd*dd*w[i];
    }
    ans=min(ans,d);
    return d;
}
int main()
{
    int t;
    scanf("%d",&t);
    int Case=0;
    while(t--) {
        Case++;
        scanf("%d",&n);
        double l=1e9,r=-1;
        for(int i=0;i<n;i++) {
            scanf("%lf%lf",&x[i],&w[i]);
            l=min(l,x[i]); r=max(r,x[i]);
        }
        ans=1e18;
        for(int i=0;i<100;i++) {
            double m=(2*l+r)/3,mm=(2*r+l)/3;
            if(cal(m)>=cal(mm)) l=m;
            else r=mm;
        }
        printf("Case #%d: %.0f\n",Case,ans);

    }
}

poj 3321  (树状数组)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=100005;
vector<int> V[maxn];
int n,u,v,m,s[maxn],e[maxn],cnt;
int bit[maxn];
int visit[maxn];
char ss[5];
void dfs(int p)
{
    s[p]=++cnt;
    for(int i=0;i<V[p].size();i++) {
        dfs(V[p][i]);
    }
    e[p]=cnt;
}
void add(int i,int x)
{
    while(i<=n) {
        bit[i]+=x;
        i+= i&-i;
    }
}
int sum(int i)
{
    int s=0;
    while(i>0) {
        s+=bit[i];
        i-=i&-i;
    }
    return s;
}
int main()
{
    while(~scanf("%d",&n)){
        memset(bit,0,sizeof(bit));
        for(int i=1;i<=n;i++) {
            add(i,1);
            visit[i]=1;
            V[i].clear();
        }
        for(int i=1;i<n;i++) {
            scanf("%d%d",&u,&v);
            V[u].push_back(v);

        }
        cnt=0;
        dfs(1);
        scanf("%d",&m);
        for(int i=0;i<m;i++) {
            scanf("%s%d",ss,&u);
            if(ss[0]=='Q') {
                printf("%d\n",sum(e[u])-sum(s[u]-1));
            }
            else{
                if(visit[u]==1) {
                    visit[u]=0; add(s[u],-1);
                }
                else{
                    visit[u]=1; add(s[u],1);
                }
            }
        }
    }


}

poj 2699  (最大流)

hdu 5943   (二分图匹配)

hdu 3966   (树剖)

-----------------------------------2018 4.22 第二次选拔赛的题目 --------------------------------

hdu 5971  (二分或并查集)

hdu 3183 (rmq)

poj 2247

hdu 4336 (概率dp)

poj 2411 (状压dp)

poj 3735 (矩阵快速幂)

poj 3680 (最小费用最大流)

poj 3666  (DP)

hdu 4130   (贪心)

hdu 5934 (强连通分量)

猜你喜欢

转载自blog.csdn.net/qq_36651153/article/details/80034005
今日推荐