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

    保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
  • 相关阅读:
    POJ3678 KATU PUZZLE
    poj3321(codevs1228)苹果树
    codevs 1955 光纤通信 USACO
    codevs 1027 姓名与ID
    codevs 1051 接龙游戏
    洛谷 P1717 钓鱼
    codevs 1062 路由选择
    洛谷 P1083 借教室
    codevs 2596 售货员的难题
    Vijos 1053 easy sssp
  • 原文地址:https://www.cnblogs.com/ldudxy/p/11454424.html
Copyright © 2011-2022 走看看