裸题...

  依旧是写了BIT和线段树两种(才不是写完线段树后才想起来可以写BIT呢

  怎么卡常数都挺大...QAQ ccz和yy的写法好快哇%%%

BIT:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int fir,sec,trd,ty,pos,w;}a[maxn];
int n,m,x,y,z,cnt,N,x1,x2,y1,y2;
int b[maxn];
ll tree[maxn],ans[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline bool cmp(poi a,poi b){return a.fir==b.fir?a.ty<b.ty:a.fir<b.fir;}
inline int lowbit(int x){return x&-x;}
inline void add(int x,int delta){for(;x<=N;x+=lowbit(x))tree[x]+=delta;}
inline ll query(int x){ll sum=;for(;x;x-=lowbit(x))sum+=tree[x];return sum;}
int main()
{
read(n);read(m);cnt=n;
for(int i=;i<=n;i++)
{
read(x);read(y);read(z);
a[i].fir=x;a[i].sec=y;a[i].w=z;b[++N]=y;
}
for(int i=;i<=m;i++)
{
read(x1);read(y1);read(x2);read(y2);
a[++cnt].fir=x1;a[cnt].sec=y1;a[cnt].trd=y2;a[cnt].ty=-;a[cnt].pos=i;
a[++cnt]=a[cnt-];a[cnt].fir=x2;a[cnt].ty=;b[++N]=y1;b[++N]=y2;
}
sort(b+,b++N);
for(int i=;i<=n;i++)a[i].sec=lower_bound(b+,b++N,a[i].sec)-b;
for(int i=n+;i<=cnt;i+=)
{
a[i].sec=a[i+].sec=lower_bound(b+,b++N,a[i].sec)-b;
a[i].trd=a[i+].trd=lower_bound(b+,b++N,a[i].trd)-b;
}
sort(a+,a++cnt,cmp);
for(int i=;i<=cnt;i++)
{
if(a[i].ty)
{
ll sum=query(a[i].trd)-query(a[i].sec-);
ans[a[i].pos]+=(a[i].ty==?sum:-sum);
}
else add(a[i].sec,a[i].w);
}
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
return ;
}

线段树:

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int fir,sec,trd,ty,pos,w;}a[maxn];
int n,m,x,y,z,cnt,N,x1,x2,y1,y2;
int b[maxn];
ll tree[maxn*],ans[maxn];
void read(int &k)
{
int f=;k=;char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(c<=''&&c>='')k=k*+c-'',c=getchar();
k*=f;
}
inline bool cmp(poi a,poi b){return a.fir==b.fir?a.ty<b.ty:a.fir<b.fir;}
inline void pushup(int x){tree[x]=tree[x<<]+tree[x<<|];}
inline void add(int x,int l,int r,int cx,int delta)
{
if(l==r){tree[x]+=delta;return;}
int mid=(l+r)>>;
if(cx<=mid)add(x<<,l,mid,cx,delta);
else add(x<<|,mid+,r,cx,delta);
pushup(x);
}
inline ll query(int x,int l,int r,int cl,int cr)
{
if(cl<=l&&r<=cr)return tree[x];
int mid=(l+r)>>;ll ret=;
if(cl<=mid)ret+=query(x<<,l,mid,cl,cr);
if(cr>mid)ret+=query(x<<|,mid+,r,cl,cr);
return ret;
}
int main()
{
read(n);read(m);cnt=n;
for(int i=;i<=n;i++)
{
read(x);read(y);read(z);
a[i].fir=x;a[i].sec=y;a[i].w=z;b[++N]=y;
}
for(int i=;i<=m;i++)
{
read(x1);read(y1);read(x2);read(y2);
a[++cnt].fir=x1;a[cnt].sec=y1;a[cnt].trd=y2;a[cnt].ty=-;a[cnt].pos=i;
a[++cnt]=a[cnt-];a[cnt].fir=x2;a[cnt].ty=;b[++N]=y1;b[++N]=y2;
}
sort(b+,b++N);
for(int i=;i<=n;i++)a[i].sec=lower_bound(b+,b++N,a[i].sec)-b;
for(int i=n+;i<=cnt;i+=)
{
a[i].sec=a[i+].sec=lower_bound(b+,b++N,a[i].sec)-b;
a[i].trd=a[i+].trd=lower_bound(b+,b++N,a[i].trd)-b;
}
sort(a+,a++cnt,cmp);
for(int i=;i<=cnt;i++)
{
if(a[i].ty)
{
ll sum=query(,,N,a[i].sec,a[i].trd);
ans[a[i].pos]+=(a[i].ty==?sum:-sum);
}
else add(,,N,a[i].sec,a[i].w);
}
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
return ;
}

