제출 #533326

#제출 시각아이디문제언어결과실행 시간메모리
533326codr0Naan (JOI19_naan)C++14
100 / 100
455 ms116352 KiB
// Code by Parsa Eslami
 
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define bit(i,j) ((j>>i)&1)
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORR(i,a,b) for(int i=a;i>=b;i--)
#define S second
#define F first
#define pb push_back
#define SZ(x) (int)x.size()
#define all(x) x.begin(),x.end()
#define err(x) cout<<#x<<": "<<x<<'\n';
 
using namespace std;

	pii simp(pii X){
		return X;
		int gc=__gcd(X.F,X.S);
		X.S/=gc;
		X.F/=gc;
		return X;
	}

	pii sum(pii a,pii b){// a+b
		pii rt;
		int gc=1;
		if(a.S==b.S) gc=a.S;
		rt.S=a.S*(b.S/gc);
		rt.F=a.F*(b.S/gc)+b.F*(a.S/gc);
		return rt;
	}

	pii mul(pii a,pii b){// a*b
		pii rt;
		rt.F=a.F*b.F;
		rt.S=a.S*b.S;
		if(a.S%b.F==0){
			rt.F=a.F;
			rt.S=b.S*(a.S/b.F);
		}
		else if(b.S%a.F==0){
			rt.F=b.F;
			rt.S=a.S*(b.S/a.F);
		}
		return rt;
	}

	pii L(pii a,pii b){// a-b
		b.F=-b.F;
		return sum(a,b);
	}

	pii div(pii a,pii b){// a/b
		swap(b.F,b.S);
		return mul(a,b);
	}

	bool cmp(pii a,pii b){// a<=b
		int A=a.F/a.S;
		int B=b.F/b.S;
		if(A!=B) return (A<B);
		a.F-=A*a.S;
		b.F-=B*b.S;
		return (a.F*b.S<=a.S*b.F);
	}

	int32_t main(){
	ios_base::sync_with_stdio(0); cin.tie(0);

	int n,l; cin>>n>>l;
	int v[n+1][l+1];
	FOR(i,1,n) FOR(j,1,l) cin>>v[i][j];
	pii a[n][n];
	FOR(i,1,n){
		pii point={0,1};//
		pii S={0,1};//
		int ind=1;//
		int Sp=0;
		FOR(j,1,l) Sp+=v[i][j];
		pii targ={Sp,n};
		FOR(j,1,n-1){
			while(1){
				pii l=div(L(targ,S),{v[i][ind],1});
				if(cmp(sum(l,point),{1,1})){
					a[i][j]=sum({ind-1,1},sum(l,point));
					point=sum(l,point);
					S={0,1};
					if(point.F==point.S){
						ind++;
						point={0,1};
					}
					break;
				}else{
					S=sum(S,mul(L({1,1},point),{v[i][ind],1}));
					ind++; point={0,1};
				}
			}
		}
	}
	bool mark[n+1]={};
	int p[n+1]={};
	FOR(i,1,n-1){
		pair<pii,int> ans={{1e9,1},-1};
		FOR(j,1,n) if(!mark[j]){
			pair<pii,int> x0={a[j][i],j};
			if(ans.S==-1||cmp(x0.F,ans.F)) ans=x0;
		}
		mark[ans.S]=1;
		p[i]=ans.S;
		cout<<ans.F.F<<" "<<ans.F.S<<'\n';
	}
	FOR(i,1,n) if(!mark[i]) p[n]=i;
	FOR(i,1,n) cout<<p[i]<<" "; cout<<'\n';


	return 0;
	}

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

naan.cpp: In function 'int32_t main()':
naan.cpp:7:20: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
    7 | #define FOR(i,a,b) for(int i=a;i<=b;i++)
      |                    ^~~
naan.cpp:115:2: note: in expansion of macro 'FOR'
  115 |  FOR(i,1,n) cout<<p[i]<<" "; cout<<'\n';
      |  ^~~
naan.cpp:115:30: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  115 |  FOR(i,1,n) cout<<p[i]<<" "; cout<<'\n';
      |                              ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...