QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#664590 | #6531. Base Station Construction | Ayaya | RE | 2ms | 11992kb | C++14 | 2.2kb | 2024-10-21 21:20:52 | 2024-10-21 21:20:52 |
Judging History
answer
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<unordered_map>
#include<vector>
#include<bitset>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<random>
#include<numeric>
using namespace std;
#define int long long
#define ll long long
#define ull unsigned long long
#define lc (x<<1)
#define rc (x<<1|1)
#define pii pair<int,int>
#define mkp make_pair
#define fi first
#define se second
#define cout (cerr<<">> ",cout)
const int Mx=500005,p=998244353;
int read(){
char ch=getchar();
int Alice=0,Aya=1;
while(ch<'0'||ch>'9'){
if(ch=='-') Aya=-Aya;
ch=getchar();
}
while(ch>='0'&&ch<='9')
Alice=(Alice<<3)+(Alice<<1)+(ch^48),ch=getchar();
return (Aya==1?Alice:-Alice);
}
int n,m;
int cost[Mx];
struct Seg{
int l,r;
bool operator <(const Seg&o)const{
return l==o.l?r<o.r:l<o.l;
}
}a[Mx],c[Mx];
int f[Mx];
int t[Mx];
void Ins(int i,int k){
for(;i<=m+1;i+=(i&-i)) t[i]=min(t[i],k);
}
int Qry(int i){
int res=1e18;
for(;i;i&=(i-1)) res=min(res,t[i]);
return res;
}
void Solve(){
n=read();
for(int i=1;i<=n;i++) cost[i]=read();
m=read();
for(int i=0;i<=m+1;i++) t[i]=1e18;
for(int i=1;i<=m;i++){
a[i].l=read(),a[i].r=read();
}
sort(a+1,a+m+1);
int M=1;
for(int i=2;i<=m;i++){
if(a[i].l==a[M].l) continue;
if(a[i].r<=a[M].r) a[M]=a[i];
else a[++M]=a[i];
}
m=M;
for(int i=2;i<=m;i++){
if(a[i].l<=a[i-1].l||a[i].r<=a[i-1].r) exit(114);
}
int ans=1e18;
Ins(m+1,0);
for(int i=1;i<=n;i++){
int L=1,R=m,ok=-1;
while(L<=R){
int mid=((L+R)>>1);
if(a[mid].r>=i) R=mid-1,ok=mid;
else L=mid+1;
}
c[i].l=ok;
L=1,R=m,ok=-1;
while(L<=R){
int mid=((L+R)>>1);
if(a[mid].l<=i) L=mid+1,ok=mid;
else R=mid-1;
}
c[i].r=ok;
//cout<<c[i].l<<" "<<c[i].r<<endl;
if(c[i].l==-1||c[i].r==-1){
f[i]=1e18;
continue;
}
f[i]=Qry(m+2-c[i].l)+cost[i];
Ins(m+2-(c[i].r+1),f[i]);
if(c[i].r==m) ans=min(ans,f[i]);
}
printf("%lld\n",ans);
}
signed main(){
int T=read();
while(T--) Solve();
return 0;
}
/*
Hello!!
Sample:
-------------------
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 2ms
memory: 11992kb
input:
2 5 3 2 4 1 100 3 1 3 2 4 5 5 5 7 3 4 2 2 3 1 4 2 3 4 5
output:
102 5
result:
ok 2 number(s): "102 5"
Test #2:
score: -100
Runtime Error
input:
6201 12 88 78 46 95 84 98 55 3 68 42 6 18 19 6 9 10 11 12 12 8 11 8 12 2 3 2 3 1 5 9 9 7 8 6 11 2 4 12 12 2 4 2 9 7 10 8 8 1 7 6 11 5 76 27 48 66 61 2 1 4 3 5 8 64 81 20 6 86 9 4 55 1 7 7 9 1 43 18 81 11 22 9 61 83 14 5 6 2 6 5 8 1 4 9 9 9 9 7 7 2 5 8 9 5 6 4 8 5 8 9 9 6 6 10 66 41 84 7 80 31 22 96 ...
output:
141 48 4 126 303 141 23 170 159 139