ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF56E Domino Principle(BIT+dp)

2020-08-23 23:04:09  阅读:253  来源: 互联网

标签:cnt end int Domino begin pos num CF56E dp


显然,我们先按x排序,之后其实很容易发现答案就是从后往前遍历在i后面每个满足距离条件的j的答案再加上之间的距离,

也就是f[j]+j-i,如果枚举二维,那么就会超时,我们发现这个其实就是取max,可以用线段树维护,但是我们进一步发现,对于i和i之前的,目前还没有算出来,因此直接使用树状数组也可以维护

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pll;
typedef pair<int,pll> plll;
const int N=2e5+10;
struct node{
    ll cnt;
    ll h;
    int id;
}s[N];
ll ans[N];
int tr[N];
int f[N];
vector<int> num;
bool cmp(node a,node b){
    return a.cnt<b.cnt;
}
int lowbit(int x){
    return x&-x;
}
void add(int x,int c){
    int i;
    for(i=x;i<N;i+=lowbit(i)){
        tr[i]=max(tr[i],c);
    }
}
int sum(int x){
    int ans=0;
    for(int i=x;i;i-=lowbit(i)){
        ans=max(ans,tr[i]);
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++){
        cin>>s[i].cnt>>s[i].h;
        s[i].id=i;
        num.push_back(s[i].cnt);
    }
    sort(s+1,s+1+n,cmp);
    sort(num.begin(),num.end());
    num.erase(unique(num.begin(),num.end()),num.end());
    for(i=n;i>=1;i--){
        int pos;
        pos=upper_bound(num.begin(),num.end(),s[i].cnt+s[i].h-1)-num.begin();
        f[i]=max(sum(pos)-i,1);
        ans[s[i].id]=f[i];
        pos=lower_bound(num.begin(),num.end(),s[i].cnt)-num.begin()+1;
        add(pos,f[i]+i);
    }
    for(i=1;i<=n;i++)
        cout<<ans[i]<<" ";
    cout<<endl;
    return 0;
}
View Code

 

标签:cnt,end,int,Domino,begin,pos,num,CF56E,dp
来源: https://www.cnblogs.com/ctyakwf/p/13551251.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有