树状数组&二维树状数组模板
2016-04-12 16:00
375 查看
树状数组模板
模板题:http://poj.org/problem?id=2352
题解:
二维树状数组模板:
同样很简单,注意数组尽量开大,树状数组会产生未知原因的溢出
模板题: 【poj 1195】Mobile phones http://poj.org/problem?id=1195" target=_blank>http://poj.org/problem?id=1195
(题意即:每行第一个数,如果为0,后面一个数字s,表示给出一个s*s的矩阵,初始化为均为0,如果为 1 :(X Y A)对位于坐标(X Y)的值加A;如果为 2:(L B R T)求出位于L<=x<=R,B<=y<=T的值的和;如果为 3:结束程序。 )
int lowbit(int x) { return (x&(-x));} int add(int x,int val) { for (;x<=40000;x+=lowbit(x)) c[x]+=val; } int que(int x) { int ans=0; for (;x>0;x-=lowbit(x)) ans+=c[x]; return ans; }
模板题:http://poj.org/problem?id=2352
题解:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int c[300000],rank[300000];
int n;
int lowbit(int x) { return (x&(-x));} int add(int x,int val) { for (;x<=40000;x+=lowbit(x)) c[x]+=val; } int que(int x) { int ans=0; for (;x>0;x-=lowbit(x)) ans+=c[x]; return ans; }
int main()
{
cin>>n;
for (int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
x++;y++;
add(x);
rank[que(x)]++;
}
for (int i=1;i<=n;i++)
printf("%d\n",rank[i]);
}
二维树状数组模板:
int lowbit(int x) { return (x&(-x)); } int add(int x,int y,int val) { for (int i=x;i<=s;i+=lowbit(i)) for (int j=y;j<=s;j+=lowbit(j)) c[i][j]+=val; } int que(int x,int y) { int ans=0; for (int i=x;i>0;i-=lowbit(i)) for (int j=y;j>0;j-=lowbit(j)) ans+=c[i][j]; return ans; }
同样很简单,注意数组尽量开大,树状数组会产生未知原因的溢出
模板题: 【poj 1195】Mobile phones http://poj.org/problem?id=1195" target=_blank>http://poj.org/problem?id=1195
(题意即:每行第一个数,如果为0,后面一个数字s,表示给出一个s*s的矩阵,初始化为均为0,如果为 1 :(X Y A)对位于坐标(X Y)的值加A;如果为 2:(L B R T)求出位于L<=x<=R,B<=y<=T的值的和;如果为 3:结束程序。 )
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int s;
int c[2050][2050];
int lowbit(int x) { return (x&(-x)); } int add(int x,int y,int val) { for (int i=x;i<=s;i+=lowbit(i)) for (int j=y;j<=s;j+=lowbit(j)) c[i][j]+=val; } int que(int x,int y) { int ans=0; for (int i=x;i>0;i-=lowbit(i)) for (int j=y;j>0;j-=lowbit(j)) ans+=c[i][j]; return ans; }
int main()
{
int p,n,m,a,b;
while(cin>>p)
{
if (p==3) return 0;
if (p==0) {scanf("%d",&s);
for (int i=1;i<=s+100;i++)
for (int j=1;j<=s+100;j++)
c[i][j]=0;
}
if (p==1)
{
scanf("%d%d%d",&a,&b,&n);
a++;b++;
add(a,b,n);
}
else if (p==2)
{
scanf("%d%d%d%d",&a,&b,&n,&m);
a++;b++;n++;m++;
int ans;
ans=que(n,m)-que(a-1,m)-que(n,b-1)+que(a-1,b-1);
printf("%d\n",ans);
}
}
}
相关文章推荐
- iOS URLEcode,URLDecode
- Tyvj_P1002
- 教你怎么干净卸载MySql
- 分布式版本控制系统Git------git工作区和主要对象
- freemarker+spring中文乱码的解决
- 【df】显示磁盘分区使用情况
- 【dumpe2fs】显示文件系统属性信息(更加详细)
- CentOS7下Oracle11gR2监听启动错误解决
- MongoDB快速入门(五)- Where子句
- 浅谈JSON.parse()、JSON.stringify()和eval()的作用
- orcale 查询
- session,cookie
- 指针学习笔记
- nginx-Brew安装lua模块
- 杭电ACM1003
- CMT跟踪算法笔记
- android(NDK+JNI)---NDK的Paths and Symbols设定
- 常用FTP命令
- NSAttributedString initWithData 阻塞App问题
- 树状数组