#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int n,ans=0,x,sum=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
if(x==-1)
{
if(sum>0)
{
sum--;
}
else ans++;
}
else sum+=x;
}
printf("%d\n",ans);
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int dp[200200][20],a[200200],m,t,c;
int RMQ_init()
{
for(int i=1;i<=m;i++) dp[i][0]=a[i];
for(int j=1;(1<<j)<=m;j++)
{
for(int i=1;i+(1<<j)-1<=m;i++)
{
dp[i][j]=max(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
}
}
int RMQ(int L,int R)
{
int k;
//while((1<<(k+1))<=(R-L+1)) k++;
k=floor(log(R-L+1.0)/log(2.0));
return max(dp[L][k],dp[R-(1<<k)+1][k]);
}
int main()
{
scanf("%d%d%d",&m,&t,&c);
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
RMQ_init();
///int x,y;while(cin>>x>>y) cout<<RMQ(x,y)<<endl;
int ans=0;
for(int i=1;i<=m;i++)
{
int j=i+c-1;
if(j>m) break;
if(RMQ(i,j)<=t) ans++;
}
printf("%d\n",ans);
return 0;
}
裸的tarjan缩点
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxV=100100,maxE=300300,MOD=1000000007;
struct Edge
{
int to,next;
}edge[maxE];
int Adj[maxV],Size;
void init()
{
Size=0;
memset(Adj,-1,sizeof(Adj));
}
void Add_Edge(int u,int v)
{
edge[Size].to=v; edge[Size].next=Adj[u]; Adj[u]=Size++;
}
int Low[maxV],DFN[maxV],Stack[maxV],Belong[maxV];
int Index,top,scc,n;
int minvalue[maxV],valu[maxV],mincount[maxV];
bool Instack[maxV]; int num[maxV];
void tarjan(int u)
{
//cout<<"!!!!!! "<<u<<endl;
int v;
Low[u]=DFN[u]=++Index;
Stack[top++]=u;
Instack[u]=true;
for(int i=Adj[u];~i;i=edge[i].next)
{
v=edge[i].to;
if(!DFN[v])
{
tarjan(v);
Low[u]=min(Low[u],Low[v]);
}
else if(Instack[v])
{
Low[u]=min(Low[u],DFN[v]);
}
}
if(Low[u]==DFN[u])
{
scc++;
do
{
v=Stack[--top];
Instack[v]=false;
num[scc]++;
Belong[v]=scc;
if(minvalue[scc]>valu[v])
{
minvalue[scc]=valu[v];
mincount[scc]=1;
}
else if(minvalue[scc]==valu[v]) mincount[scc]++;
}while(v!=u);
}
}
void solve(int n)
{
memset(DFN,0,sizeof(DFN));
memset(Instack,false,sizeof(Instack));
memset(num,0,sizeof(num));
memset(minvalue,63,sizeof(minvalue));
memset(mincount,0,sizeof(mincount));
Index=scc=top=0;
for(int i=1;i<=n;i++)
{
if(!DFN[i]) tarjan(i);
}
}
void Debug()
{
cout<<"scc: "<<scc<<endl;
for(int i=1;i<=scc;i++) cout<<num[i]<<"--";
cout<<endl;
for(int i=1;i<=n;i++)
{
cout<<i<<" DFN: "<<DFN[i]<<" , Low: "<<Low[i]<<" "<<Belong[i]<<endl;
}
cout<<endl;
}
int main()
{
int m;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",valu+i);
init();
scanf("%d",&m);
int a,b;
for(int i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
Add_Edge(a,b);
}
solve(n);
// Debug();
long long int ans=0,ans2=1;
for(int i=1;i<=scc;i++)
{
// cout<<"min value: "<<minvalue[i]<<endl;
ans=ans+minvalue[i];
ans2=(ans2*mincount[i])%MOD;
}
cout<<ans<<" "<<ans2<<endl;
return 0;
}