主席树 - Luogu 1001 A+B problem
2024-09-07 02:30:09
看着大佬们的解法我瑟瑟发抖
我用主席树写一写吧
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
inline int gotcha()
{
register int _a=0;bool _b=1;register char _c=getchar();
while((_c<'0' || _c>'9') && _c!='-')_c=getchar();
if(_c=='-')_b=0,_c=getchar();
while(_c>='0' && _c<='9')_a=_a*10+_c-48,_c=getchar();
return _b?_a:-_a;
}
const int _ = 1000002,__ = 20*_;
int a[_],n,root[__]={0},ch[__][2]={0},da[__],cnt;
inline void plant(int &d,int l,int r)
{
d=++cnt;
if(l==r){da[d]=a[l];return;}
int mid=(l+r)>>1;
plant(ch[d][0],l,mid),plant(ch[d][1],mid+1,r);
}
inline void insert(int &d,int pre,int l,int r,int tar,int dat)
{
d=++cnt,ch[d][0]=ch[pre][0],ch[d][1]=ch[pre][1],da[d]=da[pre];
if(l==r){da[d]=dat;return;}
int mid=(l+r)>>1;
if(tar<=mid)insert(ch[d][0],ch[pre][0],l,mid,tar,dat);
else insert(ch[d][1],ch[pre][1],mid+1,r,tar,dat);
}
inline int finder(int d,int l,int r,int tar)
{
if(l==r)return da[d];
int mid=(l+r)>>1;
if(tar<=mid)return finder(ch[d][0],l,mid,tar);
else return finder(ch[d][1],mid+1,r,tar);
}
int main()
{
register int i;
n=2;
for(i=1;i<=n;i++)a[i]=gotcha();
plant(root[0],1,n);
i=finder(root[0],1,n,1)+finder(root[0],1,n,2);
printf("%d\n",i);
return 0;
}
常数巨大,不要被我误导……
最新文章
- 修复 XE8 for Android 分享图片到 Gmail 权限不足的问题
- hihoCoder #1182 欧拉路&#183;三 (变形)
- 转--利用函数模板技术,写一个简单高效的 JSON 查询器
- CSS+DIV 布局三种定位方式
- 多站点FTP同步
- WPF 启动初始界面
- SqlHelper 帮助文档及详解--项目初步搭建
- C#Windows的HelloWorld
- Spring4 SpringMVC Hibernate4 Freemaker 集成示例
- Git如何检出指定目录或文件
- asp.net core重新加载应用配置
- python3 函数传参练习 全局变量与局部变量 的理解
- 019_UT、IT、ST、UAT
- CentOS7安装及简单配置(一)
- c#操作SQL Server入门总结
- 杨其菊/常惠琢《面向对象程序设计(java)》第十一周学习总结
- SpringBoot开发案例之整合Dubbo分布式服务
- 列式数据库~clickhouse日常管理
- js学习——基础知识
- [转]如何将mysql表结构导出成Excel格式的(并带备注)