E. Monsters (hard version)

2023-11-23 12:21
文章标签 version hard monsters

本文主要是介绍E. Monsters (hard version),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
在这里插入图片描述

只做记录,不是题解

离开集训队好长时间了,也很长时间没有碰这些代码了,最近觉得码力掉了很多,决定操练起来。
ps 这bug调的整个人裂开,一瓶酒一包烟,一个算法写一天。
这调试的代码成功让他上了个百行,炸裂,感觉有一次可以解的算法,懒得想了,线段树+树状数组你俩辛苦下搁这磨吧。

#include<bits/stdc++.h>
using namespace std;const int N=2e5+10;
int tree[N];
int a[N],high[N];
int b[N];
int Step[N];int se_Tr_se;int segement_tree[N<<2];
void update(int l,int r,int node,int x,int y){int mid=l+r>>1;if(l==r) {segement_tree[node]=y;return ;}if(x>mid) update(mid+1,r,(node<<1)+1,x,y);else update(l,mid,node<<1,x,y);if(Step[segement_tree[node<<1]]>Step[segement_tree[(node<<1)+1]]){segement_tree[node]=segement_tree[node<<1];}else{segement_tree[node]=segement_tree[(node<<1)+1];}
}
int query(int l,int r,int node,int L,int R){if(l==L&&r==R) return segement_tree[node];int mid=l+r>>1;if(L>mid) return query(mid+1,r,(node<<1)+1,L,R);if(R<=mid) return query(l,mid,node<<1,L,R);int lidx=query(l,mid,node<<1,L,mid);int ridx=query(mid+1,r,(node<<1)+1,mid+1,R);if(Step[lidx]>Step[ridx]) return lidx;else return ridx;
}
int swap(int st){// cout<<st<<endl;// for(int i=1;i<=st;i++){//     cout<<query(1,se_Tr_se,1,i,i)<<" ";// }puts("");// cout<<query(1,se_Tr_se,1,1,st)<<endl;int ans=0;int tmp;// int l=1,r=st,mid=l+r>>1;// while(l<r){//     if(query(1,se_Tr_se,1,1,mid)>st) r=mid;//     else l=mid+1;//     mid=l+r>>1;// }int idx=query(1,se_Tr_se,1,1,st);tmp=Step[idx];if(tmp>st){ans=tmp-st;Step[idx]=st;update(1,se_Tr_se,1,idx,idx);ans+=swap(tmp);}return ans;
}int lowbit(int x){return x&-x;
}
void add(int x,int y,int len){while(x<=len){tree[x]+=y;x+=lowbit(x);}
}
int query(int x){int ans=0;while(x){ans+=tree[x];x-=lowbit(x);}return ans;
}bool cmp(int x,int y){        if(a[x] == a[y]) return x<y;return a[x]<a[y];
}
bool check(int l,int r){return query(r)-query(l-1) == r-l+1;
}
long long in_step(long long ans,int h,int &num,int tree_se){if(!Step[h]){Step[h]=h;update(1,se_Tr_se,1,h,h);add(h,1,tree_se);num++;ans+=h-1-query(h-1);ans-=num-query(h);}else{ans-=Step[h]-h;int st=Step[h];Step[h]=h;update(1,se_Tr_se,1,h,h);int l=1,r=h,mid=l+r>>1;while(l<r){if(check(mid,h)) r=mid-1;else l=mid;mid=l+r+1>>1;}if(!Step[l]){Step[l]=st;update(1,se_Tr_se,1,l,l);add(l,1,tree_se);num++;ans+=st-l;ans+=l-1-query(l-1);ans-=num-query(l);}else ans-=swap(st);}return ans;
}
void init(int size){se_Tr_se=size;for(int i=1;i<=size;i++){tree[i]=0;Step[i]=0;update(1,se_Tr_se,1,i,i);}
}
void solve(){int n,use=0;scanf("%d",&n);init(n);for(int i=1;i<=n;i++){scanf("%d",a+i);b[i]=i;}sort(b+1,b+n+1,cmp);int step = 0;for(int i=1;i<=n;i++){if(a[b[i]]>step) step++;high[b[i]]=step;}// for(int i=1;i<=n;i++){//     cout<<high[i]<<' ';// }puts("");long long ans=0;for(int i=1;i<=n;i++){// cout<<high[i]<<' '<<a[i]<<endl;ans+=a[i]-high[i];ans=in_step(ans,high[i],use,n);// for(int j=1;j<=n;j++){//     cout<<Step[j]<<' ';// }cout<<endl;// for(int j=1;j<=n;j++){//     cout<<tree[j]<<' ';// }cout<<endl;printf("%lld ",ans);//cout<<endl;cout<<endl;}puts("");
}
int main(){int t;cin >> t;while(t--)solve();
}

这篇关于E. Monsters (hard version)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/417918

相关文章

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分辨率的效果 效果: 但是这样图像太锐利了,我们加入噪声去解决这个问题 [numthreads(8, 8, 1)]void CSMain(uint3 id

HDU 1097 A hard puzzle(规律)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=1097 题意: 求a的b次方的最后一位。 题解: 直接从例子入手, 第一组数据 7 66,结果如下(只要最后一位所以模10) 7 9 3 1 7 9··· 循环节为4,即结果在4个数值内循环出现。 第二组数据 6 800,结果如下 6 6 6 6··· 循环节为1 ···

Unsupported major.minor version 52.0 错误解决方法

自己前些天的项目突然出现这个问题,经过仔细排查,发现有两个原因都会导致这个问题。 第一个就是POM文件中的dependency重复,如果使用的是maven导入,重复写入dependency就会出现该错误。 第二个是版本不匹配,即所引用的jar包太新,并不匹配你的jdk,因为我们正常用的都是jdk7,但是现在已经更新到jdk10了,好多最新版本最新版本的jar包都是基于最新的jdk编写,所以可以

#error: Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version

昨天编译文件时出现了Building MFC application with /MD[d] (CRT dll version)requires MFC shared dll version~~~~的错误。   在网上很容易找到了解决的方案,公布如下:   对着你的项目点击右键,依次选择:属性、配置属性、常规,然后右边有个“项目默认值”,下面有个MFC的使用,选择“在共享 DLL 中使

EasyConnect 现实 Harfbuzz version too old 解决方案

https://www.cnblogs.com/cocode/p/12890684.html

Update Azure OpenAI npm Package to 2023-12-01-preview Version

题意:将 Azure OpenAI npm 包更新到 2023-12-01-preview 版本 问题背景: I am currently using the azure-openai npm package in my project with version 2023-03-15-preview. As per the latest updates, version 2023-12

Error:Undetermined Visual Studio Version

在编译PostgreSQL时遇到错误: ------          Unable to determine Visual Studio version: The nmake version couldnot be determined. at src/tools/msvc/Mkvcbuild.pm line 解决: 第一种方案:修改src\tools\msvc\VSObjectFacto