Submission #970846

# Submission time Handle Problem Language Result Execution time Memory
970846 2024-04-27T11:23:15 Z PenguinsAreCute Parrots (IOI11_parrots) C++17
100 / 100
462 ms 19860 KB
#include "encoder.h"
#include "encoderlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
// WHY MUST I CODE INT512
struct int512_en {
	ll a[8];
	int512_en() {fill(a,a+8,0);}
};
int512_en add_en(int512_en x, int512_en y) {
	int512_en z;
	for(int i=0;i<8;i++) {
		if(x.a[i]+y.a[i]<x.a[i]&&i<7) z.a[i+1]=1;
		z.a[i]+=(x.a[i]+y.a[i]);
		if(!z.a[i] && (x.a[i] || y.a[i]) && i<7) z.a[i+1]=1;
	}
	return z;
}
bool small_en(int512_en x, int512_en y) {
	for(int i=8;i--;) if(x.a[i]!=y.a[i]) return x.a[i]<y.a[i];
	return 0;
}
int512_en neg_en(int512_en x) {
	int512_en y; for(int i=0;i<8;i++) y.a[i]=(~x.a[i]);
	int512_en z; z.a[0]=1; return add_en(y,z);
}
int512_en nck_en[518][256];
void init_en() {
	nck_en[0][0].a[0]=1;
	for(int i=1;i<518;i++) for(int j=0;j<256;j++) nck_en[i][j]=add_en(j?nck_en[i-1][j-1]:int512_en(),nck_en[i-1][j]);
}
void kth_seq_en(int st, int n, int512_en k, vector<int> &v) {
	if(!n) return;
	if(small_en(k,nck_en[n-st-1][-st])) {v.push_back(-st); kth_seq_en(st,n-1,k,v);}
	else kth_seq_en(st+1,n,add_en(k,neg_en(nck_en[n-st-1][-st])),v);
}
int512_en seq_no_en(int st, int n, int* a) {
	if(!n) return int512_en();
	if(a[0]==-st) return seq_no_en(st,n,a+1);
	return add_en(seq_no_en(st+1,n,a),nck_en[n-st-1][-st]);
}
void encode(int N, int M[]) {
	init_en();
	int512_en erm;
	for(int i=0;i<N;i++) erm.a[i>>3]|=((long long)(M[i])<<((i&7)<<3));
	vector<int> v; kth_seq_en(-255,(262*N)>>6,erm,v);
	for(auto i: v) send(i);
}
#include "decoder.h"
#include "decoderlib.h"
#include <bits/stdc++.h>
using namespace std;
using ll = unsigned long long;
// WHY MUST I CODE INT512
struct int512 {
	ll a[8];
	int512() {fill(a,a+8,0);}
};
int512 add(int512 x, int512 y) {
	int512 z;
	for(int i=0;i<8;i++) {
		if(x.a[i]+y.a[i]<x.a[i]&&i<7) z.a[i+1]=1;
		z.a[i]+=(x.a[i]+y.a[i]);
		if(!z.a[i] && (x.a[i] || y.a[i]) && i<7) z.a[i+1]=1;
	}
	return z;
}
bool small(int512 x, int512 y) {
	for(int i=8;i--;) if(x.a[i]!=y.a[i]) return x.a[i]<y.a[i];
	return 0;
}
int512 neg(int512 x) {
	int512 y; for(int i=0;i<8;i++) y.a[i]=(~x.a[i]);
	int512 z; z.a[0]=1; return add(y,z);
}
int512 nck[518][256];
void init() {
	nck[0][0].a[0]=1;
	for(int i=1;i<518;i++) for(int j=0;j<256;j++) nck[i][j]=add(j?nck[i-1][j-1]:int512(),nck[i-1][j]);
}
void kth_seq(int st, int n, int512 k, vector<int> &v) {
	if(!n) return;
	if(small(k,nck[n-st-1][-st])) {v.push_back(-st); kth_seq(st,n-1,k,v);}
	else kth_seq(st+1,n,add(k,neg(nck[n-st-1][-st])),v);
}
int512 seq_no(int st, int n, int* a) {
	if(!n) return int512();
	if(a[0]==st) return seq_no(st,n-1,a+1);
	return add(seq_no(st+1,n,a),nck[n-st-1][-st]);
}
void decode(int N, int L, int X[]) {
	init();
	sort(X,X+L,greater<int>());
	for(int i=0;i<L;i++) X[i]=-X[i];
	int512 hi = seq_no(-255,L,X);
	for(int i=0;i<N;i++) output((hi.a[i>>3]>>((i&7)<<3))&255);
}
# Verdict Execution time Memory Grader output
1 Correct 97 ms 19316 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 412 ms 19308 KB Output is correct
2 Correct 421 ms 19596 KB Output is correct
3 Correct 429 ms 19548 KB Output is correct
4 Correct 422 ms 19152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 423 ms 19512 KB Output is correct
2 Correct 435 ms 19352 KB Output is correct
3 Correct 427 ms 19148 KB Output is correct
4 Correct 421 ms 19324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 440 ms 19528 KB Output is correct
2 Correct 415 ms 19528 KB Output is correct
3 Correct 433 ms 19424 KB Output is correct
4 Correct 422 ms 19544 KB Output is correct
5 Correct 418 ms 19336 KB Output is correct
6 Correct 441 ms 19576 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 426 ms 19144 KB Output is correct
2 Correct 429 ms 19376 KB Output is correct
3 Correct 462 ms 19744 KB Output is correct
4 Correct 440 ms 19560 KB Output is correct
5 Correct 424 ms 19600 KB Output is correct
6 Correct 427 ms 19712 KB Output is correct
7 Correct 439 ms 19860 KB Output is correct