제출 #703969

#제출 시각아이디문제언어결과실행 시간메모리
703969victor_gaoNaan (JOI19_naan)C++17
100 / 100
678 ms130312 KiB
//#pragma GCC optimize("Ofast,unroll-loops,O3")
//#pragma GCC optimize("avx,avx2,sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,fma,tune=native")
#include<bits/stdc++.h>
//#include<bits/extc++.h>
//#pragma pack(1)
#define fast ios::sync_with_stdio(0); cin.tie(0);
#define ll long long
#define pii pair<ll,ll>
#define x first
#define y second
#define N 2015
using namespace std;
//using namespace __gnu_pbds;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//typedef tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update> order_multiset;
//typedef tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> order_set;
struct mixed{
    ll a,b,c; // a+b/c
    mixed(ll x,ll y,ll z):a(x),b(y),c(z){}
    void reset(){
        while (b<0){ a--; b+=c; }
        while (b>=c){ a++; b-=c; }
        if (b>0&&c>0){
            ll g=__gcd(b,c);
            b/=g; c/=g;
        }
    }
    void out(){
        cout<<a*c+b<<" "<<c<<'\n';
    }
};
ll n,l,total[N],arr[N][N];
bool vis[N];
vector<mixed>cut[N];
bool bigger(mixed x,mixed y){
    if (x.a!=y.a) return x.a>y.a;
    return x.b*y.c>=x.c*y.b;
}
signed main(){
    fast
    cin>>n>>l;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=l;j++){
            ll val; cin>>val;
            arr[i][j]=val*n;
            total[i]+=arr[i][j]/n;
        }
    }
    for (int i=1;i<=n;i++){
        ll now=0;
        for (int j=1;j<=l;j++){
            ll last=arr[i][j];
            while (now+last>=total[i]){
                last-=(total[i]-now);
                now=0;
                cut[i].push_back(mixed(j-1,arr[i][j]-last,arr[i][j]));
            }
            now+=last;
        }
        assert(cut[i].size()==n);
        for (int j=0;j<cut[i].size();j++)
            cut[i][j].reset();
    }
    vector<mixed>ans;
    vector<int>order;
    for (int i=1;i<=n;i++){
        mixed mn=mixed(1e9,0,1);
        int use=0;
        for (int j=1;j<=n;j++){
            if (!vis[j]&&bigger(mn,cut[j][i-1])){
                mn=cut[j][i-1];
                use=j;
            }
        }
        vis[use]=1;
        order.push_back(use);
        ans.push_back(mn);
    }
    ans.pop_back();
    for (auto i:ans)
        i.out();
    for (auto j:order)
        cout<<j<<" ";
    cout<<'\n';
}

컴파일 시 표준 에러 (stderr) 메시지

In file included from /usr/include/c++/10/cassert:44,
                 from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
                 from naan.cpp:3:
naan.cpp: In function 'int main()':
naan.cpp:60:29: warning: comparison of integer expressions of different signedness: 'std::vector<mixed>::size_type' {aka 'long unsigned int'} and 'long long int' [-Wsign-compare]
   60 |         assert(cut[i].size()==n);
      |                ~~~~~~~~~~~~~^~~
naan.cpp:61:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<mixed>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |         for (int j=0;j<cut[i].size();j++)
      |                      ~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...