Submission #643449

# Submission time Handle Problem Language Result Execution time Memory
643449 2022-09-22T04:06:36 Z uylulu Matching (CEOI11_mat) C++14
100 / 100
474 ms 43428 KB
#include<bits/stdc++.h>
using namespace std;

#define ll long long
#define ld long double
#define endl "\n"

const int N = 1e6 + 5;

int pos[N],pi[N*2];
int a[N],b[N],le[N],ri[N],ra[N],n,m;

vector<int> nw;

bool check(int idx,int mid) {
	if(mid > n) return false;
	return nw[idx] >= nw[idx - le[mid]] && nw[idx] <= nw[idx - ri[mid]];
}

struct BIT_MAX{
	vector<int> bit;
	int n;
	void init(int len) {
		n = len;
		bit.resize(n + 1,0);
	}
	void add(int pos) {
		for(int i = pos;i <= n;i += i&(-i)) {
			bit[i] = max(bit[i],pos);
		}
	}
	int query(int pos) {
		int res =0;
		while(pos > 0) {
			res = max(res,bit[pos]);
			pos -= pos&(-pos);
		}
		return res;
	}
};

struct BIT_MIN{
	vector<int> bit;
	int n;
	void init(int len) {
		n = len;
		bit.resize(n + 1,INT_MAX);
	}
	void add(int pos) {
		int x = pos;
		while(pos > 0) {
			bit[pos] = min(bit[pos],x);
			pos -= pos&(-pos);
		}
	}
	int query(int pos) {
		int res = INT_MAX;
		for(int i = pos;i <= n;i += i&(-i)) {
			res = min(res,bit[i]);
		}
		return res;
	}
};

BIT_MAX front;
BIT_MIN back;

signed main() {
	// freopen("in.txt","r",stdin);
	// freopen("some.txt","w",stdout);
	ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);

	cin>>n>>m;
	for(int i = 1;i <= n;i++) {
		cin>>ra[i];
		a[ra[i]] = i;
	}
	for(int i = 1;i <= m;i++) {
		cin>>b[i];
	}
	set<int> st;
	front.init(n);
	back.init(n);
	
	for(int i = 1;i <= n;i++) {
		int l = front.query(a[i]);
		if(l == 0) {
			le[i] = 0;
		} else le[i] = i - ra[l];
		int r = back.query(a[i]);
		if(r == INT_MAX) {
			ri[i] = 0;
		} else {
			ri[i] = i - ra[r];
		}
		front.add(a[i]);
		back.add(a[i]);
	}

	for(int i= 1;i <= n;i++) {
		nw.push_back(a[i]);
	}
	nw.push_back(-1);
	for(int i = 1;i <= m;i++) {
		nw.push_back(b[i]);
	}
	pi[0] = 0;

	for(int i = 1;i < nw.size();i++) {
		if(i == n) {
			pi[i] = 0;
			continue;
		}
		int j = pi[i - 1];
		while(j > 0 && !check(i,j + 1)) {
			j = pi[j - 1];
		}
		if(check(i,j + 1)) {
			j++;
		}
		pi[i] = j;
	}
	vector<int> pos;
	for(int i = n + 1;i < nw.size();i++) {
		if(pi[i] == n) {
			pos.push_back(i - n*2 + 1);
		}
	}
	cout<<pos.size()<<endl;
	for(auto u : pos) cout<<u<<" ";

}
 

Compilation message

mat.cpp: In function 'int main()':
mat.cpp:109:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |  for(int i = 1;i < nw.size();i++) {
      |                ~~^~~~~~~~~~~
mat.cpp:124:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |  for(int i = n + 1;i < nw.size();i++) {
      |                    ~~^~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 852 KB Output is correct
2 Correct 3 ms 852 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3 ms 852 KB Output is correct
2 Correct 3 ms 852 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 24 ms 3788 KB Output is correct
2 Correct 22 ms 3136 KB Output is correct
3 Correct 33 ms 4620 KB Output is correct
4 Correct 34 ms 4600 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 30 ms 4552 KB Output is correct
2 Correct 24 ms 3808 KB Output is correct
3 Correct 27 ms 4568 KB Output is correct
4 Correct 34 ms 5720 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 27 ms 4816 KB Output is correct
2 Correct 29 ms 4408 KB Output is correct
3 Correct 27 ms 3880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 165 ms 20112 KB Output is correct
2 Correct 474 ms 43428 KB Output is correct
3 Correct 93 ms 10424 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 156 ms 21384 KB Output is correct
2 Correct 101 ms 13404 KB Output is correct
3 Correct 465 ms 43184 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 108 ms 14908 KB Output is correct
2 Correct 170 ms 22992 KB Output is correct
3 Correct 131 ms 14408 KB Output is correct
4 Correct 258 ms 43424 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 163 ms 16868 KB Output is correct
2 Correct 127 ms 14504 KB Output is correct
3 Correct 60 ms 9480 KB Output is correct
4 Correct 274 ms 40336 KB Output is correct