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

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    自我学习——javascript——基本技巧
    Edge Code CC卡死原因
    Django中ORM介绍和字段及字段参数
    Web框架本质及第一个Django实例
    Python连接MySQL数据库之pymysql模块使用
    Bootstrap框架
    jQuery快速入门
    前端基础之BOM和DOM
    前端基础之JavaScript
    前端基础之CSS
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11454424.html
Copyright © 2011-2022 走看看