1 solutions
-
0
C++ :
/* 暴力拿银牌,搜索是王道! */ #include<cstdio> #include<cctype> #include<algorithm> #define Lowbit(x) x & (-x) using namespace std; int ret; char ch; int qin() { ret=0; while(ch=getchar(),!isdigit(ch)); while(ret=ret*10+ch-'0',ch=getchar(),isdigit(ch)); return ret; } struct dx{ int l,r; long long s; }; dx a[500001]; int n,m; long long Ans; long long c[500001]; int k[500001]; bool comp(dx a,dx b){return a.r<b.r;} void add(int k,int x) { while(k<=n) { c[k]+=x; k+=Lowbit(k); } } long long pr(int k) { long long sum=0; while(k) { sum+=c[k]; k-=Lowbit(k); } return sum; } int main() { n=qin();m=qin(); for(int i=1;i<=n;i++) k[i]=qin(); for(int i=1;i<=m;i++) { a[i].l=qin();a[i].r=qin();a[i].s=qin(); } sort(a+1,a+m+1,comp); for(int i=1;i<=m;i++) { long long kk=pr(a[i].r)-pr(a[i].l-1); if(kk>=a[i].s) continue; int j=a[i].r; long long sum=kk; while(sum<a[i].s) { if(a[i].s-sum<=k[j]) { Ans+=a[i].s-sum; k[j]-=a[i].s-sum; add(j,a[i].s-sum); break; } add(j,k[j]); Ans+=k[j]; sum+=k[j]; k[j]=0; j--; } } printf("%lld\n",Ans); return 0; }
- 1
Information
- ID
- 17968
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By