zoukankan      html  css  js  c++  java
  • Agc011_F Train Service Planning

    先放题面,再放LHX巨佬题解

    接着就是%%%、$orz、Oro、Or2、Otz、OTL、sto、rzo、Jto$、On_、○| ̄|_啊

    模拟赛里直接把这道题刚掉了

    一题升天·爆踩全场

    这题思维跨越度已经超越了我的想象,读题都要好一会才读明白,没有任何代码难点,甚至没有多少细节,但就是对思维能力的考验特别深,我也不写题解了,就简单说说大体思路好了。

    ·把题目中这一抽象的限制代数化。

    ·在模意义下推导式子,将问题转化。

    ·利用线段树优化$DP$解决

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #define LL long long
    #define M 200020
    #define mid ((l+r)>>1)
    using namespace std;
    LL read(){
    	LL nm=0,fh=1; char cw=getchar();
    	for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
    	for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
    	return nm*fh;
    }
    LL n,m,K,D[M],B[M],ans,now,L[M],R[M],S[M],T[M<<2],p[M<<2],F[M];
    void pushdown(LL x){if(p[x]) p[x<<1]=p[x],p[x<<1|1]=p[x],p[x]=0;}
    LL query(LL x,LL l,LL r,LL pos){
    	if(l==r) return p[x]; pushdown(x);
    	if(pos<=mid) return query(x<<1,l,mid,pos);
    	else return query(x<<1|1,mid+1,r,pos);
    }
    void mdf(LL x,LL l,LL r,LL opl,LL opr,LL kd){
    	if(r<opl||opr<l||opr<opl) return;
    	if(opl<=l&&r<=opr){p[x]=kd;return;}
    	pushdown(x),mdf(x<<1,l,mid,opl,opr,kd);
    	mdf(x<<1|1,mid+1,r,opl,opr,kd);
    }
    int main(){
    	n=read(),K=read();
    	for(LL i=1;i<=n;i++) D[i]=read(),B[i]=read(),S[i]=S[i-1]+D[i];
    	for(LL i=1;i<=n;i++) if(B[i]==1&&K<(D[i]<<1)){puts("-1");return 0;}
    	for(LL i=1;i<=n;i++){
    		if(B[i]&1) L[i]=(-(S[i-1]<<1)%K+K)%K,R[i]=(-(S[i]<<1)%K+K)%K;
    		else L[i]=0,R[i]=K-1; T[++m]=L[i],T[++m]=R[i];
    	}
    	sort(T+1,T+m+1),m=unique(T+1,T+m+1)-T-1;
    	for(LL i=n;i>0;i--){
    		L[i]=lower_bound(T+1,T+m+1,L[i])-T;
    		R[i]=lower_bound(T+1,T+m+1,R[i])-T;
    		LL tag=query(1,1,m,L[i]);
    		if(tag) F[i]=F[tag]+((T[L[tag]]-T[L[i]])%K+K)%K;
    		if(L[i]<=R[i]) mdf(1,1,m,1,L[i]-1,i),mdf(1,1,m,R[i]+1,m,i);
    		else if(R[i]+1<L[i]) mdf(1,1,m,R[i]+1,L[i]-1,i);
    	} ans=F[1];
    	for(LL i=1;i<=m;i++){
    		LL now=query(1,1,m,i); if(!now){ans=0;break;}
    		ans=min(ans,F[now]+(((T[L[now]]-T[i])%K+K)%K));
    	}
    	printf("%lld
    ",ans+(S[n]<<1));
    }
    

      

  • 相关阅读:
    jquery 实现 html5 placeholder 兼容password密码框
    php返回json的结果
    使用PHP读取远程文件
    Sharepoint 自定义字段
    Sharepoint 中新增 aspx页面,并在页面中新增web part
    【转】Sharepoint 2010 配置我的站点及BLOG
    JS 实现 Div 向上浮动
    UserProfile同步配置
    【转】Import User Profile Photos from Active Directory into SharePoint 2010
    Sharepoint 2010 SP1升级后 FIMSynchronizationService 服务无法开启
  • 原文地址:https://www.cnblogs.com/OYJason/p/9648261.html
Copyright © 2011-2022 走看看