Submission #1178523

#TimeUsernameProblemLanguageResultExecution timeMemory
11785238pete8Naan (JOI19_naan)C++20
0 / 100
1 ms840 KiB
#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); 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:44:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   44 |         void operator-=(fraction &o){
      |                                    ^
naan.cpp:55:36: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   55 |         void operator+=(fraction &o){
      |                                    ^
naan.cpp:66:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   66 |         fraction operator+(fraction &o){
      |                                       ^
naan.cpp:73:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   73 |         fraction operator-(fraction &o){
      |                                       ^
naan.cpp:80:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   80 |         fraction operator/(fraction &o){
      |                                       ^
naan.cpp:89:39: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   89 |         fraction operator*(fraction &o){
      |                                       ^
naan.cpp:98:29: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
   98 |         int cmp(fraction &y)const{
      |                             ^~~~~
naan.cpp:103:37: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  103 |         bool operator<=(fraction &o)const{return cmp(o)<=0;}
      |                                     ^~~~~
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:113:14: warning: bad option '-funroll-lopps' to attribute 'optimize' [-Wattributes]
  113 | 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...