社区讨论
17TLE几个小时了,有没有大佬来指点一下
P8078[WC2022] 秃子酋长参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo95vfal
- 此快照首次捕获于
- 2023/10/28 06:04 2 年前
- 此快照最后确认于
- 2023/10/28 06:04 2 年前
rt
CPP
#include<bits/stdc++.h>
#define dd double
#define ld long double
#define ll long long
#define uint unsigned int
#define ull unsigned long long
// #define int long long
#define N 500010
#define M number
using namespace std;
const int INF=0x3f3f3f3f;
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read()
{
int x=0,f=1;
char ch=nc();
while(ch<48||ch>57)
{
if(ch=='-')
f=-1;
ch=nc();
}
while(ch>=48&&ch<=57)
x=x*10+ch-48,ch=nc();
return x*f;
}
void print(ll x)
{
char P[105];int w=0;
if(!x){putchar('0');return;}
if(x<0) putchar('-'),x=-x;//特判负数
while(x) P[++w]=x%10+'0',x/=10;//分离各位
for(int i=w; i>=1; i--) putchar(P[i]);//逆序输出
}
int n,m,a[N],Len,Posi[N],b[N];
struct Ques{
int l,r,id;
}ques[N];
vector<int> q2[N];
ll ans[N];
inline ll Abs(int x){return (x<0)?-x:x;}
struct LinkList{
int L[N],R[N];
ll Ans;
int Stack[N],top;
bool vis[N];
inline void Init(int l,int r){
for(int i(1);i<=n;i++) L[i]=R[i]=vis[i]=0;Ans=0;top=0;
for(int i(l);i<=r;i++){
vis[a[i]]=1;
// assert(i<=500000);
}
int last=0;
for(int i(1);i<=n;i++){
if(!vis[i]) continue;
if(last) L[i]=last,R[last]=i,Ans+=Abs(b[last]-b[i]);
last=i;
}
}
inline void Del(int val){
vis[val]=0,Stack[++top]=val;
if(L[val]) Ans-=Abs(b[L[val]]-b[val]);
if(R[val]) Ans-=Abs(b[R[val]]-b[val]);
if(L[val]&&R[val]) Ans+=Abs(b[L[val]]-b[R[val]]);
R[L[val]]=R[val],L[R[val]]=L[val];
}
inline void Rollonce(){
int val=Stack[top--];vis[val]=1;
R[L[val]]=L[R[val]]=val;
if(L[val]&&R[val]) Ans-=Abs(b[R[val]]-b[L[val]]);
if(R[val]) Ans+=Abs(b[R[val]]-b[val]);
if(L[val]) Ans+=Abs(b[L[val]]-b[val]);
}
inline void RollBack(){
for(;top;) Rollonce();
}
}li;
inline bool cmp(int a,int b){
// if(ques[a].r!=ques[b].r) return ques[a].r>ques[b].r;
// return ques[a].l<ques[b].l;
return (ques[a].r>ques[b].r)||(ques[a].r==ques[b].r&&ques[a].l<ques[b].l);
// return (ques[a].l < ques[b].l)||(ques[a].l==ques[b].l&&ques[a].r>ques[b].r);
}
inline void Work2(){
for(int i(1);i<=Posi[n];i++){
int nowl=(i-1)*Len+1,nowr=n;
li.Init(nowl,nowr);
for(int j:q2[i]){
int nl=nowl;
while(ques[j].r<nowr&&nowr>=1) li.Del(a[nowr--]);
li.top=0;
while(nl<ques[j].l&&nl<=n) li.Del(a[nl++]);
ans[ques[j].id]=li.Ans;
li.RollBack();
}
}
}
signed main(){
int maxx=-INF;
n=read();m=read();for(int i=1;i<=n;i++) a[i]=read(),b[a[i]]=i,maxx=max(maxx,a[i]);
Len=min((int)sqrt(n)+301,n);
// Len = pow(maxx, 1.0 / 3);
// Len = pow(maxx, 1.0/3); Len *= Len;
// if(!Len) Len++;
// Len = 1950;
for(int i(1);i<=n;i++) Posi[i]=(i-1)/Len+1;
for(int i(1);i<=m;i++){
int l,r;l=read();r=read();ques[i].id=i;
ques[i].l=l;ques[i].r=r;q2[Posi[l]].push_back(i);
}
for(int i(1);i<=n;i++) if(q2[i].size()) sort(q2[i].begin(),q2[i].end(),cmp);
Work2();
for(int i(1);i<=m;i++) print(ans[i]),puts("");
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...