cf1321E
很像二维偏序,我们把武器和怪物放在一起排序按照攻击力递增的顺序,顺序扫描,这样攻击力满足了要求,然后防御力可以用一个线段树来处理,具体看代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | #include<iostream> #include<cstdio> #include<cstring> #include<vector> #include<algorithm> #define forn(i, n) for (int i = 0 ; i < int(n) ; i++) #define fore(i, s, t) for (int i = s ; i < (int)t ; i++) #define fi first #define se second #define all(x) x.begin(),x.end() #define pf2(x,y) printf("%d %d\n",x,y) #define pf(x) printf("%d\n",x) #define each(x) for(auto it:x) cout<<it<<endl; #define pii pair<int,int> #define sc(x) scanf("%d",&x) using namespace std; typedef long long ll; const int maxn=1e6+5; int vv[maxn<<2],lz[maxn<<2]; #define ls o<<1 #define rs o<<1|1 #define lss ls,l,mid #define rss rs,mid+1,r void push_up( int o, int l, int r){ if (lz[o]){ lz[ls]+=lz[o]; lz[rs]+=lz[o]; vv[ls]+=lz[o]; vv[rs]+=lz[o]; lz[o]=0; } } void update( int o, int l, int r, int ql, int qr, int val){ if (l>=ql && r<=qr) { vv[o]+=val; lz[o]+=val; return ; } else { push_up(o,l,r); int mid=l+r>>1; if (ql<=mid) update(lss,ql,qr,val); if (qr>mid) update(rss,ql,qr,val); vv[o]=max(vv[ls],vv[rs]); } } int n,m,p; struct Weapons{ int a,ca; }weapon[maxn]; struct Armor{ int b,cb; }armor[maxn]; struct Monsters{ int x,y,z; }monster[maxn]; void build( int o, int l, int r){ if (l==r) vv[o]=-armor[l].cb; else { int mid=l+r>>1; build(lss); build(rss); vv[o]=max(vv[ls],vv[rs]); } } int Find( int x){ int l=1,r=m+1; while (l<r){ int mid=l+r>>1; if (armor[mid].b<x) l=mid+1; else r=mid; } return l; } int main(){ cin>>n>>m>>p; for ( int i=1;i<=n;i++){ scanf ( "%d%d" ,&weapon[i].a,&weapon[i].ca); } for ( int i=1;i<=m;i++){ scanf ( "%d%d" ,&armor[i].b,&armor[i].cb); } for ( int i=1;i<=p;i++){ scanf ( "%d%d%d" ,&monster[i].x,&monster[i].y,&monster[i].z); } sort(weapon+1,weapon+n+1,[](Weapons X,Weapons Y){ return X.a<Y.a; }); sort(armor+1,armor+m+1,[](Armor X,Armor Y){ return X.b<Y.b; }); sort(monster+1,monster+p+1,[](Monsters X,Monsters Y){ return X.x<Y.x; }); build(1,1,m); int ans=-2e9,tl=1,tr=1; for ( int i=1;i<=n+p;i++){ if (tr>p || (tl<=n && weapon[tl].a<=monster[tr].x)) { ans=max(ans,vv[1]-weapon[tl].ca); ++tl; } else { int pos=Find(monster[tr].y+1); if (pos<=m) { update(1,1,m,pos,m,monster[tr].z); } ++tr; } } printf ( "%d\n" ,ans); } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步