1. 程式人生 > >ACM-ICPC 2018 南京賽區網絡預賽 G Lpl and Energy-saving Lamps(模擬+線段樹)

ACM-ICPC 2018 南京賽區網絡預賽 G Lpl and Energy-saving Lamps(模擬+線段樹)

map nbsp esp sin acm cos style ans con

https://nanti.jisuanke.com/t/30996

題意

每天增加m個燈泡,n個房間,能一次性換就換,模擬換燈泡過程。詢問第幾天的狀態

分析

離線做,按題意模擬。比賽時線段樹寫挫了。。導致不斷超時,我太弱了。每次詢問符合要求的最左邊的點。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include 
<ctime> #include <vector> #include <queue> #include <map> #include <stack> #include <set> #include <bitset> using namespace std; typedef long long ll; typedef unsigned long long ull; #define ms(a, b) memset(a, b, sizeof(a)) #define pb push_back #define
mp make_pair #define pii pair<int, int> //#define eps 0.0000000001 #define IOS ios::sync_with_stdio(0);cin.tie(0); #define random(a, b) rand()*rand()%(b-a+1)+a #define pi acos(-1) //const ll INF = 0x3f3f3f3f3f3f3f3fll; const int inf = 0x3f3f3f3f; const int maxn = 1e5 + 10; const int maxm = 3000000 +10; const
int mod = 998244353; struct ND{ int minn,l,r; }tree[maxn<<2]; int n,m,k[maxn],d[maxn],q; void pushup(int rt){ tree[rt].minn=min(tree[rt<<1].minn,tree[rt<<1|1].minn); } void build(int rt,int l,int r){ tree[rt].l=l,tree[rt].r=r; if(l==r){ tree[rt].minn=k[l]; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); pushup(rt); } void update(int rt,int pos,int val){ if(tree[rt].l==tree[rt].r){ tree[rt].minn=val; return; } int mid=(tree[rt].l+tree[rt].r)>>1; if(pos<=mid) update(rt<<1,pos,val); else update(rt<<1|1,pos,val); pushup(rt); } int query(int rt,int L,int R,ll val){ if(tree[rt].minn>val) return inf; if(tree[rt].l==tree[rt].r){ return tree[rt].l; } int mid=(tree[rt].l+tree[rt].r)>>1; if(tree[rt<<1].minn<=val&&L<=mid) return query(rt<<1,L,R,val); if(tree[rt<<1|1].minn<=val&&R>mid) return query(rt<<1|1,L,R,val); } pair<int,ll> ans[maxn]; bool vis[maxn]; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); // freopen("input.txt", "w", stdout); #endif scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&k[i]); scanf("%d",&q); for(int i=1;i<=q;i++) scanf("%d",&d[i]); build(1,1,n); memset(vis,false,sizeof(vis)); // cout<<query(1,n,n,7); ll sum=m; int cnt=0,i; for(i=1;i<=1e5+5;i++){ int x=1; while(x<=n){ if(vis[x]){ x++; continue; } int tmp=query(1,x,n,sum); if(tmp!=inf){ x=tmp+1; sum-=k[tmp]; vis[tmp]=1; cnt++; update(1,tmp,inf); }else break; } ans[i]=make_pair(cnt,sum); sum+=m; if(cnt>=n) break; } for(int j=1;j<=q;j++){ if(d[j]>=i){ printf("%d %lld\n",ans[i].first,ans[i].second); }else{ printf("%d %lld\n",ans[d[j]].first,ans[d[j]].second); } } return 0; }

ACM-ICPC 2018 南京賽區網絡預賽 G Lpl and Energy-saving Lamps(模擬+線段樹)