QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#432934#8718. 保区间最小值一次回归问题FesdrerWA 317ms16320kbC++172.0kb2024-06-07 20:52:192024-06-07 20:52:20

Judging History

你现在查看的是最新测评结果

  • [2024-06-07 20:52:20]
  • 评测
  • 测评结果:WA
  • 用时:317ms
  • 内存:16320kb
  • [2024-06-07 20:52:19]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int T,n,m,a[N],nxt[N];
long long ans,f[N];
struct Node{int l,r,v;}que[N];
vector<pair<int,int>> query;
vector<int> id;
deque<int> q;
int get(int x){
	if(nxt[x]==x)	return x;
	return nxt[x]=get(nxt[x]);
}
void solve(int v){
	while(q.size())	q.pop_back();
	f[0]=0;
	q.push_back(0);
	query.insert(query.begin(),{0,0});
	for(int i:id)	ans+=max(0,v-a[i]);
	id.insert(id.begin(),0);
	long long mn=0x3f3f3f3f3f3f3f3f;
	for(int i=1,j=0;i<=int(id.size())-1;i++){
		while(j<int(query.size())-1&&query[j+1].second<i)	j++;
		while(q.size()&&q.front()<query[j].first)	q.pop_front();
		f[i]=f[q.front()]+max(v,a[id[i]])-v;
		while(q.size()&&f[q.back()]>=f[i])	q.pop_back();
		q.push_back(i);
		if(i>=query.back().first&&i<=query.back().second)	mn=min(mn,f[i]);
	}
	ans+=mn;
}
int main(){
	// freopen("in.txt","r",stdin);
	// freopen("out.txt","w",stdout);
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);	
	cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++)	cin>>a[i];
		for(int i=1;i<=m;i++)	cin>>que[i].l>>que[i].r>>que[i].v;
		for(int i=1;i<=n+1;i++)	nxt[i]=i;
		sort(que+1,que+m+1,[&](const Node &x,const Node &y){
			if(x.v==y.v)	return (x.r==y.r?x.l>y.l:x.r<y.r);
			return x.v>y.v;
		});
		bool flagg=1;
		ans=0;
		for(int i=1;i<=m;i++){
			int l=i,r=i-1;
			query.clear(),id.clear();
			while(r<n&&que[l].v==que[r+1].v){
				r++;
				if(query.empty()||que[r].l>query.back().first)	query.push_back({que[r].l,que[r].r});
			}
			i=r;
			bool flag=1;
			for(pair<int,int> it:query)	if(get(it.first)>it.second)	{flag=0;break;}
			if(!flag){flagg=0;break;}
			for(pair<int,int> it:query)	for(int i=get(it.first);i<=it.second;i=get(i+1))
				id.push_back(i),nxt[i]=get(i+1);
			for(pair<int,int> &it:query){
				it.first=lower_bound(id.begin(),id.end(),it.first)-id.begin()+1;
				it.second=upper_bound(id.begin(),id.end(),it.second)-id.begin();
			}
			solve(que[i].v);
		}
		if(flagg)	cout<<ans<<endl;
		else	cout<<-1<<endl;
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 9800kb

input:

1
3 2
2023 40 41
1 1 2022
2 3 39

output:

2

result:

ok 1 number(s): "2"

Test #2:

score: -100
Wrong Answer
time: 317ms
memory: 16320kb

input:

1000
100 100
1 35141686 84105222 84105220 7273527 178494861 178494861 112519027 77833654 77833656 261586535 278472336 278472336 261586536 416361017 416361017 426649080 323519513 278472337 420127821 420127823 420127823 482516531 434108818 420127821 631535744 615930922 546346921 546346920 546346920 70...

output:

44
40
40
36
46
47
44
45
41
46
39
53
900
52
43
50
45
59
57
43
47
39
39
54
47
57
48
40
36
40
39
52
52
39
56
42
44
42
36
47
43
46
42
46
879
854
40
46
42
46
41
39
50
46
38
42
50
49
50
46
37
48
42
37
47
40
44
47
35
49
47
42
41
45
43
43
41
47
37
44
42
34
42
41
47
45
37
42
40
41
46
40
49
51
42
40
42
47
44
...

result:

wrong answer 1st numbers differ - expected: '49', found: '44'