Codeforces-446(Div.2)-B-Wrath--(线段树区间更新)
2017-11-18 10:18
405 查看
B. Wrath
time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
[align=left]Hands that shed innocent blood![/align]
There are n guilty people in a line, the
i-th of them holds a claw with length
Li. The bell rings and every person kills some of people in front of him. All people kill others at the same time. Namely, the
i-th person kills the
j-th person if and only if j < i and
j ≥ i - Li.
You are given lengths of the claws. You need to find the total number of alive people after the bell rings.
Input
The first line contains one integer n (1 ≤ n ≤ 106) — the number of guilty people.
Second line contains n space-separated integers
L1, L2, ..., Ln (0 ≤ Li ≤ 109),
where Li is the length of the
i-th person's claw.
Output
Print one integer — the total number of alive people after the bell rings.
Examples
Input
Output
Input
Output
Input
Output
Note
In first sample the last person kills everyone in front of him.
题意:每个人有长度为ai的武器,可以杀死他左边在攻击范围之内的人
思路:没有想到简单一点的办法,用线段树区间更新了一下,最后查询活着获得人数
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 1000100
using namespace std;
int n;
struct node
{
int l,r;
int tag;//为1代表活着,为0代表被杀死了
}tree[maxn*4];
void build(int root,int l,int r)
{
tree[root].l=l;
tree[root].r=r;
tree[root].tag=1;
if(l==r)
return;
int mid=(l+r)>>1;
build(root<<1,l,mid);
build(root<<1|1,mid+1,r);
}
void pushdown(int root)
{
if(tree[root].tag==0)
{
tree[root<<1].tag=0;
tree[root<<1|1].tag=0;
tree[root].tag=1;
}
}
void update(int root,int l,int r)
{
int ll=tree[root].l;
int rr=tree[root].r;
if(l<=ll&&rr<=r){
tree[root].tag=0;
return;
}
pushdown(root);
int mid=(ll+rr)>>1;
if(l<=mid) update(root<<1,l,r);
if(r>mid) update(root<<1|1,l,r);
}
int query(int root,int p)
{
int ll=tree[root].l;
int rr=tree[root].r;
if(ll==rr)
return tree[root].tag;
pushdown(root);
int mid=(ll+rr)>>1;
if(p<=mid) return query(root<<1,p);
else return query(root<<1|1,p);
}
int main()
{
while(~scanf("%d",&n))
{
int x;
build(1,1,n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==0||i==1) continue;
int mi=max(1,i-x);
update(1,mi,i-1);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(query(1,i))
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
[align=left]Hands that shed innocent blood![/align]
There are n guilty people in a line, the
i-th of them holds a claw with length
Li. The bell rings and every person kills some of people in front of him. All people kill others at the same time. Namely, the
i-th person kills the
j-th person if and only if j < i and
j ≥ i - Li.
You are given lengths of the claws. You need to find the total number of alive people after the bell rings.
Input
The first line contains one integer n (1 ≤ n ≤ 106) — the number of guilty people.
Second line contains n space-separated integers
L1, L2, ..., Ln (0 ≤ Li ≤ 109),
where Li is the length of the
i-th person's claw.
Output
Print one integer — the total number of alive people after the bell rings.
Examples
Input
4 0 1 0 10
Output
1
Input
2 0 0
Output
2
Input
10 1 1 3 0 0 0 2 1 0 3
Output
3
Note
In first sample the last person kills everyone in front of him.
题意:每个人有长度为ai的武器,可以杀死他左边在攻击范围之内的人
思路:没有想到简单一点的办法,用线段树区间更新了一下,最后查询活着获得人数
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 1000100
using namespace std;
int n;
struct node
{
int l,r;
int tag;//为1代表活着,为0代表被杀死了
}tree[maxn*4];
void build(int root,int l,int r)
{
tree[root].l=l;
tree[root].r=r;
tree[root].tag=1;
if(l==r)
return;
int mid=(l+r)>>1;
build(root<<1,l,mid);
build(root<<1|1,mid+1,r);
}
void pushdown(int root)
{
if(tree[root].tag==0)
{
tree[root<<1].tag=0;
tree[root<<1|1].tag=0;
tree[root].tag=1;
}
}
void update(int root,int l,int r)
{
int ll=tree[root].l;
int rr=tree[root].r;
if(l<=ll&&rr<=r){
tree[root].tag=0;
return;
}
pushdown(root);
int mid=(ll+rr)>>1;
if(l<=mid) update(root<<1,l,r);
if(r>mid) update(root<<1|1,l,r);
}
int query(int root,int p)
{
int ll=tree[root].l;
int rr=tree[root].r;
if(ll==rr)
return tree[root].tag;
pushdown(root);
int mid=(ll+rr)>>1;
if(p<=mid) return query(root<<1,p);
else return query(root<<1|1,p);
}
int main()
{
while(~scanf("%d",&n))
{
int x;
build(1,1,n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(x==0||i==1) continue;
int mi=max(1,i-x);
update(1,mi,i-1);
}
int cnt=0;
for(int i=1;i<=n;i++)
{
if(query(1,i))
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}
相关文章推荐
- codeforces 482 B Interesting Array 线段树区间更新
- Codeforces 525B. Pasha and String【线段树 区间更新 单点查询】
- Codeforces 52C (线段树区间更新)
- Codeforces 46 D Parking Lot(线段树区间更新模板题)
- 线段树(区间更新)codeforces 292E Copying Data
- CodeForces 52C Circular RMQ (区间更新线段树)
- Codeforces 272C Dima and Staircase (线段树区间更新 或 线性扫)
- CodeForces - 272C Dima and Staircase (线段树区间更新)
- CodeForces 46D Parking Pot(线段树区间更新)
- CodeForces 52C Circular RMQ (区间更新线段树)
- CodeForces 35E Parade(线段树区间更新+离散化)
- codeforces 52C Circular RMQ(线段树区间更新)【模板】
- CodeForces 276E - Little Girl and Problem on Trees 区间更新..N+1个线段树
- 喵哈哈村的魔法考试 Round #2 (Div.2) B.喵哈哈村的种花魔法 线段树 区间更新 单点查询
- Codeforces 794F - Leha and security system [线段树-区间更新]【数据结构】
- codeforces 482B. Interesting Array【线段树区间更新】
- Codeforces 272C(线段树区间更新)@
- codeforces 283A. Cows and Sequence [线段树-区间更新]
- codeforces 315 B.Sereja and Array(线段树区间更新+单点更新+单点询问)
- codeforces 482B. Interesting Array【线段树区间更新】