QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#366767 | #7185. Poor Students | Giga_Cronos# | TL | 1ms | 3800kb | C++20 | 5.4kb | 2024-03-25 07:23:27 | 2024-03-25 07:23:28 |
Judging History
answer
///Giga_Cronos Template from UH Top
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops", "omit-frame-pointer", "inline")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,sse4.1,sse4.2,popcnt,abm,mmx,avx,avx2,fma,tune=native")
#pragma GCC option("arch=native", "no-zero-upper") // Enable AVX
using namespace std;
///Macros
#define int long long
#define pb push_back
#define fs first
#define sc second
#define pf push_front
#define all(x) x.begin() , x.end()
#define rall(x) x.rbegin() , x.rend()
#define sz(x) (int)(x.size())
#define mid ((L+R)/2)
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pii;
typedef vector< pii > vpii;
typedef vector<vi> vvi;
typedef vector<vpii> vvpii;
typedef pair<vi,vi> pvv;
typedef __int128_t int128;
typedef long double ld;
typedef unsigned long long ull;
typedef unsigned int ui;
///Constraints:
const int inf = ((1ll<<31ll)-1ll);
const long long INF = (((1ll<<60ll)-1ll)*2ll)+1ll;
const ull mod=998244353;
const ld pi = acos(-1);
const ld eps=1e-8;
/// Functions:
#define lg2(x) 31 - __builtin_clz(x)
#define lg2ll(x) 63ll - __builtin_clzll(x)
#define lgx(x,b) ( log(x) / log(b) )
/*#include<ext/pb_ds/assoc_container.hpp> // Common file
#include<ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update
using namespace __gnu_pbds;
//comenta el define long long int
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// find_by_order
// order_of_key */
mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count());
/// Quick Pow------------------------------------------------
int qpow(int a, int b) {
int res = 1;
for (; b; b /= 2, a = (a*a)%mod) {
if (b % 2) {
res =(res*a)%mod;
}
}
return res;
}
int qpow(int a, int b,int mod) {
int res = 1;
for (; b; b /= 2, a = (a*a)%mod) {
if (b % 2) {
res =(res*a)%mod;
}
}
return res;
}
///Inverso Modular
int InverM(int a,int b)
{
int eso=a%b;
if(eso==0)
return 0;
int ans=(1-(int128)b*InverM(b,eso))/eso;
if(ans<0)
ans+=b;
return ans;
}
const int MAXN=50'005;
/// Variables-----------------------------------------------
int n,m,q,k;
set<pii> Pq[10][10];
int Stud[MAXN][10][10];
int Cap[10];
int Cant[10];
int sum=0;
inline pii C(int i,int j){
pii ans={INF,-1};
if(!Pq[i][j].empty()){
ans=min(ans,*Pq[i][j].begin());
}
if(Cap[i]>Cant[i]){
ans=min(ans,{0,-1});
}
return ans;
}
int cont=0;
bool BellmanFord(){
vi D(k,0);
cont++;
vi P(k,-1);
bool ok=false;
int tipo=0;
for(int i=0;i<=k;i++){
ok=false;
for(int j=0;j<k;j++){
for(int h=0;h<k;h++){
if(D[h]>C(j,h).fs+D[j]){
ok=true;
tipo=h;
D[h]=C(j,h).fs+D[j];
P[h]=j;
}
}
}
}
if(!ok)return false;
vector<int> Ar;
Ar.pb(tipo);
int cur=tipo;
for(int i=0;i<=k && cur!=-1;i++){
cur=P[cur];
Ar.pb(cur);
}
if(Ar.back()==-1){
Ar.pop_back();
}
reverse(all(Ar));
vi Flag(k);
stack<int> S;
int num=0;
vi Cyc;
for(auto u:Ar){
if(Flag[u]){
num=u;
break;
}
S.push(u);
Flag[u]=1;
}
Cyc.pb(num);
while(S.top()!=num){
Cyc.pb(S.top());
S.pop();
}
for(int i=0;i<sz(Cyc);i++){
int est=C(Cyc[i],Cyc[(i+1)%sz(Cyc)]).sc;
sum+=C(Cyc[i],Cyc[(i+1)%sz(Cyc)]).fs;
if(est!=-1){
Cant[Cyc[i]]--;
Cant[Cyc[(i+1)%sz(Cyc)]]++;
for(int h=0;h<k;h++){
Pq[Cyc[i]][h].erase({Stud[est][Cyc[i]][h],est});
}
for(int h=0;h<k;h++){
Pq[Cyc[(i+1)%sz(Cyc)]][h].insert({Stud[est][Cyc[(i+1)%sz(Cyc)]][h],est});
}
}
}
// cout<<sum<<'\n';
// for(int i=0;i<k;i++){
// set<int> S;
// for(int h=0;h<k;h++){
// for(auto s:Pq[i][h]){
// if(!S.count(s.sc)){
// cout<<s.sc<<' ';
// S.insert(s.sc);
// }
// }
// }
// cout<<'\n';
// }
return true;
}
void problem()
{
cin>>n>>k;
vvi Ns(n);
for(int i=0;i<n;i++){
vi F(k);
for(int i=0;i<k;i++){
cin>>F[i];
}
for(int j=0;j<k;j++){
for(int h=0;h<k;h++){
Stud[i][j][h]=F[h]-F[j];
}
}
Ns[i]=F;
}
for(int i=0;i<k;i++)cin>>Cap[i];
for(int i=0;i<n;i++){
vi F(k);
iota(all(F),0);
random_shuffle(all(F));
for(auto j:F){
if(Cant[j]<Cap[j]){
Cant[j]++;
sum+=Ns[i][j];
for(int h=0;h<k;h++){
Pq[j][h].insert({Stud[i][j][h],i});
}
break;
}
}
}
while(BellmanFord());
cout<<sum<<'\n';
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.setf(ios::fixed);
cout.precision(12);
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int tc=1;
//cin>>tc;
while(tc--)
{
problem();
cout<<'\n';
}
}
///Tips
//Busqueda Binaria
//Precomputing
//Dinamic Programming
//Revisar constraints
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 3636kb
input:
6 2 1 2 1 3 1 4 1 5 1 6 1 7 3 4
output:
12
result:
ok answer is '12'
Test #2:
score: 0
Accepted
time: 1ms
memory: 3800kb
input:
3 3 1 2 3 2 4 6 6 5 4 1 1 1
output:
8
result:
ok answer is '8'
Test #3:
score: -100
Time Limit Exceeded
input:
1000 10 734 303 991 681 755 155 300 483 702 442 237 256 299 675 671 757 112 853 759 233 979 340 288 377 718 199 935 666 576 842 537 363 592 349 494 961 864 727 84 813 340 78 600 492 118 421 478 925 552 617 517 589 716 7 928 638 258 297 706 787 266 746 913 978 436 859 701 951 137 44 815 336 471 720 2...