zoukankan      html  css  js  c++  java
  • Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)E(多重集维护)

    #define HAVE_STRUCT_TIMESPEC
    #include<bits/stdc++.h>
    using namespace std;
    long long ans[1000007];
    vector<pair<int,int> >add[1000007],remv[1000007];
    multiset<int>s[1000007];//也可以用deque,rmq等数据结构实现,多重集自带排序
    int main(){
    int n,w;
    cin>>n>>w;
    for(int i=1;i<=n;i++){
    int cnt;
    cin>>cnt;
    for(int j=1;j<=cnt;j++){
    int x;
    cin>>x;
    add[j].push_back({x,i});//按列分类,起点
    remv[w-cnt+j].push_back({x,i});//终点
    }
    if(cnt<w){
    add[1].push_back({0,i});//如果把这一行移动到最右端,左端用0填充,起点为1,终点为w-cnt
    remv[w-cnt].push_back({0,i});
    add[cnt+1].push_back({0,i});//如果把这一行移动到最左端,右端用0填充,起点为cnt+1,终点为w
    remv[w].push_back({0,i});
    }
    }
    for(int j=1;j<=w;j++){
    for(auto v:add[j]){
    int idx=v.second,val=v.first;
    cout<<val<<" "<<idx;
    ans[j]-=s[idx].empty()?0:*s[idx].rbegin();
    s[idx].insert(val);
    ans[j]+=*s[idx].rbegin();
    }
    if(j<w){
    ans[j+1]=ans[j];
    for(auto v:remv[j]){//remv[j]表示这些数对第j列有贡献,对j+1列就没有贡献了,所以统计第j+1列的最大值时,需要将这些数移除。
    int idx=v.second,val=v.first;
    ans[j+1]-=*s[idx].rbegin();
    s[idx].erase(s[idx].find(val));
    ans[j+1]+=s[idx].empty()?0:*s[idx].rbegin();
    }
    }
    }
    for(int i=1;i<=w;i++)
    cout<<ans[i]<<" ";
    return 0;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    超级变态之access查询
    计算机安全病毒问题汇集(转自华军)
    Avast I Love You
    Windows2003 3389端口修改
    希捷 250G 7200.10 8M(串口/5年盒)(买硬盘了~~~)
    DataTable 中Remove方法的使用
    我的主板(p5pl2e)
    冼东妹(为奥运冠军名字作诗)
    李彦宏告诫年轻人:向前看两年
    郭文珺(为奥运冠军名字作诗)
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11454424.html
Copyright © 2011-2022 走看看