题目大意:给你n个港口,每个港口都有个容量,然后有m条船要在s是进入sec,e时出去,问最多可以满足几条船的要求 n<=10 m<=100000 有多组数据
因为不同的港口互不影响,所以把不同的港口分开做
对于相同的港口,只要按出来的时间贪心就行了
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> const int maxn=15,maxm=100010,maxt=maxm*4; using namespace std; #ifdef judgeonline const int maxchar=5000000; char buf[maxchar],*wbuf=buf; inline int getint(){ int tmp=0; while (*wbuf<'0' || *wbuf>'9') ++wbuf; for (;*wbuf>='0' && *wbuf<='9';++wbuf) tmp=tmp*10+*wbuf-'0'; return tmp; } #else inline int getint(){ char ch=getchar(); int tmp=0; while (ch<'0' || ch>'9') ch=getchar(); for (;ch<='9' && ch>='0';ch=getchar()) tmp=tmp*10+ch-'0'; return tmp; } #endif struct zy{ int I,O,W; }b[maxm]; inline bool cmp(zy a,zy b){ return a.W<b.W; } inline bool cmp1(zy a,zy b){ return a.O<b.O; } int n,m; int a[maxn],l[maxn],r[maxn]; void init(){ m=getint(); for (int i=1;i<=n;++i) a[i]=getint(); for (int i=1;i<=m;++i){ b[i].I=getint()+1; b[i].O=getint()+1; b[i].W=getint(); } sort(b+1,b+m+1,cmp); memset(l,63,sizeof(l)); memset(r,200,sizeof(r)); for (int i=1;i<=m;++i){ l[b[i].W]=min(l[b[i].W],i); r[b[i].W]=max(r[b[i].W],i); } } class TTree{ private: int tree[maxt],add[maxt]; inline void updata(int p){ tree[p]=min(tree[p*2],tree[p*2+1]); } void build(int p,int l,int r,int x){ add[p]=0; if (l==r){ tree[p]=x; return; } int mid=(l+r)/2; build(p*2,l,mid,x); build(p*2+1,mid+1,r,x); updata(p); } inline void pushdown(int p){ if (!add[p]) return; int Ls=p<<1,Rs=Ls+1; add[Ls]+=add[p]; add[Rs]+=add[p]; tree[Ls]+=add[p]; tree[Rs]+=add[p]; add[p]=0; } bool count(int p,int l,int r,int fir,int las){ if (l==fir && r==las) return tree[p]>0; pushdown(p); int mid=(l+r)/2; if (mid>=las) return count(p*2,l,mid,fir,las); if (mid<fir) return count(p*2+1,mid+1,r,fir,las); return count(p*2,l,mid,fir,mid) && count(p*2+1,mid+1,r,mid+1,las); } void ins(int p,int l,int r,int fir,int las,int m){ if (l==fir && r==las){ tree[p]+=m; add[p]+=m; return; } int mid=(l+r)/2; if (mid>=las) ins(p*2,l,mid,fir,las,m); else if (mid<fir) ins(p*2+1,mid+1,r,fir,las,m); else{ ins(p*2,l,mid,fir,mid,m); ins(p*2+1,mid+1,r,mid+1,las,m); } updata(p); } zy tmp[maxm]; public: int doit(int i,int l,int r){ if (l>maxm) return 0; if (r<0) return 0; int maxT=0; memcpy(tmp+1,b+l,(r-l+1)*sizeof(zy)); int n=r-l+1; sort(tmp+1,tmp+n+1,cmp1); maxT=tmp[n].O; build(1,1,maxT,a[i]); int ans=0; for (int i=1;i<=n;++i){ if (tmp[i].I==tmp[i].O) ans++; else if (count(1,1,maxT,tmp[i].I,tmp[i].O-1)){ ans++; ins(1,1,maxT,tmp[i].I,tmp[i].O-1,-1); } } return ans; } }Tree; void work(){ int ans=0; for (int i=1;i<=n;++i) ans+=Tree.doit(i,l[i],r[i]); printf("%d\n",ans); } int main(){ while (scanf("%d",&n)!=EOF){ init(); work(); } return 0; }