QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#288017#7969. 套娃PYD1WA 2ms12392kbC++144.9kb2023-12-21 15:52:452023-12-21 15:52:46

Judging History

你现在查看的是最新测评结果

  • [2023-12-21 15:52:46]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:12392kb
  • [2023-12-21 15:52:45]
  • 提交

answer

#include <set>
#include <map>
#include <list>
#include <queue>
#include <cmath>
#include <time.h>
#include <random>
#include <bitset>
#include <vector>
#include <cstdio>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <unordered_map>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;

#define mk make_pair
#define fi first
#define se second

inline int read(){
	int t = 0,f = 1;
	register char c = getchar();
	while (c < 48 || c > 57) f = (c == '-') ? (-1) : (f),c = getchar();
	while (c >= 48 && c <= 57) t = (t << 1) + (t << 3) + (c ^ 48),c = getchar();
	return f * t;
}

const int N = 1e5 + 10,INF = 0x3f3f3f3f;
int n,v[N],ans[N];

struct Node{
	int l,r;
	bool operator < (const Node &rhs) const {return this->l != rhs.l ? this->l < rhs.l : this->r > rhs.r;}
}ns[N],tmp[N];

vector <int> vec[N];

struct DSU{
	int fa[N];
	void init(int n) {for (int i = 1;i <= n;i++) fa[i] = i;}
	int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
	void merge(int x,int y){
		int a = find(x),b = find(y);
		if (a != b) fa[a] = b;
	}
}dsu;

struct Segment_tree{
	int tag[N << 2],pmn[N << 2],resmn[N << 2];
	void pushup(int i,int l,int r){
		pmn[i] = min(pmn[i << 1],pmn[i << 1 | 1]);
		resmn[i] = min(resmn[i << 1],resmn[i << 1 | 1]);
	}
	void spread(int i,int l,int r,int v) {tag[i] = pmn[i] = v,resmn[i] = l - v + 1;}
	void pushdown(int i,int l,int r){
		if (!tag[i]) return ;
		int mid = (l + r) >> 1;
		spread(i << 1,l,mid,tag[i]),spread(i << 1 | 1,mid + 1,r,tag[i]);
		tag[i] = 0;
	}
	void build(int i,int l,int r){
		tag[i] = 0;
		if (l == r) {pmn[i] = i,resmn[i] = 1;return ;}
		int mid = (l + r) >> 1;
		build(i << 1,l,mid),build(i << 1 | 1,mid + 1,r);
		pushup(i,l,r);
	}
	void modify(int i,int l,int r,int ql,int qr,int v){
		if (l >= ql && r <= qr) {spread(i,l,r,v);return ;}
		int mid = (l + r) >> 1;pushdown(i,l,r);
		if (ql <= mid) modify(i << 1,l,mid,ql,qr,v);
		if (qr > mid) modify(i << 1 | 1,mid + 1,r,ql,qr,v);
		pushup(i,l,r);
	}
	int query(int i,int l,int r,int ql,int qr){
		if (l >= ql && r <= qr) return resmn[i];
		int mid = (l + r) >> 1,ans = INF;pushdown(i,l,r);
		if (ql <= mid) ans = min(ans,query(i << 1,l,mid,ql,qr));
		if (qr > mid) ans = min(ans,query(i << 1 | 1,mid + 1,r,ql,qr));
		return ans;
	}
	int bs(int i,int l,int r,int ql,int qr,int v){
		if (r < ql || l > qr) return INF;
		if (l == r) return pmn[i] > v ? l : INF;
		int mid = (l + r) >> 1;
		if (qr > mid){
			if (pmn[i << 1 | 1] > v) return min(mid + 1,bs(i << 1,l,mid,ql,qr,v));
			else return bs(i << 1 | 1,mid + 1,r,ql,qr,v);
		}
		return bs(i << 1,l,mid,ql,qr,v);
	}
}TR;

int change(int p,int v){
	if (ans[p] != -1) return dsu.find(p);
	ans[p] = v,dsu.merge(p,p + 1);
	return dsu.find(p);
}

