2017-10-19离线赛总结

失分小结:
估分:250
实际分数:145
这次又翻水水,本以为这次可以考的不错
结果第一题就wa了(字符串多输出了一位类似于空格的东西,看不见。。。)
第二题神判数据范围,切少了10分
第三题没什么时间,丢上去一个最无脑的暴力,还多水了5分

题解:
第二题这种贪心题目,就是推一推 然后大胆地猜想 再拿暴力对拍
所以一定要先打暴力!
第三题
这种在轴上单向移动的题目,都可归结到倍增上 虽然考试时只顾着打暴力,屁都没想到
因为A和B的顺序是固定的 这么水的题,条件都那么显然
那么就把AB都走一步记为一步
走完这后在判断A能不能再走一步
这样解决的复杂度就为 mlogn
由于n<=100000
预处理复杂度不能在 n2 级上
解法有很多 (后缀BIT,权值线段树,链表,multiset)虽然我只写了一种 复杂度都为 nlogn

代码实现:

#include<cstdio>
#include<algorithm>
#include<set>
using namespace std;
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define ll long long
#define INF 1000000000000
#define M 100005
#define S 20 
inline ll Abs(ll x){return x>0?x:-x;}
ll H[M];
int fa[S][M];
struct node{
    int id;ll v;
    bool operator <(const node &_)const{return v<_.v;}
}A[M],B[M];
struct node1{ll a,b;}len[S][M];
multiset<node>mt;
multiset<node>::iterator it;
int n,m;
void init(){
    mt.insert((node){0,-INF});
    mt.insert((node){0,-INF});
    mt.insert((node){0,INF});
    mt.insert((node){0,INF});
    node tmp[4];
    DOR(i,n,1){
        mt.insert((node){i,H[i]});
        it=mt.find((node){i,H[i]});
        tmp[2]=*(++it);tmp[2].v=Abs(tmp[2].v-H[i]);
        tmp[3]=*(++it);tmp[3].v=Abs(tmp[3].v-H[i]);
        --it;--it;
        tmp[0]=*(--it);tmp[0].v=Abs(H[i]-tmp[0].v);
        tmp[1]=*(--it);tmp[1].v=Abs(H[i]-tmp[1].v);
        stable_sort(tmp,tmp+4);
        A[i]=tmp[1];
        B[i]=tmp[0];
        fa[0][i]=B[tmp[1].id].id;
        len[0][i].a=tmp[1].v;
        len[0][i].b=B[tmp[1].id].v;
    }
    FOR(i,1,S-1)FOR(j,1,n){
        fa[i][j]=fa[i-1][fa[i-1][j]];
        len[i][j].a=len[i-1][j].a+len[i-1][fa[i-1][j]].a;
        len[i][j].b=len[i-1][j].b+len[i-1][fa[i-1][j]].b;
    }
}
node1 solve(int now,int mx){
    ll a=0,b=0;
    DOR(i,S-1,0)
        if(fa[i][now]!=0&&len[i][now].a+len[i][now].b+a+b<=mx){
            a+=len[i][now].a;
            b+=len[i][now].b;
            now=fa[i][now];
        }
    if(A[now].id!=0&&A[now].v+a+b<=mx){
        a+=A[now].v;
    }
    return (node1){a,b};
}
int main(){
    scanf("%d",&n);
    FOR(i,1,n)scanf("%lld",&H[i]);
    init();

    ll mx;
    scanf("%lld%d",&mx,&m);
    int ans=0;
    double d=-1;
    FOR(i,1,n){
        node1 x=solve(i,mx);
        ll a=x.a,b=x.b;
        if(a==0||b==0){
            if(d==-1&&H[i]>H[ans])ans=i;
        }
        else {
            double res=1.0*a/b;
            if((res<d||d==-1)||(d==res&&H[i]>H[ans]))d=res,ans=i;
        }
    }
    printf("%d\n",ans);
    FOR(i,1,m){
        int now;
        scanf("%d%lld",&now,&mx);
        node1 x=solve(now,mx);
        printf("%lld %lld\n",x.a,x.b);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值