QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#789856#8936. Team ArrangementBaseAI#WA 0ms3524kbC++232.5kb2024-11-27 22:17:452024-11-27 22:17:45

Judging History

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

  • [2024-11-27 22:17:45]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3524kb
  • [2024-11-27 22:17:45]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N = 67;
const int INF = 1e9;
int n;
int ans;
int w[N];
int num[N],numst[N];
bool vis[N];
vector<int> L[N];
int tot;
int sum[N]; //sum[x] l<=x 的个数
int suf[N]; //suf[x] r>=x 的个数
auto start = chrono::high_resolution_clock::now();
void Dfs(int rmn,int mx) {
    auto stop = chrono::high_resolution_clock::now();
    auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(stop - start).count();
    if(duration > 990) {
        cout << ans << "\n";
        exit(0);
    }
    if(n-rmn > sum[mx]) return ;    //已选的(l均小于等于x) 比线段多
    if(rmn > suf[mx]) return ;  //后选的(r均大于等于x) 比线段多
    if(rmn == 0) {
        //++tot;
        set<int> st;
        for(int i=1;i<=n;++i) numst[i] = 0;
        bool flag = 1;
        for(int i=1;i<=n;++i) {
            for(auto r : L[i]) {
                if(numst[r]==0)
                    st.insert(r);
                ++numst[r];
            }
            for(int j=0;j<num[i];++j) {
                auto it = st.lower_bound(i);
                if(it == st.end()) {
                    flag = 0; break;
                } else {
                    int y = *it;
                    if(!--numst[y]) st.erase(it);
                }
            }
            if(!flag) break;
        }
        if(flag) {
            int val = 0;
            for(int i=1;i<=n;++i) val += (num[i]/i)*w[i];
            ans = max(ans, val);
        }
        return ;
    }
    if(rmn-mx+1 <= 0) return ;
    vector<pair<int,int> > tmp(rmn-mx+1, make_pair(0, 0));
    for(int i=0;i<rmn-mx+1;++i) {
        tmp[i] = make_pair(-w[i+mx], i+mx);
    }
    sort(tmp.begin(), tmp.end());
    for(auto [w, i] : tmp) {
        num[i] += i;
        Dfs(rmn-i, i);
        num[i] -= i;
        if(rmn<=i*2)
        {
            num[rmn] += rmn;
            Dfs(0,rmn);
            num[rmn] -= rmn;
            break;
        }
    }
}
void solve() {
    cin >> n;
    for(int i=1;i<=n;++i) {
        int l, r;
        cin >> l >> r;
        L[l].push_back(r);
        sum[l]++;
        suf[r]++;
    }
    for(int i=1;i<=n;++i) sum[i] += sum[i-1];
    for(int i=n;i>=0;--i) suf[i] += suf[i+1];
    for(int i=1;i<=n;++i) cin >> w[i];
    ans = -INF;
    Dfs(n, 1);
    if(ans == -INF) cout << "impossible" << "\n";
    else cout << ans << "\n";

    // printf("tot = %d\n",tot);
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3524kb

input:

3
2 3
1 2
2 2
4 5 100

output:

impossible

result:

wrong answer 1st lines differ - expected: '9', found: 'impossible'