QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#307408 | #7439. 铃原露露 | OccDreamer | 0 | 652ms | 108856kb | C++14 | 4.1kb | 2024-01-18 15:37:47 | 2024-01-18 15:37:48 |
Judging History
answer
//code by Nobody.Emissary
#include<bits/stdc++.h>
#define fi first
#define se second
#define vc vector
#define db double
#define ll long long
#define mk make_pair
#define pb push_back
#define PI pair<int,int>
#define ull unsigned long long
#define err cerr << " -_- " << endl
#define debug cerr << " ------------------- " << endl
#define input(x) freopen(#x".in","r",stdin)
#define output(x) freopen(#x".out","w",stdout)
#define NO puts("No")
#define YES puts("Yes")
//#define int long long
using namespace std;
namespace IO{
inline int read(){
int X=0, W=0; char ch=getchar();
while(!isdigit(ch)) W|=ch=='-', ch=getchar();
while(isdigit(ch)) X=(X<<1)+(X<<3)+(ch^48), ch=getchar();
return W?-X:X;
}
inline void write(ll x){
if(x<0) x=-x, putchar('-');
if(x>9) write(x/10);
putchar(x%10+'0');
}
inline void sprint(ll x){write(x), putchar(32);}
inline void eprint(ll x){write(x), putchar(10);}
}using namespace IO;
const int MAXN = 2e5+5;
const int mod = 998244353;
//const int mod = 1e9+7;
struct op{
int l, r, add;
};
struct Qask{
int l, r, id, v;
};
vc<op> Add[MAXN];
vc<Qask> Q[MAXN];
int n, m, id[MAXN], a[MAXN];
int head[MAXN], ne[MAXN<<1], to[MAXN<<1], ecnt;
set<int> S[MAXN];
set<int> :: iterator it;
ll ans[MAXN<<2], tree[MAXN<<2], tag[MAXN<<2], laz[MAXN<<2], cnt[MAXN<<2], sum[MAXN<<2];
inline void add(int x, int y){++ecnt;to[ecnt]=y;ne[ecnt]=head[x];head[x]=ecnt;}
inline void pushup(int p){
sum[p]=sum[p<<1]+sum[p<<1|1];
tree[p]=min(tree[p<<1],tree[p<<1|1]);
cnt[p]=(tree[p]==tree[p<<1])*cnt[p<<1]+(tree[p]==tree[p<<1|1])*cnt[p<<1|1];
return ;
}
inline void pushdown(int p){
laz[p<<1]+=laz[p];
laz[p<<1|1]+=laz[p];
tree[p<<1]+=laz[p];
tree[p<<1|1]+=laz[p];
if(tag[p]){
if(tree[p<<1]==tree[p]) tag[p<<1]+=tag[p], sum[p<<1]+=1ll*cnt[p<<1]*tag[p];
if(tree[p<<1|1]==tree[p]) tag[p<<1|1]+=tag[p], sum[p<<1|1]+=1ll*cnt[p<<1|1]*tag[p];
tag[p]=0;
}
laz[p]=0;
return ;
}
inline void add(int p, int l, int r, int L, int R, int v){
if(L>R) return ;
if(L<=l && r<=R){
tree[p]+=v; laz[p]+=v;
return ;
}
int mid=(l+r)>>1; pushdown(p);
if(L<=mid) add(p<<1,l,mid,L,R,v);
if(R>mid) add(p<<1|1,mid+1,r,L,R,v);
return pushup(p);
}
inline ll ask(int p, int l, int r, int L, int R){
if(L<=l && r<=R) return sum[p];
int mid=(l+r)>>1; ll s=0; pushdown(p);
if(L<=mid) s+=ask(p<<1,l,mid,L,R);
if(R>mid) s+=ask(p<<1|1,mid+1,r,L,R);
return s;
}
inline void build(int p, int l, int r){
if(l==r) return tree[p]=0, cnt[p]=1, void();
int mid=(l+r)>>1;
build(p<<1,l,mid); build(p<<1|1,mid+1,r);
return pushup(p);
}
inline void dfs(int x){
int val=a[x]; vc<int> son; int cur, t, v;
for(int i=head[x];i;i=ne[i]) dfs(to[i]), son.pb(to[i]);
if(son.size()==0) return ;
cur=id[son.back()]; son.pop_back();
for(auto i:son){
t=id[i];
if(S[cur].size()<S[t].size()) swap(cur,t);
for(auto j:S[t]){
it=S[cur].lower_bound(j);
if(it!=S[cur].end()){
v=*it;
if(j>val) Add[val+1].pb(op{v,n,1}), Add[j+1].pb(op{v,n,-1});
else Add[1].pb(op{v,val-1,1}), Add[j+1].pb(op{v,val-1,-1});
}
if(it!=S[cur].begin()){
--it;
v=*it;
if(j>val) Add[val+1].pb(op{j,n,1}), Add[v+1].pb(op{j,n,-1});
else Add[1].pb(op{j,val-1,1}), Add[v+1].pb(op{j,val-1,-1});
}
}
for(auto j:S[t]) S[cur].insert(j);
S[t].clear();
}
S[cur].insert(a[x]); id[x]=cur;
return ;
}
signed main(){
n=read(), m=read(); int f;
for(int i=1;i<=n;++i) a[i]=read();
for(int i=2;i<=n;++i) f=read(), add(f,i);
for(int i=1;i<=n;++i) id[i]=i, S[i].insert(a[i]); dfs(1);
for(int i=1;i<=m;++i){
int l, r;
l=read(), r=read();
Q[l-1].pb(Qask{l,r,i,-1});
Q[r].pb(Qask{l,r,i,1});
}
build(1,1,n);
for(int i=2;i<=n;++i) Add[i].pb(op{i-1,i-1,1});
for(int i=1;i<=n;++i){
for(auto j:Add[i]) add(1,1,n,j.l,j.r,j.add);
if(tree[1]==0) tag[1]++, sum[1]+=cnt[1];
for(auto j:Q[i]) ans[j.id]+=j.v*ask(1,1,n,j.l,j.r);
}
for(int i=1;i<=m;++i) eprint(ans[i]);
return 0;
}
详细
Subtask #1:
score: 0
Wrong Answer
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 33368kb
input:
100 100 5 29 12 16 25 36 18 37 27 47 34 40 20 3 1 42 26 19 33 41 6 22 8 58 32 62 24 15 35 17 59 30 50 61 43 49 39 67 44 21 13 31 68 69 65 64 10 28 38 54 70 63 9 46 66 52 23 7 48 60 55 56 51 2 57 11 53 14 45 4 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 ...
output:
9 85 37 4 13 13 46 17 173 32 44 29 66 38 21 28 43 111 32 35 36 39 83 28 8 62 35 67 1 42 102 5 43 38 4 51 6 14 84 16 61 34 76 7 43 72 82 17 4 51 72 310 78 26 6 54 27 4 81 11 20 39 8 192 76 67 73 66 51 16 2 13 6 47 80 47 11 89 60 57 97 79 90 7 1 41 90 7 22 53 84 56 32 17 27 81 70 10 24 26
result:
wrong answer 2nd numbers differ - expected: '87', found: '85'
Subtask #2:
score: 0
Skipped
Dependency #1:
0%
Subtask #3:
score: 0
Wrong Answer
Test #21:
score: 0
Wrong Answer
time: 652ms
memory: 108856kb
input:
200000 1 73119 155820 110077 139724 136809 18709 57745 43535 89117 43647 20295 60551 108184 188031 180437 52363 72969 130559 179796 75852 53879 96998 63387 76458 193661 142318 28260 40465 80050 188507 143795 141018 94880 71333 7644 109237 105208 109509 9779 159914 135096 47638 175577 182927 173100 1...
output:
216931
result:
wrong answer 1st numbers differ - expected: '216932', found: '216931'
Subtask #4:
score: 0
Skipped
Dependency #1:
0%