在yy大爷的指导下卡了一波常...艹上了#7,但是写得丑还是写得丑比yy大爷还是慢不少

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<map>
#define ll long long
using namespace std;
const int maxn=,inf=1e9;
struct poi{int fir,sec,trd,ty,pos;}a[maxn];
int n,m,x,y,z,cnt,N,x1,x2,y1,y2;
int b[maxn],w[maxn];
ll tree[maxn],ans[maxn];
char buf[],*ptr=buf-;
int read()
{
int x=,f=,c=*++ptr;
while(c<)c=='-'&&(f=-),c=*++ptr;
while(c>)x=x*+c-,c=*++ptr;
return x*f;
}
inline bool cmp(poi a,poi b){return a.fir==b.fir?a.ty<b.ty:a.fir<b.fir;}
inline int lowbit(int x){return x&-x;}
inline void add(int x,int delta){for(;x<=N;x+=lowbit(x))tree[x]+=delta;}
inline ll query(int x){ll sum=;for(;x;x-=lowbit(x))sum+=tree[x];return sum;}
int main()
{
fread(buf,,sizeof(buf),stdin)[buf]=;
n=read();m=read();cnt=n;
for(int i=;i<=n;i++)
{
x=read();y=read();w[i]=read();
a[i].fir=x;a[i].sec=y;a[i].pos=i;b[++N]=y;
}
for(int i=;i<=m;i++)
{
x1=read();y1=read();x2=read();y2=read();
a[++cnt].fir=x1;a[cnt].sec=y1;a[cnt].trd=y2;a[cnt].ty=-;a[cnt].pos=i;
a[++cnt]=a[cnt-];a[cnt].fir=x2;a[cnt].ty=;
}
sort(b+,b++N);
for(int i=;i<=n;i++)a[i].sec=lower_bound(b+,b++N,a[i].sec)-b;
for(int i=n+;i<=cnt;i+=)
{
a[i].sec=a[i+].sec=lower_bound(b+,b++N,a[i].sec)-b;
a[i].trd=a[i+].trd=upper_bound(b+,b++N,a[i].trd)-b-;
}
sort(a+,a++cnt,cmp);
for(int i=;i<=cnt;i++)
{
if(a[i].ty)
{
ll sum=query(a[i].trd)-query(a[i].sec-);
ans[a[i].pos]+=(a[i].ty==?sum:-sum);
}
else add(a[i].sec,w[a[i].pos]);
}
for(int i=;i<=m;i++)printf("%lld\n",ans[i]);
return ;
}

