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;
    }

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    以太坊客户端geth的基本操作命令
    以太坊虚拟机介绍5-比较操作指令
    以太坊虚拟机介绍4-按位运算指令
    浏览器内核
    javascript 几个易错点记录
    jq常用方法
    jq事件操作汇总
    js事件总汇
    margin 负边距 的知识点
    子div撑不开父div的几种解决办法:
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11454424.html
Copyright © 2011-2022 走看看