省赛选拔

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

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

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

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

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

改变的只能是未来

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值