제출 #1174248

#제출 시각아이디문제언어결과실행 시간메모리
1174248adkjt새로운 문제 (POI11_met)C++20
0 / 100
794 ms37632 KiB
#include<bits/stdc++.h> using namespace std; #define f first #define s second #define ll long long vector<int> own[333333]; int mid[333333],l[333333],r[333333],lim[333333],val[333333]; ll fen[333333]; pair<pair<int,int>,ll> meteor[333333]; vector<int> ask[333333]; void update(int idx,int v) { while(idx<=3e5+64) { fen[idx]+=v; idx+=idx&-idx; } } ll read(int idx) { ll sum=0; while(idx>0) { sum+=fen[idx]; idx-=idx&-idx; } return sum; } int main() { int n,m; cin>>n>>m; for(int i=1; i<=m; i++) { int x; cin>>x; own[x].push_back(i); } for(int i=1; i<=n; i++) { cin>>lim[i]; } int k; cin>>k; for(int i=1; i<=k; i++) { cin>>meteor[i].f.f>>meteor[i].f.s>>meteor[i].s; } for(int i=1; i<=n; i++) l[i]=1,r[i]=k+1; int cnt=0; while(cnt<n) { cnt=0; for(int i=1;i<=k;i++) ask[i].clear(); memset(fen,0,sizeof fen); for(int i=1; i<=n; i++) { if(l[i]>=r[i]) { cnt++; continue; } mid[i]=(l[i]+r[i])/2; if(mid[i]>k) { cnt++; continue; } ask[mid[i]].push_back(i); } for(int i=1; i<=k; i++) { if(meteor[i].f.f<=meteor[i].f.s) { update(meteor[i].f.f,meteor[i].s); update(meteor[i].f.s+1,-meteor[i].s); } else { update(meteor[i].f.f,meteor[i].s); //update(m+1,-meteor[i].s); update(1,meteor[i].s); update(meteor[i].f.s+1,-meteor[i].s); } for(auto x:ask[i]) { ll sum=0; for(auto y:own[x]) { sum+=read(y); } if(sum>=lim[x]) r[x]=mid[x],val[x]=1; else l[x]=mid[x]+1,val[x]=0; } } } for(int i=1; i<=n; i++) { if(!val[i]) cout<<"NIE\n"; else cout<<mid[i]<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...