lightoj1087 【线段树】
2024-09-07 16:47:36
题意:
给你n个数,然后给你q个询问,有两种询问:
a: 表示在右边插入一个数
c:表示从左边拿出一个数,然后输出;
思路:
一开始在想,自己手上的黑科技:线段树和树状数组
线段树上的操作:
求区间最大,没说区间第几个啊;
树状数组:
搞一发前缀和,妈个鸡,树状数组还需要知道下标和位置;
还有什么:
数组,感觉黑科技没什么了;
然后。。。
线段树维护区间有多少个数,好像很对啊,初始化建树就是n+q长度的区间,然后每次插入就是第n+i个,每次插入,删除都是log级别的;
后来线段树打完居然没什么错,感动啊;
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10; struct SegT{
bool flag;
int left,right;
int num,v;
};
SegT q[N*4];
int n,Q; void Build(int num,int L,int R)
{
q[num].left=L;
q[num].right=R;
if(L==R)
{
if(L<=n)
{
scanf("%d",&q[num].v);
q[num].flag=true;
q[num].num=1;
return;
}
else
{
q[num].flag=false;
q[num].num=0;
return;
}
}
int mid=(L+R)/2;
Build(2*num, L,mid);
Build(2*num+1,mid+1,R);
q[num].num=q[2*num].num+q[2*num+1].num;
} void add(int num,int id,int x)
{
if(q[num].left==id&&q[num].left==q[num].right)
{
q[num].flag=true;
q[num].v=x;
q[num].num=1;
return;
}
int mid=(q[num].left+q[num].right)/2;
if(mid>=id)
add(2*num,id,x);
else
add(2*num+1,id,x);
q[num].num=q[2*num].num+q[num*2+1].num;
} int DEL(int num,int id)
{
if(q[num].left==q[num].right)
{
q[num].num=0;
q[num].flag=false;
return q[num].v;
}
int ans=0;
if(q[2*num].num>=id)
ans=DEL(2*num,id);
else
ans=DEL(2*num+1,id-q[2*num].num);
q[num].num=q[2*num].num+q[2*num+1].num;
return ans;
} int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
char txp[5];
int temp;
scanf("%d%d",&n,&Q);
Build(1,1,n+Q);
printf("Case %d:\n",cas++);
for(int i=1;i<=Q;i++)
{
scanf("%s%d",txp,&temp);
if(txp[0]=='a')
add(1,n+i,temp);
else
{
if(q[1].num<temp)
puts("none");
else
printf("%d\n",DEL(1,temp));
}
}
}
return 0;
}
最新文章
- npm相关
- [MS bug]安装SQL Server 2008 错误:is not a valid login or you do not have permission
- hbase的rowkey简单设计
- Spring框架整合Struts2
- mysql 5.6 参数详解
- Hadoop学习-HDFS篇
- 微信账号 echo_server 的实现
- Android 打造任意层级树形控件 考验你的数据结构和设计
- Python爬取豆瓣指定书籍的短评
- Vue.js简单记录
- pandas 对象中 to_pickle 方法参数命名问题,不能用frame
- vue浏览器滚动加载更多
- caffe 利用VGG训练自己的数据
- shell实现每天0点备份mysql数据库
- C/C++——程序的内存分配
- Python装饰器几个有用又好玩的例子
- 使用Fiddler手机抓包https-----重要
- Windows Server 2012如何实现双网卡绑定
- golang web开发获取get、post、cookie参数
- 记录一下idea的破解方法
热门文章
- Sum It Up POJ 1564 HDU 杭电1258【DFS】
- EasyDarwin开源流媒体云平台之EasyRMS录播服务器功能设计
- Vue 单页面应用 SEO SPA single page application advantages and disadvantages
- Performance Tuning Using Linux Process Management Commands
- EM算法索引
- [Usaco2005 Dec]Cleaning Shifts 清理牛棚
- 【C++基础学习】成员对象与对象数组
- selenium2 浏览器版本问题
- Redis相关的内核参数解释与设置
- 向HTML页面传入参数