csu1335区间更新,求单点
2017-08-24 15:35
120 查看
题目链接:点击打开链接
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int n,cunt,k;
int sum[maxn<<2],col[maxn<<2];
void Pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Pushdown(int rt,int len)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=(len-(len>>1))*col[rt];
sum[rt<<1|1]+=(len>>1)*col[rt];
col[rt]=0;
}
}
void build(int l,int r,int rt)
{
col[rt]=0;
sum[rt]=0;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
Pushup(rt);
}
void update(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]+=1;
sum[rt]+=(r-l+1); //父节点是每次就更新,子节点才延迟更新
return ;
}
Pushdown(rt,r-l+1);
int m=(r+l)>>1;
if(L<=m)update(L,R,lson);
if(R>m)update(L,R,rson);
Pushup(rt);
}
void print(int l,int r,int rt,int n)
{
if(l==r)
{
if(sum[rt]>=k)cunt++;
return;
}
Pushdown(rt,r-l+1);
int m=(l+r)>>1;
print(lson,n);
print(rson,n);
}
int main()
{
int i,j,m,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{
memset(sum,0,sizeof(sum));
memset(col,0,sizeof(col));
cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,r,1,n,1);
pre=tui;
}
print(1,n,1,i);
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}
树状数组
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int c[maxn];
int n;
int Lowbit(int x) // 2^k
{
return x&(-x);
}
void update(int i, int x)//i点增量为x
{
while(i <= n)
{
c[i] += x;
i += Lowbit(i);
}
}
int sum(int x)//区间求和 [1,x]
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=Lowbit(x);
}
return sum;
}
int Getsum(int x1,int x2) //求任意区间和
{
return sum(x2) - sum(x1-1);
}
int main()
{
int i,j,m,k,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{
memset(c,0,sizeof(c));
int cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,1);
update(r+1,-1);
pre=tui;
}
for(i=1;i<=n;i++)if(sum(i)>=k)cunt++;
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int n,cunt,k;
int sum[maxn<<2],col[maxn<<2];
void Pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void Pushdown(int rt,int len)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=(len-(len>>1))*col[rt];
sum[rt<<1|1]+=(len>>1)*col[rt];
col[rt]=0;
}
}
void build(int l,int r,int rt)
{
col[rt]=0;
sum[rt]=0;
if(l==r)
return;
int m=(l+r)>>1;
build(lson);
build(rson);
Pushup(rt);
}
void update(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]+=1;
sum[rt]+=(r-l+1); //父节点是每次就更新,子节点才延迟更新
return ;
}
Pushdown(rt,r-l+1);
int m=(r+l)>>1;
if(L<=m)update(L,R,lson);
if(R>m)update(L,R,rson);
Pushup(rt);
}
void print(int l,int r,int rt,int n)
{
if(l==r)
{
if(sum[rt]>=k)cunt++;
return;
}
Pushdown(rt,r-l+1);
int m=(l+r)>>1;
print(lson,n);
print(rson,n);
}
int main()
{
int i,j,m,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{
memset(sum,0,sizeof(sum));
memset(col,0,sizeof(col));
cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,r,1,n,1);
pre=tui;
}
print(1,n,1,i);
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}
树状数组
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int maxn=1e5+10;
int c[maxn];
int n;
int Lowbit(int x) // 2^k
{
return x&(-x);
}
void update(int i, int x)//i点增量为x
{
while(i <= n)
{
c[i] += x;
i += Lowbit(i);
}
}
int sum(int x)//区间求和 [1,x]
{
int sum=0;
while(x>0)
{
sum+=c[x];
x-=Lowbit(x);
}
return sum;
}
int Getsum(int x1,int x2) //求任意区间和
{
return sum(x2) - sum(x1-1);
}
int main()
{
int i,j,m,k,zhang,tui,pre,l,r;
int a[maxn];
int ans=0;
while(~scanf("%d %d %d",&n,&m,&k))
{
memset(c,0,sizeof(c));
int cunt=0;
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int pre=0;
while(m--)
{
scanf("%d %d",&zhang,&tui);
r=lower_bound(a+1,a+n+1,zhang)-a;
l=lower_bound(a+1,a+n+1,pre)-a;
if(r==n)r--;
else if(a[r]!=zhang)r--;
if(a[l]==pre)l++;
update(l,1);
update(r+1,-1);
pre=tui;
}
for(i=1;i<=n;i++)if(sum(i)>=k)cunt++;
printf("Case %d: %d\n",++ans,cunt);
}
return 0;
}
相关文章推荐
- csu 1770 按钮控制彩灯实验(树状数组区间更新)
- CSU-1110 RMQ with Shifts (单点更新+区间最小值 zkw线段树)
- 线段树-区间单个点更新-区间和-区间最大
- HDU 1754 I hate it(线段树。单点更新, 区间查询)
- Color the ball HDU - 1556 线段树区间更新点查询
- POJ3468 - A Simple Problem with Integers (线段树 区间更新)
- 线段树区间更新(1)(区间同时加上x)模板(序号从0开始)O(logn)(poj3468)
- poj 3468 A Simple Problem with Integers(线段树+树状数组区间更新区间查询)
- 线段树区间更新(2)(lazy)(区间都变为v)(序号从1开始)(O(logn))模板(hdu1698)
- NYOJ 116 士兵杀敌(二)(线段树区间求和+单点更新)
- HDU 1166 敌兵布阵 数据结构+树状数组+(单点更新区间求和)
- ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)
- HDU 5361 In Touch (2015 多校6 1009 最短路 + 区间更新)
- ZOJ3299:Fall the Brick(区间更新)
- hdu1698 Just a Hook--区间更新
- POJ3468 A Simple Problem with Integers 线段树区间更新
- hdu 4578 Transformation [线段树 区间更新]
- codeforces 777E. Hanoi Factory (LIS+dp+树状数组/线段树维护区间最大值及单点更新)
- 单点更新 “区间和”最值查询 线段树解法 和 BIT解法 杭电hdu1166
- CSU 1620: A Cure for the Common Code(KMP+区间DP)