QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#360179 | #3300. Cactus Competition | ttest | WA | 4ms | 133776kb | C++14 | 3.6kb | 2024-03-21 14:32:41 | 2024-03-21 14:32:42 |
Judging History
answer
#include<bits/stdc++.h>
#define ll long long
#define int long long
#define fir first
#define sec second
#define pii pair<int,int>
#define isz(v) (int)(v.size())
using namespace std;
const int maxn=200005;
const int logn=19;
const int inf=0x3f3f3f3f;
namespace Solve {
struct ST {
int a[maxn];
int lg[maxn];
int mi[logn][maxn];
int mx[logn][maxn];
void build(int n,int *v) {
// cerr<<"build: "<<n<<" ";
for(int i=1;i<=n;i++) {
// cerr<<v[i]<<"? ";
a[i]=v[i];
mi[0][i]=a[i];
mx[0][i]=a[i];
}
// cerr<<"\n";
for(int i=2;i<=n;i++) {
lg[i]=lg[i>>1]+1;
}
for(int i=1;(1<<i)<=n;i++) {
for(int j=1;j+(1<<i)-1<=n;j++) {
mi[i][j]=min(mi[i-1][j],mi[i-1][j+(1<<(i-1))]);
mx[i][j]=max(mx[i-1][j],mx[i-1][j+(1<<(i-1))]);
}
}
// cerr<<"build done\n";
}
int getmin(int l,int r) {
if(l>r) {
return inf;
}
int k=lg[r-l+1];
return min(mi[k][l],mi[k][r-(1<<k)+1]);
}
int getmax(int l,int r) {
if(l>r) {
return -inf;
}
int k=lg[r-l+1];
return max(mx[k][l],mx[k][r-(1<<k)+1]);
}
};
int n,m;
int a[maxn];
int b[maxn];
int mib=inf,mxb=-inf;
bool vl[maxn];
bool vr[maxn];
void clear() {
}
void deal(int *a,int *b,int m,bool *v) {
// cerr<<"deal: "<<n<<" "<<m<<"\n";
// for(int i=1;i<=n;i++) {
// cerr<<a[i]<<" ";
// }
// cerr<<"\n";
// for(int i=1;i<=m;i++) {
// cerr<<b[i]<<" ";
// }
// cerr<<"\n";
// cerr<<"end\n";
ST sta,stb;
sta.build(n,a);
stb.build(m,b);
// cerr<<"wtf\n";
int need[maxn]={};
auto solve=[&](int l,int r) {
// cerr<<l<<" "<<r<<"?\n";
vector<int> st;
v[r]=true;
st.push_back(r);
for(int i=r-1;i>=l;i--) {
while(isz(st)&&a[st.back()]<a[i]) {
st.pop_back();
}
assert(isz(st));
int mi=sta.getmin(i,st.back()-1);
need[i]=-mi;
int t=1;
while(t<=m&&b[t]+a[i]>=0) {
t++;
}
t--;
v[i]=v[st.back()]&&stb.getmax(1,t)>=need[st.back()];
st.push_back(i);
}
};
for(int i=n;i>=1;i--) {
if(a[i]+mib>=0) {
int j=i-1;
while(j>=1&&a[j]+mib<0) {
j--;
}
j++;
solve(j,i);
i=j;
}
}
}
void main(int tid) {
cin>>n>>m;
for(int i=1;i<=n;i++) {
cin>>a[i];
}
for(int i=1;i<=m;i++) {
cin>>b[i];
mib=min(mib,b[i]);
mxb=max(mxb,b[i]);
}
int t[maxn]={},cnt=0;
for(int i=1;i<=m;i++) {
t[++cnt]=b[i];
if(b[i]==mxb) {
break;
}
}
deal(a,t,cnt,vl);
reverse(a+1,a+n+1);
cnt=0;
for(int i=m;i>=1;i--) {
t[++cnt]=b[i];
if(b[i]==mxb) {
break;
}
}
deal(a,t,cnt,vr);
reverse(a+1,a+n+1);
reverse(vr+1,vr+n+1);
int ans=0;
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j++) {
if(a[j]+mxb<0) {
break;
}
ans+=vl[i]&&vr[j];
}
}
cout<<ans<<"\n";
}
void init() {
}
}
signed main() {
#ifndef ONLINE_JUDGE
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T=1;
// cin>>T;
Solve::init();
for(int t=1;t<=T;t++) {
Solve::main(t);
Solve::clear();
}
#ifndef ONLINE_JUDGE
cerr<<"Time: "<<(1.0*clock()/CLOCKS_PER_SEC)*1000<<"ms\n";
#endif
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 133768kb
input:
3 3 -1 0 1 -1 0 1
output:
1
result:
ok single line: '1'
Test #2:
score: 0
Accepted
time: 4ms
memory: 131724kb
input:
3 3 -1 0 1 1 0 1
output:
5
result:
ok single line: '5'
Test #3:
score: 0
Accepted
time: 4ms
memory: 133764kb
input:
10 10 145195799 312862766 143966779 -11056226 -503624929 636383890 -182650312 -382759112 -290767690 377894950 -845235881 -418232930 -600566938 -957917357 -181139226 125255273 -175406945 740226783 -750456842 325848662
output:
0
result:
ok single line: '0'
Test #4:
score: -100
Wrong Answer
time: 0ms
memory: 133776kb
input:
10 10 923415743 -503391272 885740174 329644337 -693052351 -53764994 731859967 -834732760 -57751504 151969590 553689579 313784278 -12090771 921222379 -378313551 819586787 -373658045 559813071 671861309 268258615
output:
31
result:
wrong answer 1st lines differ - expected: '13', found: '31'