Points Division (segment tree + DP) 2019 cattle off summer school and more training camp (first)

Meaning of the questions: https://ac.nowcoder.com/acm/contest/881/I

You give the n points in the plane, each point has a, b two weights, so you now divided into two regions (A requires the collection of all of the lower right point is not at any point in the set B).

Asked MAX (Sigma ai + Sigma bi).

Ideas:

dp + segment tree.

https://blog.csdn.net/qq_41194925/article/details/97079075

There is a place to note: For enumerated are we point B is set so dp [i] = max (1 ~ i) + bi, there must be bi.

  1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
  2 #include <cstdio>//sprintf islower isupper
  3 #include <cstdlib>//malloc  exit strcat itoa system("cls")
  4 #include <iostream>//pair
  5 #include <fstream>//freopen("C:\\Users\\13606\\Desktop\\草稿.txt","r",stdin);
  6 #include <bitset>
  7 //#include <map>
  8 //#include<unordered_map>
  9 #include <vector>
 10 #include <stack>
 11 #include <set>
 12 #include <string.h>//strstr substr
 13 #include <string>
 14 #include <time.h>//srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
 15 #include <cmath>
 16 #include <deque>
 17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
 18 #include <vector>//emplace_back
 19 //#include <math.h>
 20 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
 21 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
 22 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
 23 //******************
 24 int abss(int a);
 25 int lowbit(int n);
 26 int Del_bit_1(int n);
 27 int maxx(int a,int b);
 28 int minn(int a,int b);
 29 double fabss(double a);
 30 void swapp(int &a,int &b);
 31 clock_t __STRAT,__END;
 32 double __TOTALTIME;
 33 void _MS(){__STRAT=clock();}
 34 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__STRAT)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
 35 //***********************
 36 #define rint register int
 37 #define fo(a,b,c) for(rint a=b;a<=c;++a)
 38 #define fr(a,b,c) for(rint a=b;a>=c;--a)
 39 #define mem(a,b) memset(a,b,sizeof(a))
 40 #define pr printf
 41 #define sc scanf
 42 #define ls rt<<1
 43 #define rs rt<<1|1
 44 typedef long long ll;
 45 //#define int ll
 46 const double E=2.718281828;
 47 const double PI=acos(-1.0);
 48 //const ll INF=(1LL<<60);
 49 const int inf=(1<<30);
 50 const double ESP=1e-9;
 51 const int mod=(int)1e9+7;
 52 const int N=(int)1e6+10;
 53 
 54 struct node
 55 {
 56     int x,y,va,vb;
 57     friend bool operator<(node a,node b)
 58     {
 59         if(a.x==b.x)
 60             return a.y>b.y;
 61         return a.x<b.x;
 62     }
 63 }a[N];
 64 int temp[N];
 65 int LS(int n)
 66 {
 67     int m=0;
 68     for(int i=1;i<=n;++i)
 69         temp[++m]=a[i].y;
 70     sort(temp+1,temp+1+m);
 71     m=unique(temp+1,temp+1+m)-temp-1;
 72     for(int i=1;i<=n;++i)
 73         a[i].y=lower_bound(temp+1,temp+1+m,a[i].y)-temp;
 74     return m;
 75 }
 76 
 77 ll add[N<<2],max_[N<<2];
 78 
 79 void up(int rt,int l,int r)
 80 {
 81     max_[rt]=max(max_[rt<<1],max_[rt<<1|1]);
 82 }
 83 
 84 void dn(int rt)
 85 {
 86     if(add[rt]!=0)
 87     {
 88         add[ls]+=add[rt];
 89         add[rs]+=add[rt];
 90         max_[rt<<1]+=add[rt];
 91         max_[rt<<1|1]+=add[rt];
 92         add[rt]=0;
 93     }
 94 }
 95 
 96 void Build(int l,int r,int rt)
 97 {
 98     max_[rt]=0;
 99     add[rt]=0;
100     if(l==r)
101     {
102         return;
103     }
104     int mid=(l+r)>>1;
105 
106     Build(l,mid,rt<<1);
107     Build(mid+1,r,rt<<1|1);
108     up(rt,l,r);
109 }
110 
111 void update_dot(int pos,ll V,int l,int r,int rt)
112 {
113     if(l==r)
114     {
115         max_[rt]=V;
116         return;
117     }
118 
119     int mid=(l+r)>>1;
120     dn(rt);
121     if(pos<=mid)
122         update_dot(pos,V,l,mid,rt<<1);
123     else
124         update_dot(pos,V,mid+1,r,rt<<1|1);
125     up(rt,l,r);
126 }
127 void update_qu(int L,int R,int V,int l,int r,int rt)
128 {
129     if(L>R)return;
130     if(L<=l&&r<=R)
131     {
132         max_[rt]+=V;
133         add[rt]+=V;
134         return;
135     }
136 
137     int mid=(l+r)>>1;
138     dn(rt);
139     if(L<=mid)
140         update_qu(L,R,V,l,mid,rt<<1);
141     if(R>mid)
142         update_qu(L,R,V,mid+1,r,rt<<1|1);
143     up(rt,l,r);
144 }
145 ll Query(int L,int R,int l,int r,int rt)
146 {
147     if(L<=l&&r<=R)    return max_[rt];
148     int mid=(l+r)>>1;
149     ll res=0;
150     dn(rt);
151     if(L<=mid)
152         res=max(res,Query(L,R,l,mid,rt<<1));
153     if(R>mid)
154         res=max(res,Query(L,R,mid+1,r,rt<<1|1));
155     return res;
156 }
157 void check(int pos,int l,int r,int rt)
158 {
159     if(l==r)
160     {
161         cout<<max_[rt]<<' ';
162         return ;
163     }
164     int mid=(l+r)>>1;
165 
166     dn(rt);
167     if(pos<=mid)
168         check(pos,l,mid,rt<<1);
169     else
170         check(pos,mid+1,r,rt<<1|1);
171 }
172 
173 signed main()
174 {
175     int n;
176     while(~sc("%d",&n))
177     {
178         for(int i=1;i<=n;++i)
179         {
180             int q,w,e,r;
181             sc("%d%d%d%d",&q,&w,&e,&r);
182             a[i]={q,w,e,r};
183         }
184         int tot=LS(n);
185         sort(a+1,a+1+n);
186         Build(0,tot,1);
187         for(int i=1;i<=n;++i)
188         {
189         //    a[i].y++;
190             ll max__=Query(0,a[i].y+1,0,tot,1);
191             update_dot(a[i].y,max__+a[i].vb,0,tot,1);
192             update_qu(0,a[i].y-1,a[i].va,0,tot,1);
193             update_qu(a[i].y+1,tot,a[i].vb,0,tot,1);
194     //        for(int j=0;j<=tot;++j)
195     //            check(j,0,tot,1);
196     //        cout<<endl;
197         }
198         pr("%lld\n",max_[1]);
199     }
200     return 0;
201 }
202 
203 /**************************************************************************************/
204 
205 int maxx(int a,int b)
206 {
207     return a>b?a:b;
208 }
209 
210 void swapp(int &a,int &b)
211 {
212     a^=b^=a^=b;
213 }
214 
215 int lowbit(int n)
216 {
217     return n&(-n);
218 }
219 
220 int Del_bit_1(int n)
221 {
222     return n&(n-1);
223 }
224 
225 int abss(int a)
226 {
227     return a>0?a:-a;
228 }
229 
230 double fabss(double a)
231 {
232     return a>0?a:-a;
233 }
234 
235 int minn(int a,int b)
236 {
237     return a<b?a:b;
238 }

 

Guess you like

Origin www.cnblogs.com/--HPY-7m/p/11621631.html