# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|
71263 | | khohko | 매트 (KOI15_mat) | C++17 | | 657 ms | 158084 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define ll int
#define pb push_back
#define fr first
#define sc second
#define MAX ((ll)(1e9+100))
#define MX ((ll)(1e6+100))
#define ARRS ((ll)(2e6+100))
#define HS ((ll)(1049))
#define MOD ((ll)(1000000861))
#define EP ((double)(1e-9))
#define LG 21
#define mul(a,b) a=((a)*(b))%MOD
using namespace std;
string s,t;
vector<pair<pair<ll,ll> ,pair<ll,ll> > > a;
vector<pair<pair<ll,ll> ,pair<ll,ll> > > b;
ll dp[4100][4100];
//
//struct node{
// node *L,*R;
// ll x;
// node(){
// L=R=NULL;
// x=-MAX;
// }
// void updt(){
// x=-MAX;
// if(L)x=max(x,L->x);
// if(R)x=max(x,R->x);
// }
//};
//
//ll wl,wr,wi,wx;
//void updt(ll l,ll r,node *& x){
// if(wi<l||r-1<wi)return;
// if(!x)x=new node();
// if(l==r-1){
// x->x=max(x->x,wx);
// return;
// }
// updt(l,l+r>>1,x->L);
// updt(l+r>>1,r,x->R);
// x->updt();
//}
//
//ll quer(ll l,ll r,node *& x){
// if(wr<l||r-1<wl)return -MAX;
// if(!x)return -MAX;
// if(wl<=l&r-1<=wr)return x->x;
// return max(quer(l,l+r>>1,x->L),
// quer(l+r>>1,r,x->R));
//}
//
//node *rtl[4000];
//node *rtr[4000];
ll fw[2][3010][6020];
//ll fw2[3010][6020];
void add(ll wa,ll w,ll i,ll x){
i++;
while(i<=6010){
fw[wa][w][i]=max(fw[wa][w][i],x);
i+=i&-i;
}
}
ll quer(ll wa,ll w,ll i){
ll p=-MAX;
i++;
while(i>1){
p=max(p,fw[wa][w][i]);
i-=i&-i;
}
return p;
}
map<ll,ll> mp;
int main(){
#ifdef KHOKHO
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
#endif
ll n,w,l,r,d,k,c;
cin>>n>>w;
a.pb({{0,0},{0,0}});
b.pb({{0,0},{w,0}});
mp[0]=1;
mp[w]=1;
for(int i=0; i<n; i++){
cin>>k;
if(k){
cin>>l>>r>>d>>c;
mp[l]=1;
mp[r]=1;
a.pb({{l,r},{d,c}});
}
else {
cin>>l>>r>>d>>c;
mp[l]=1;
mp[r]=1;
b.pb({{l,r},{w-d,c}});
}
}
ll C=1;
for(auto x:mp)
mp[x.fr]=C++;
//C+=100;
C+=2;
for(auto &x:a){
x.fr.fr=mp[x.fr.fr];
x.fr.sc=mp[x.fr.sc];
}
for(auto &x:b){
x.fr.fr=mp[x.fr.fr];
x.fr.sc=mp[x.fr.sc];
}
sort(a.begin(),a.end());
sort(b.begin(),b.end());
for(int i=0; i<=a.size(); i++)
for(int j=0; j<=b.size(); j++)
dp[i][j]=-MAX;
for(int i=0; i<=3005; i++){
for(int j=0; j<=C; j++){
fw[0][i][j]=-MAX;
fw[1][i][j]=-MAX;
}
}
dp[0][0]=0;
ll pas=0;
for(int i=0; i<a.size(); i++){
for(int j=0; j<b.size(); j++){
if(b[j].fr.fr<=a[i].fr.fr&&(a[i].fr.fr>=b[j].fr.sc||a[i].sc.fr<=b[j].sc.fr)){
ll k=quer(1,j,a[i].fr.fr);
dp[i][j]=max(dp[i][j],k+a[i].sc.sc);
}
if(b[j].fr.fr>=a[i].fr.fr&&(b[j].fr.fr>=a[i].fr.sc||a[i].sc.fr<=b[j].sc.fr)){
ll k=quer(0,i,b[j].fr.fr);
dp[i][j]=max(dp[i][j],k+b[j].sc.sc);
}
add(1,j,a[i].fr.sc,dp[i][j]);
add(0,i,b[j].fr.sc,dp[i][j]);
pas=max(pas,dp[i][j]);
}
}
cout<<pas;
}
Compilation message (stderr)
mat.cpp: In function 'int main()':
mat.cpp:125:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0; i<=a.size(); i++)
~^~~~~~~~~~
mat.cpp:126:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0; j<=b.size(); j++)
~^~~~~~~~~~
mat.cpp:138:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i=0; i<a.size(); i++){
~^~~~~~~~~
mat.cpp:139:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int j=0; j<b.size(); j++){
~^~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |