#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f first
#define s second
#define pii pair<int,int>
#define ppii pair<int,pii>
#define vi vector<int>
#define pb push_back
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define F(n) for(int i=0;i<n;i++)
#define lb lower_bound
#define ub upper_bound
#define fastio ios::sync_with_stdio(false);cin.tie(NULL);
#pragma GCC optimize ("03,unroll-lopps")
#define sz(x) (int)((x).size())
#define int long long
using namespace std;
const int mod=1e9+7,mxn=2e3+10,inf=1e18,minf=-1e18,lg=20,Mxn=1e6;
//#undef int
int n,k,m,d,q;
void setIO(string name){
ios_base::sync_with_stdio(0); cin.tie(0);
freopen((name+".in").c_str(),"r",stdin);
freopen((name+".out").c_str(),"w",stdout);
}
int gcd2(int x,int y){
if(x<y)swap(x,y);
while(y){
x%=y;
swap(x,y);
}
return x;
}
struct fraction{
// A / B
int A=0,B=1;
void reduce(){
int x=gcd2(A,B);
if(x==0)return;
A/=x;
B/=x;
}
void operator-=(fraction &o){
if(o.B==B){
A-=o.A;
}
else{
A*=o.B;
A-=(o.A*B);
B*=o.B;
}
reduce();
}
void operator+=(fraction &o){
if(o.B==B){
A+=o.A;
}
else{
A*=o.B;
A+=(o.A*B);
B*=o.B;
}
reduce();
}
fraction operator+(fraction &o){
fraction x;
x.A=A;
x.B=B;
x+=o;
return x;
}
fraction operator-(fraction &o){
fraction x;
x.A=A;
x.B=B;
x-=o;
return x;
}
fraction operator/(fraction &o){
fraction x;
x.A=A;
x.B=B;
x.A*=o.B;
x.B*=o.A;
x.reduce();
return x;
}
fraction operator*(fraction &o){
fraction x;
x.A=A;
x.B=B;
x.A*=o.A;
x.B*=o.B;
x.reduce();
return x;
}
int cmp(fraction &y)const{
if(A*y.B<y.A*B)return -1;
else if(A*y.B>y.A*B)return 1;
return 0;
}
bool operator<=(fraction &o)const{return cmp(o)<=0;}
bool operator==(fraction &o)const{return cmp(o)==0;}
bool operator>=(fraction &o)const{return cmp(o)>=0;}
};
fraction v[mxn+10][mxn+10];
fraction o[mxn+10][mxn+10];
fraction need[mxn+10];
fraction sum[mxn+10];
int P[mxn+10];
int dead[mxn+10];
int32_t main(){
fastio
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>v[i][j].A;
o[i][j].A=v[i][j].A;
need[i].A+=v[i][j].A;
}
P[i]=1;
need[i].B=n;
}
vector<int>ord;
int last=0;
fraction L;
int cur=1;
vector<pii>ans;
for(int k=0;k<n;k++){
pair<pair<int,fraction>,int>choose;
choose.f.f=inf;
choose.s=inf;
for(int i=1;i<=n;i++){
if(dead[i])continue;
while(P[i]<=m&&sum[i]+v[i][P[i]]<=need[i]){
sum[i]+=v[i][P[i]];
P[i]++;
}
fraction x=need[i]-sum[i];
if(P[i]==m+1&&x.A){
cout<<-1;
return 0;
}
x=(x/o[i][P[i]]);
//x = ratio of taken P[i]
//we take everything til P[i]-1
//when we take something completely we update del->take O(L*N)
//else we take parts of it only happen once per k take O(N) to update
if(P[i]<choose.f.f)choose={{P[i],x},i};
else if(P[i]==choose.f.f&&x<=choose.f.s)choose={{P[i],x},i};
}
if(k==n-1)break;
fraction x=choose.f.s;
while(cur<choose.f.f){
for(int i=1;i<=n;i++){
if(P[i]>cur)sum[i]-=v[i][cur];
v[i][cur].A=0;
}
cur++;
}
for(int i=1;i<=n;i++){
fraction sub=(x*o[i][cur]);
if(P[i]>cur)sum[i]-=sub;
v[i][cur]-=sub;
}
//1+1/15
if(choose.f.f>last){
last=choose.f.f;
L=x;
}
else if(choose.f.f==last)L+=x;
ans.pb({(last-1)*L.B+L.A,L.B});
ord.pb(choose.s);
dead[choose.s]=1;
}
for(auto i:ans)cout<<i.f<<" "<<i.s<<'\n';
for(int i=1;i<=n;i++)if(!dead[i])ord.pb(i);
for(auto i:ord)cout<<i<<" ";
}
/*
*/
Compilation message (stderr)
naan.cpp:16:40: warning: bad option '-funroll-lopps' to pragma 'optimize' [-Wpragmas]
16 | #pragma GCC optimize ("03,unroll-lopps")
| ^
naan.cpp:23:23: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
23 | void setIO(string name){
| ^
naan.cpp:28:21: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
28 | int gcd2(int x,int y){
| ^
naan.cpp:39:21: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
39 | void reduce(){
| ^
naan.cpp:45:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
45 | void operator-=(fraction &o){
| ^
naan.cpp:56:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
56 | void operator+=(fraction &o){
| ^
naan.cpp:67:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
67 | fraction operator+(fraction &o){
| ^
naan.cpp:74:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
74 | fraction operator-(fraction &o){
| ^
naan.cpp:81:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
81 | fraction operator/(fraction &o){
| ^
naan.cpp:90:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
90 | fraction operator*(fraction &o){
| ^
naan.cpp:99:29: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
99 | int cmp(fraction &y)const{
| ^~~~~
naan.cpp:104:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
104 | bool operator<=(fraction &o)const{return cmp(o)<=0;}
| ^~~~~
naan.cpp:105:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
105 | bool operator==(fraction &o)const{return cmp(o)==0;}
| ^~~~~
naan.cpp:106:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
106 | bool operator>=(fraction &o)const{return cmp(o)>=0;}
| ^~~~~
naan.cpp:114:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
114 | int32_t main(){
| ^
naan.cpp: In function 'void setIO(std::string)':
naan.cpp:25:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
25 | freopen((name+".in").c_str(),"r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
naan.cpp:26:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
26 | freopen((name+".out").c_str(),"w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |