Submission #1161840

#TimeUsernameProblemLanguageResultExecution timeMemory
1161840tosivanmakTable Tennis (JOI24_tabletennis)C++20
100 / 100
487 ms38164 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long // I love table tennis! ll ans[5005]; ll id[5005],od[5005]; void solve(){ ll n,k; cin>>n>>k; if(ans[n]<k){ cout<<"No\n"; return; } if(k==0){ cout<<"Yes\n"; for(int i=1;i<=n-1;i++){ for(int j=1;j<=i;j++){ cout<<"1"; } cout<<'\n'; } return; } cout<<"Yes\n"; ll indeg[n+2],outdeg[n+2]; bool edge[n+2][n+2]; for(int i=0;i<n+2;i++){ indeg[i]=outdeg[i]=0; } ll rn; for(int i=n;i>=2;i--){ if(ans[i]<k){rn=i+1; break;} } for(int i=1;i<=rn;i++){ if(i==1){ continue; } ll mx,mn; for(int j=1;j<i;j++){ if(j==1)mx=indeg[j],mn=indeg[j]; else mx=max(mx,indeg[j]),mn=min(mn,indeg[j]); } if(mx==mn){ for(int j=1;j<=(i-1)/2;j++){indeg[j]++,outdeg[i]++; edge[i][j]=1; edge[j][i]=0;} for(int j=(i-1)/2+1;j<i;j++){outdeg[j]++,indeg[i]++; edge[j][i]=1; edge[i][j]=0;} } else{ for(int j=1;j<i;j++){ if(indeg[j]==mn){indeg[j]++,outdeg[i]++; edge[i][j]=1; edge[j][i]=0;} else{indeg[i]++,outdeg[j]++; edge[j][i]=1; edge[i][j]=0;} } } } set<ll>st; vector<ll>degs[n+5]; for(int i=1;i<=rn;i++){ // cout<<id[i]<<" "; degs[indeg[i]].push_back(i); } for(int i=1;i<=rn;i++){ if(degs[i].size()>=2){ st.insert(i); } } ll diff=ans[rn]-k; for(int i=1;i<=diff;i++){ ll lol=*st.begin(); ll cur1=degs[lol][degs[lol].size()-1]; degs[lol].pop_back(); ll cur2=degs[lol][degs[lol].size()-1]; degs[lol].pop_back(); if(degs[lol].size()<2){ st.erase(st.find(lol)); } if(edge[cur1][cur2]){ edge[cur1][cur2]=0; edge[cur2][cur1]=1; degs[lol+1].push_back(cur1); degs[lol-1].push_back(cur2); if(degs[lol+1].size()>=2)st.insert(lol+1); if(degs[lol-1].size()>=2)st.insert(lol-1); } else{ edge[cur1][cur2]=1; edge[cur2][cur1]=0; degs[lol+1].push_back(cur2); degs[lol-1].push_back(cur1); if(degs[lol+1].size()>=2)st.insert(lol+1); if(degs[lol-1].size()>=2)st.insert(lol-1); } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j)continue; if(i<=rn&&j<=rn)continue; else{ if(i<j)edge[i][j]=1; else edge[i][j]=0; } } } for(int i=2;i<=n;i++){ for(int j=1;j<i;j++){ if(edge[i][j])cout<<1; else cout<<0; } cout<<'\n'; } } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); for(int i=1;i<=5000;i++){ if(i==1)continue; ll mx,mn; for(int j=1;j<i;j++){ if(j==1)mx=id[j],mn=id[j]; else mx=max(mx,id[j]),mn=min(mn,id[j]); } if(mx==mn){ for(int j=1;j<=(i-1)/2;j++)id[j]++,od[i]++; for(int j=(i-1)/2+1;j<i;j++)od[j]++,id[i]++; } else{ for(int j=1;j<i;j++){ if(id[j]==mn)id[j]++,od[i]++; else id[i]++,od[j]++; } } ll tot=0; ans[i]=(ll)i*((ll)i-(ll)1)*((ll)i-(ll)2)/(ll)6; for(int j=1;j<=i;j++){ tot+=(id[j]-1)*id[j]/2; tot+=(od[j]-1)*(od[j])/2; } ans[i]-=tot/2; } ll t; cin>>t; while(t--)solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...