省赛选拔

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

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

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

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

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

改变的只能是未来

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 (强连通分量)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值