bzoj4822: [Cqoi2017]老C的任务(扫描线+BIT/线段树)的更多相关文章

  1. [BZOJ4822][CQOI2017]老C的任务(扫描线+树状数组)

    4822: [Cqoi2017]老C的任务 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 379  Solved: 203[Submit][Statu ...

  2. [bzoj4822][Cqoi2017]老C的任务&[bzoj1935][Shoi2007]Tree 园丁的烦恼

    来自FallDream的博客,未经允许,请勿转载,谢谢. 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松地完成 ...

  3. HDU - 1542 扫描线入门+线段树离散化

    扫描线算法+线段树维护简介: 像这种求面积的并集的题目,就适合用扫描线算法解决,具体来说就是这样 类似这种给出点的矩形的对角的点的坐标,然后求出所有矩形面积的交集的问题,可以采用扫描线算法解决.图如下 ...

  4. Atlantis HDU - 1542 (扫描线,线段树)

    扫描线的模板题,先把信息接收,然后排序,记录下上边和下边,然后用一条虚拟的线从下往上扫.如果我扫到的是下边,那么久用线段树在这个区间内加上1,表示这个区间现在是有的,等我扫描到上边的时候在加上-1,把 ...

  5. poj 2482 Stars in Your Window + 51Nod1208(扫描线+离散化+线段树)

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13196   Accepted:  ...

  6. 【BZOJ 3958】 3958: [WF2011]Mummy Madness (二分+扫描线、线段树)

    3958: [WF2011]Mummy Madness Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 96  Solved: 41 Descripti ...

  7. 洛谷 P4125 [WC2012]记忆中的水杉树【扫描线+set+线段树】

    我没有找到能在bzojAC的代码--当然我也WA了--但是我在洛谷过了,那就假装过了吧 minmax线段树一开始写的只能用min更新min,max更新max,实际上是可以互相更新的-- 首先看第二问, ...

  8. BZOJ4822[Cqoi2017]老C的任务——树状数组(二维数点)

    题目描述 老 C 是个程序员.     最近老 C 从老板那里接到了一个任务——给城市中的手机基站写个管理系统.作为经验丰富的程序员,老 C 轻松 地完成了系统的大部分功能,并把其中一个功能交给你来实 ...

  9. [BZOJ4822] [CQOI2017] 老C的任务

    题目链接 BZOJ:https://lydsy.com/JudgeOnline/problem.php?id=4822. 洛谷:https://www.luogu.org/problemnew/sho ...

随机推荐

  1. cf#514B. Forgery(暴力)

    B. Forgerytime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputsta ...

  2. Siki_Unity_1-2_Unity5.2入门课程_进入Unity开发的奇幻世界_Roll A Ball

    1-2 Unity5.2入门课程 进入Unity开发的奇幻世界 任务1:Roll A Ball项目简介 Unity官网的tutorial入门项目 方向键控制小球在平台上滚动,碰撞方块得分,消掉所有方块 ...

  3. Java并发基础--volatile关键字

    一.java内存模型 1.java内存模型 程序运行过程中的临时数据是存放在主存(物理内存)中,但是现代计算机CPU的运算能力和速度非常的高效,从内存中读取和写入数据的速度跟不上CPU的处理速度,在这 ...

  4. [Clr via C#读书笔记]Cp9参数

    Cp9参数 可选参数和命名参数 参数设置了默认值(设置要从右到左,有默认值的参数必须放在没有默认值的参数的后面,默认值必须是常量),就可以使用可选参数和命名参数了.向方法传递实参的时候,编译器按照从左 ...

  5. java学习笔记-8.对象的容纳

    1.Iterator(迭代器)和Enumeration(枚举类),都是用来遍历集合的,他们都是接口.区别是Enumeration只能读取集合的数据,而Iterator可以对数据进行删除,Iterato ...

  6. CVPR-2018 那些有趣的新想法

    Taylor Guo @ Shanghai - 2018.10.18 缘起 还有什么比顶级会议更适合寻找有趣新想法的地方吗?我们从CVPR 2018 计算机视觉和模式识别的顶级会议中发现了很多有趣的东 ...

  7. ServiceStack.Ormlit 使用Insert的时候自增列不会被赋值

    Insert签名是这样的,将第2个参数设置为true就会返回刚插入的自增列ID了,然后可以手工赋值到对象上面去 public static long Insert<T>(this IDbC ...

  8. POJ 2987 Firing(最大流最小割の最大权闭合图)

    Description You’ve finally got mad at “the world’s most stupid” employees of yours and decided to do ...

  9. 项目uml

    [团队信息] 团队项目: 小葵日记--主打记录与分享模式的日记app 队名:日不落战队 队员信息及贡献分比例: 短学号 名 本次作业博客链接 此次作业任务 贡献分配 备注 501 安琪 http:// ...

  10. iOS- iOS 7 的后台多任务 (Multitasking) 对比之前的异同、具体机制、变化

    简单来说,这玩意是对开发者友好,但对设备不友好的(可能会偷偷摸摸地占用流量和电量).对用户来说,如果你带宽够,对发热不敏感的话,会得到更好的应用体验. 从 iOS 4 开始,应用就可以在退到后台后,继 ...