void upd(int x,int m){
	// printf("upd(%d)\n",x);
	if (!m){
		int cur = 1;
		while (cur <= n) cur = change(cur,x);
		return ;
	}
	sort(ns + 1,ns + m + 1);
	int tmpcnt = 0,ncnt = 0;Node cur = (Node){-1,-1};
	for (int i = 1;i <= m;i++){
		if (cur.l == -1) cur = ns[i];
		else if (ns[i].l > cur.r) tmp[++tmpcnt] = cur,cur = ns[i];
		else cur.l = min(cur.l,ns[i].l),cur.r = max(cur.r,ns[i].r);
	}
	tmp[++tmpcnt] = cur;
	sort(tmp + 1,tmp + tmpcnt + 1);
	// puts("tmp:");
	// for (int i = 1;i <= tmpcnt;i++) printf("(%d,%d)\n",tmp[i].l,tmp[i].r);
	int lst = 0;
	for (int i = 1;i <= tmpcnt;i++){
		if (lst + 1 < tmp[i].l) ns[++ncnt] = (Node){lst + 1,tmp[i].l - 1};
		lst = tmp[i].r;
	}
	if (lst + 1 <= n) ns[++ncnt] = (Node){lst + 1,n};
	// puts("ns:");
	// for (int i = 1;i <= ncnt;i++) printf("(%d,%d)\n",ns[i].l,ns[i].r);
	for (int i = 1;i <= ncnt;i++){
		int cur = ns[i].l;
		while (cur <= ns[i].r) cur = change(cur,x);
	}
}

void solve(int x){
	// printf("solve(%d)\n",x);
	int lst = 0,ncnt = 0;
	for (int p : vec[x]){
		if (lst + 1 <= p - 1){
			int l = TR.query(1,1,n,lst + 1,p - 1),r = p - lst - 1;
			if (l <= r) ns[++ncnt] = (Node){l,r};
		}
		lst = p;
	}
	if (lst + 1 <= n){
		int l = TR.query(1,1,n,lst + 1,n),r = n - lst;
		if (l <= r) ns[++ncnt] = (Node){l,r};
	}
	// for (int i = 1;i <= ncnt;i++){
	// 	printf("(%d,%d)\n",ns[i].l,ns[i].r);
	// }
	upd(x,ncnt);
	lst = 0;int lstv = -INF;
	for (int p : vec[x]){
		if (lst + 1 <= p - 1){
			int l = TR.bs(1,1,n,lst + 1,p - 1,lstv),r = p - 1;
			if (l <= r) TR.modify(1,1,n,l,r,lstv);
		}
		lst = lstv = p;
	}
	if (lst + 1 <= n){
		int l = TR.bs(1,1,n,lst + 1,n,lstv),r = n;
		if (l <= r) TR.modify(1,1,n,l,r,lstv);
	}
}

int main(){
#ifndef ONLINE_JUDGE
	freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
#endif
	n = read();
	for (int i = 1;i <= n;i++) vec[v[i] = read()].emplace_back(i);
	TR.build(1,1,n),dsu.init(n + 1),memset(ans,-1,sizeof(ans));
	for (int i = 0;i <= n;i++){
		solve(i);
	}
	for (int i = 1;i <= n;i++) printf("%d ",ans[i]);puts("");
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 10432kb

input:

6
0 0 0 1 2 3

output:

2 3 4 0 0 0 

result:

ok single line: '2 3 4 0 0 0 '

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 12392kb

input:

100
0 10 21 9 4 1 14 0 8 1 4 6 10 0 0 4 18 0 12 5 2 5 15 1 6 2 0 4 14 5 1 2 23 1 8 1 24 8 8 9 5 2 12 2 3 7 6 11 12 12 6 12 4 4 5 0 7 4 9 12 1 7 4 7 12 2 10 2 4 8 7 1 4 0 13 9 13 2 2 3 9 14 7 9 15 10 10 6 2 12 3 11 6 3 4 7 9 6 11 1

output:

2 3 3 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 2 2 2 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

result:

wrong answer 1st lines differ - expected: '2 2 3 4 4 4 4 4 4 4 4 4 4 4 4 ...0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0', found: '2 3 3 -1 -1 -1 -1 -1 -1 -1 -1 ... 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 '