QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#288017 | #7969. 套娃 | PYD1 | WA | 2ms | 12392kb | C++14 | 4.9kb | 2023-12-21 15:52:45 | 2023-12-21 15:52:46 |
Judging History
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 '