Submission #1320979

#TimeUsernameProblemLanguageResultExecution timeMemory
1320979AksLolCodingVision Program (IOI19_vision)C++17
100 / 100
51 ms10448 KiB
#include "vision.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "Ofast")
#define ll long long
#define se second
#define fi first
#define pb push_back
#define lf (id<<1)
#define rg ((id<<1)|1)
#define md ((l+r)>>1)
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,pii> ipii;
const int MAXN = 5e5+100;
const int MAXA = 2e5+10;
const int SQRT = 450;
const ll INF = 2e9;
const int MOD = 998244353;
const int LOG = 60;
ll sum(auto a, auto b){ 
	ll te = a+MOD+b; 
	for(; te >= MOD; ) te -= MOD;
	return te;
}
void chsum(int &a, auto b){ a = sum(a,b); }
ll mul(auto a, auto b){ return 1ll*a*b%MOD; }
void chmul(auto &a, auto b){ a = mul(a,b); }
void chmn(auto &a, auto b){ a = min(a, b); }
void chmx(auto &a, auto b){ a = max(a, b); }

int h, w, k;
int le[MAXN], ri[MAXN], nl[MAXN], nr[MAXN];
int dl[MAXN], dr[MAXN];
pii L[MAXN], R[MAXN];

int gan(int x, int y){
	return (x-1)*w+y-1;
}

int cek(int jar){
	// ri or diag
	int num = 0;
	for(int i=h; i>=2; i--){
		vector<int> vec;
		int r=i, c=1;
		while(r<=h && c<=w){
			vec.pb(gan(r,c)); r++; c++;
		}
		ri[++num] = add_or(vec);
		R[num] = {i, 1};
	}
	for(int i=1; i<=w; i++){
		vector<int> vec;
		int r=1, c=i;
		while(r<=h && c<=w){
			vec.pb(gan(r,c)); r++; c++;
		}
		ri[++num] = add_or(vec);
		R[num] = {1, i};
	}
	// le or diag
	num = 0;
	for(int i=h; i>=2; i--){
		vector<int> vec;
		int r=i, c=w;
		while(r<=h && c>=1){
			vec.pb(gan(r,c)); r++; c--;
		}
		le[++num] = add_or(vec);
		L[num] = {i, w};
	}
	for(int i=w; i>=1; i--){
		vector<int> vec;
		int r=1, c=i;
		while(r<=h && c>=1){
			vec.pb(gan(r,c)); r++; c--;
		}
		le[++num] = add_or(vec);
		L[num] = {1, i};
	}

	int siz = h+w-1;
	num=0;
	for(int i=1; i<=siz; i++){
		vector<int> vec;
		for(int p=max(1, i-jar); p<=min(siz, i+jar); p++){
			if(p==i) continue;
			vec.pb(le[p]);
		}
		int OR = add_or(vec);
		nl[++num] = add_and({le[i], OR});
	}
	
	num=0;
	for(int i=1; i<=siz; i++){
		vector<int> vec;
		for(int p=max(1, i-jar); p<=min(siz, i+jar); p++){
			if(p==i) continue;
			vec.pb(ri[p]);
		}
		int OR = add_or(vec);
		nr[++num] = add_and({ri[i], OR});
	}

	//apakah double?
	num=0;
	for(int i=1; i<=siz; i++){
		vector<int> vec;
		int r=L[i].fi, c=L[i].se;
		while(r<=h && c>=1){
			vec.pb(gan(r,c));
			r++; c--;
		}
		int OR = le[i];
		int XOR = add_xor(vec);
		int N = add_not(XOR);
		dl[++num] = add_and({OR, N});
	}
	num=0;
	for(int i=1; i<=siz; i++){
		vector<int> vec;
		int r=R[i].fi, c=R[i].se;
		while(r<=h && c<=w){
			vec.pb(gan(r,c));
			r++; c++;
		}
		// int OR = add_or(vec);
		int OR = ri[i];
		int XOR = add_xor(vec);
		int N = add_not(XOR);
		dr[++num] = add_and({OR, N});
	}

	int up, dw;
	{
		vector<int> vec;
		for(int i=1; i<=siz; i++){
			vec.pb(nl[i]); vec.pb(dl[i]);
		}
		up = add_or(vec);
	}
	{
		vector<int> vec;
		for(int i=1; i<=siz; i++){
			vec.pb(nr[i]); vec.pb(dr[i]);
		}
		dw = add_or(vec);
	}
	return add_and({up, dw});
}
void construct_network(int H, int W, int K) {
	h = H; w = W; k = K;
	if(k==1){
		int nw = cek(k);
	} else {
		int bef = cek(k-1);
		int nw = cek(k);
		int x = add_xor({bef, nw});
	}
}

Compilation message (stderr)

vision.cpp:20:8: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   20 | ll sum(auto a, auto b){
      |        ^~~~
vision.cpp:20:16: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   20 | ll sum(auto a, auto b){
      |                ^~~~
vision.cpp:25:20: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   25 | void chsum(int &a, auto b){ a = sum(a,b); }
      |                    ^~~~
vision.cpp:26:8: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   26 | ll mul(auto a, auto b){ return 1ll*a*b%MOD; }
      |        ^~~~
vision.cpp:26:16: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   26 | ll mul(auto a, auto b){ return 1ll*a*b%MOD; }
      |                ^~~~
vision.cpp:27:12: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   27 | void chmul(auto &a, auto b){ a = mul(a,b); }
      |            ^~~~
vision.cpp:27:21: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   27 | void chmul(auto &a, auto b){ a = mul(a,b); }
      |                     ^~~~
vision.cpp:28:11: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   28 | void chmn(auto &a, auto b){ a = min(a, b); }
      |           ^~~~
vision.cpp:28:20: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   28 | void chmn(auto &a, auto b){ a = min(a, b); }
      |                    ^~~~
vision.cpp:29:11: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   29 | void chmx(auto &a, auto b){ a = max(a, b); }
      |           ^~~~
vision.cpp:29:20: warning: use of 'auto' in parameter declaration only available with '-std=c++20' or '-fconcepts'
   29 | void chmx(auto &a, auto b){ a = max(a, b); }
      |                    ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...