/*
"TLE is like the wind, always by my side"
- Yasuo - 2022 -
*/
#include <bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long
using namespace std;
struct cladire
{
int h;
int g;
int poz;
};
struct subsir
{
int sum;
int highest;
};
cladire building[42];
vector<subsir> firsthalf;
int mars[42][(1<<20)+1];/// mars[i][j] = numarul de numere cu highest mai mic sau egal cu i in primele j numere din firsthalf
int n,k,i,j,val,ans,r,pas;
bool cmp (cladire a, cladire b)
{
return a.h<b.h;
}
bool cmp2(subsir a, subsir b)
{
return a.sum<b.sum;
}
bool cmp3(cladire a, cladire b)
{
return a.poz<b.poz;
}
void gen(int r)
{
int mask,currsum,currhighest,j;
bool ok;
for (mask=0; mask<(1<<r); mask++)
{
ok=true;
currsum=0;
currhighest=-1;
for (j=0; j<r && ok; j++)
{
if (mask&(1<<j))
{
if (building[j+1].h>=currhighest)
{
currsum+=building[j+1].g;
currhighest=building[j+1].h;
}
else
{
ok=false;
}
}
}
if (ok && currsum!=0)
{
if (currsum>=k)
ans++;
firsthalf.push_back({currsum,currhighest});
}
}
}
void gen2(int r)
{
int mask,j,currsum,currhighest,currlowest;
bool ok;
for (mask=0; mask<(1<<r); mask++)
{
ok=true;
currsum=0;
currhighest=0;
currlowest=n+1;
for (j=0; j<r && ok; j++)
{
if (mask&(1<<j))
{
if (building[j+n/2+1].h>=currhighest)
{
currsum+=building[j+n/2+1].g;
currhighest=building[j+n/2+1].h;
currlowest=min(currlowest,building[j+n/2+1].h);
}
else
{
ok=false;
}
}
}
if (ok && currsum!=0)
{
r=0;
pas=(1<<20);
while (pas)
{
if (r+pas<firsthalf.size() && currsum+firsthalf[r+pas].sum<k)
r+=pas;
pas=pas/2;
}
if (currsum+firsthalf[r].sum<k)
r++;
/*
debugs(mask);
debugs(currsum);
debugs(currlowest);
debugs(firsthalf[r].sum);
debugs(r);
debug(mars[currlowest][firsthalf.size()]-mars[currlowest][min(r-1,1LL*0)]);
Doamne ajuta sa mearga (trebuia cu D mare)
*/
debug(mask);
ans+=mars[currlowest][firsthalf.size()-1]-mars[currlowest][min(r-1,1LL*0)];
debug(mars[currlowest][firsthalf.size()-1]-mars[currlowest][min(r-1,1LL*0)]);
if (currsum>=k)
ans++;
}
}
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> k;
for (i=1; i<=n; i++)
{
cin >> building[i].h >> building[i].g;
building[i].poz=i;
}
/*
sort(building+1,building+1+n,cmp);
val=0;
for (i=1; i<=n; i++)
{
if (i==1 || building[i].h!=building[i-1].h)
val++;
building[i].h=val;
}
sort(building+1,building+1+n,cmp3);
*/
ans=0;
gen(n);
/*sort(firsthalf.begin(),firsthalf.end(),cmp2);
for (i=0; i<firsthalf.size(); i++)
{
mars[firsthalf[i].highest][i]++;
for (j=1; j<=n; j++)
{
mars[j][i]+=mars[j-1][i];
}
for (j=1;j<=n;j++)
{
mars[j][i]+=mars[j][i-1];
}
}
gen2(n/2);
*/
cout << ans;
}
Compilation message
san.cpp: In function 'void gen2(long long int)':
san.cpp:111:26: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<subsir>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
111 | if (r+pas<firsthalf.size() && currsum+firsthalf[r+pas].sum<k)
| ~~~~~^~~~~~~~~~~~~~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
1 ms |
340 KB |
Output is correct |
2 |
Correct |
1 ms |
424 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
63 ms |
8640 KB |
Output is correct |
2 |
Correct |
11 ms |
724 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
0 ms |
212 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |