QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#559701 | #8218. 水镜 | zhulexuan | 0 | 2ms | 15952kb | C++14 | 3.6kb | 2024-09-12 08:31:57 | 2024-09-12 08:31:58 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1e18
#define fr(i,l,r) for (i=(l); i<=(r); i++)
#define rfr(i,l,r) for (i=(l); i>=(r); i--)
template<typename T>inline void read(T &n){
T w=1; n=0; char ch=getchar();
while (!isdigit(ch) && ch!=EOF){ if (ch=='-') w=-1; ch=getchar(); }
while (isdigit(ch) && ch!=EOF){ n=(n<<3)+(n<<1)+(ch&15); ch=getchar(); }
n*=w;
}
template<typename T>inline void write(T x){
if (x==0){ putchar('0'); return ; }
T tmp;
if (x>0) tmp=x;
else tmp=-x;
if (x<0) putchar('-');
char F[105];
long long cnt=0;
while (tmp){
F[++cnt]=tmp%10+48;
tmp/=10;
}
while (cnt) putchar(F[cnt--]);
}
#define Min(x,y) x = min(x,y)
#define Max(x,y) x = max(x,y)
//基础配置=================================================================================
const ll N = 500005;
ll n,m,ans=0,x,y,l,r,s,z;
ll h[N];
struct seg{
ll l,r;
seg(ll _l=0,ll _r=0){
l = _l; r = _r;
}
};
seg operator + (seg x,seg y){
Max(x.l,y.l);
Min(x.r,y.r);
return x;
}
seg f[N];
struct Uni{
ll cnt,p[N+N+N+N];
void clear(){
cnt = 0;
}
void insert(ll x){
p[++cnt] = x;
}
void Unique(){
if (!cnt) return ;
sort(p+1,p+1+cnt);
ll i, len = 1;
fr(i,2,cnt)
if (p[i]!=p[len]) p[++len] = p[i];
cnt = len;
}
ll find(ll x){
ll l = 1, r = cnt, mid;
while (l<=r){
mid = (l+r)>>1;
if (p[mid]==x) return mid;
if (p[mid]<x) l = mid+1;
else r = mid-1;
}
return -1;
}
}un;
seg calc(ll x,ll y){//p_i>=p_{i+1}的区间L
if (x==y) return seg(-inf,inf);
if (x>y) return seg(-inf,(x+y)/2);
return seg((x+y)/2,inf);
}
struct Tree{
struct node{
ll l,r;
ll v,tag;//最小值,覆盖标记
}t[16*N];
void build(ll s,ll l,ll r){
t[s].l = l; t[s].r = r;
t[s].v = 1; t[s].tag = -1;
if (l==r) return ;
ll mid = (l+r)>>1;
build(s*2,l,mid);
build(s*2+1,mid+1,r);
}
void chg(ll s,ll v){
t[s].v = t[s].tag = v;
}
void down(ll s){
if (t[s].tag==-1) return ;
chg(s*2,t[s].tag);
chg(s*2+1,t[s].tag);
t[s].tag = -1;
}
void change(ll s,ll l,ll r,ll v){
if (t[s].l>=l && t[s].r<=r){ chg(s,v); return ; }
down(s);
if (t[s*2].r>=l) change(s*2,l,r,v);
if (t[s*2+1].l<=r) change(s*2+1,l,r,v);
t[s].v = min(t[s*2].v,t[s*2+1].v);
}
}tr;
int main(){
// freopen("a.in","r",stdin);
// freopen(".out","w",stdout);
ll i,j;
read(n);
fr(i,1,n) read(h[i]), h[i]*=2;
fr(i,2,n-1) f[i] = calc(h[i],h[i-1]) + calc(h[i],h[i+1]);
un.clear();
un.insert(-inf); un.insert(inf);
fr(i,2,n-1){
un.insert(f[i].l), un.insert(f[i].r);
// if (f[i].l<inf) un.insert(f[i].l+1);
if (f[i].r<inf) un.insert(f[i].r+1);
}
// fr(i,2,n-1) printf("%lld : ban %lld ~ %lld\n",i,f[i].l,f[i].r);
un.Unique();
fr(i,2,n-1)
f[i].l = un.find(f[i].l),
f[i].r = un.find(f[i].r);
// fr(i,2,n) printf("%lld : ban %lld ~ %lld\n",i,f[i].l,f[i].r);
tr.build(1,1,un.cnt);
ll ans = n-1;
fr(i,2,n-1){
if (f[i].l<=f[i].r) tr.change(1,f[i].l,f[i].r,i);
ll lf = tr.t[1].v;
// printf("i = %lld , lf = %lld\n",i,lf);
ans += i-lf;
}
write(ans);
return 0;
}
//g++ a.cpp -o a -Wall -Wl,--stack=512000000 -std=c++11 -O2
詳細信息
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 7
Accepted
time: 0ms
memory: 13884kb
input:
2 2 1
output:
1
result:
ok 1 number(s): "1"
Test #2:
score: 7
Accepted
time: 0ms
memory: 15952kb
input:
10 2 2 2 2 1 4 5 3 3 2
output:
20
result:
ok 1 number(s): "20"
Test #3:
score: 7
Accepted
time: 2ms
memory: 15856kb
input:
10 2 2 1 2 2 2 1 4 1 4
output:
17
result:
ok 1 number(s): "17"
Test #4:
score: 0
Wrong Answer
time: 2ms
memory: 15924kb
input:
10 1 5 2 2 5 4 4 4 1 3
output:
18
result:
wrong answer 1st numbers differ - expected: '20', found: '18'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Skipped
Dependency #1:
0%
Subtask #4:
score: 0
Skipped
Dependency #1:
0%
Subtask #5:
score: 0
Skipped
Dependency #1:
0%