2840:ピーター・リング防衛
制限時間:1000 MSメモリ制限:262144キロバイト
合計が提出:9受理:-4ページビュー:81は
送信 ステータスが 議論
説明
ArthasはMenethil侵入、王ジュ - リッチキングに抵抗します
ロレーヌサモナーボー玲の峡谷側の深さで防衛線を設定します。
南から北への配置順番に防御のこの行は、すべての特定の距離は、各点がM4A1、M4A1-S、AK47を備え、非常に多くあることができる防御ポイント、防御草薙北京防衛によって各ポイント、および防衛があります銃の一種で、
各ポイントので(円の中心として、防衛ポイント)防衛の異なった守備ラインがある、あなたは彼の強さを保存するために敵を爆破する必要があります。
我々は2つの防衛点、B、防衛線のB満たし、かつ範囲bにおける防御、すなわち、ABを定義します
お互いを保護することができ、我々は、彼らがHuanong兄弟だと思います。
それでは、どのくらいの防衛Huanong兄弟の合計ではありますか?
入力
n個の第一行
(1≤n≤2⋅1e5)i番目の点の防御防御半径の数は(1≤ai≤2⋅1e5)をaiを防御ポイント合計防御2行目の数を示し、nはどの
出力
中国の農民兄弟の数の出力。
3
2 2 1
3
2 1 2
5
5 5 5 5 5
1
0
10
ヒント
最初の例:答えは1であるので、図1に示すように、自分自身だけを保護するために2,2 1,3を保護することによって保護することができます。
第三のサンプル:Huanongは、任意の2つの兄弟です。
元のタイトルでManacher +フェンウィックツリーです
私はManacherをカットするには、この質問に指示が、難易度が大幅に低下していない、単に非常に困難期待していなかったと思いました。
キーは2つの防御ポイントに対処する方法を考えることですお互いを保護することができ、暴力を具体的にコードを見て、まだ終わっていません。
私は私が今まで私たちが議論を歓迎するファンの人たちによって、他の方法がある場合は、実際にはあまりにもYXZ会長の木を使用して期待していなかった、フェンウィック木と木のラインを使用すると考えていました。
#include<bits/stdc++.h>
#define ll long long
#define qq printf("QAQ\n");
using namespace std;
const int maxn=2e5+5;
const int mod=1e9+7;
const int inf=0x3f3f3f3f;
ll quick_pow(ll a,int n)
{
ll ans=1;
while(n)
{
if(n&1)ans=ans*a%mod;
n/=2;
a=a*a%mod;
}
return ans;
}
int a[maxn],sum[maxn]={0};
vector<int>v[maxn];
int lowbit(int x)
{
return x & - x;
}
void updata(int x,int data)
{
while(x<maxn)
{
sum[x]+=data;
x+=lowbit(x);
}
}
int query(int x)
{
int ans=0;
while(x>0)
{
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),v[max(1,i-a[i]+1)].push_back(i);
ll ans= 0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<v[i].size();j++)
updata(v[i][j],1);
ans+=(ll)(query(min(maxn-1,i+a[i]-1))-query(i));
}
printf("%lld\n",ans);
return 0;
}