QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#514426#7744. ElevatorHJRWA 29ms5516kbC++232.0kb2024-08-11 01:28:172024-08-11 01:28:17

Judging History

你现在查看的是最新测评结果

  • [2024-08-11 01:28:17]
  • 评测
  • 测评结果:WA
  • 用时:29ms
  • 内存:5516kb
  • [2024-08-11 01:28:17]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define endl "\n"
#define debug(x) cout<<#x<<": "<<x<<endl
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll=long long;
using ull=unsigned long long;
#define int long long
struct node
{
    int c,w,f;
    bool operator<(const node&t)const{
        return f>t.f;
    }
};
void solve(){
    int n,k;
    cin>>n>>k;
    vector<node> a(n);
    for(int i=0;i<n;i++)
        cin>>a[i].c>>a[i].w>>a[i].f;
    sort(a.begin(),a.end());
    vector<int> st;
    for(int i=0;i<n;i++){
        if(a[i].w==1)
            st.push_back(i);
    }
    reverse(st.begin(),st.end());
    int ans=0,cm=0;
    int cur=0;
    for(int i=0;i<n;i++){
        if(!st.empty()&&i==st.back())
            st.pop_back();
        cm=max(cm,a[i].f);
        if(cur+a[i].w*a[i].c<k){
            cur+=a[i].w*a[i].c;
        }
        else if(cur+a[i].w*a[i].c==k){
            ans+=cm;
            cur=0;
            cm=0;
        }
        else{
            int lf=k-cur;
            if(lf%a[i].w){
                if(!st.empty()){
                    int del=st.back();
                    a[del].c--;
                    if(a[del].c==0){
                        st.pop_back();
                    }
                }
                ans+=cm;
                cm=a[i].f;
                a[i].c-=lf/a[i].w;
            }
            else{
                ans+=cm;
                cm=a[i].f;
                a[i].c-=lf/a[i].w;
            }
            cur=0;
            if(a[i].c*a[i].w>=k){
                int tran=(a[i].c*a[i].w)/k;
                int pre=k/a[i].w;
                ans+=a[i].f*tran;
                a[i].c-=tran*pre;
            }
            i--;
        }
    }
    if(cur){
        ans+=cm;
    }
    cout<<ans<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cout.tie(0);
    cin.tie(0);
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}
/*
贡献法
正难则反
数小状压
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3596kb

input:

2
4 6
1 1 8
7 2 5
1 1 7
3 2 6
8 1200000
100000 1 100000
100000 1 12345
100000 2 100000
100000 2 12345
100000 1 100000
100000 1 12345
100000 2 100000
100000 2 12345

output:

24
100000

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 29ms
memory: 5516kb

input:

5501
8 104
5 2 3
6 2 4
5 2 3
6 2 9
8 2 4
2 1 3
7 2 4
8 2 8
1 290
3 1 1
12 12
6 1 2
1 2 2
1 1 2
1 2 4
6 1 1
1 2 5
6 1 4
4 1 4
6 2 4
6 2 5
4 2 5
4 1 4
5 334
1 1 4
1 2 3
4 2 1
5 1 1
2 1 2
13 218
5 2 3
5 1 4
1 2 1
1 2 5
3 2 2
1 1 3
4 2 2
1 2 5
2 2 1
2 1 5
3 2 1
5 2 1
1 1 4
10 260
7 2 1
5 1 1
5 2 4
6 1 6...

output:

9
1
23
4
5
7
1
3
9
6
1
10
4
9
17
6
4
1
8
5
5
7
1
3
23
6
3
3
2
2
2
3
8
1
5
6
9
11
152
7
10
2
7
7
8
6
5
5
1
7
3
5
10
7
7
10
8
1
4
2
3
9
1
5
2
9
1
6
7
7
6
10
18
8
10
4
10
9
2
8
3
5
9
3
6
5
3
2
6
1
3
2
2
1
6
9
6
3
4
8
9
9
2
6
1
2
6
7
5
2
5
21
8
1
2
3
4
9
3
4
6
5
9
6
1
7
3
7
3
2
2
8
7
3
5
9
7
10
7
3
2
4
...

result:

wrong answer 39th lines differ - expected: '147', found: '152'