QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#141316#6531. Base Station Constructioncy1999TL 2ms7868kbC++112.3kb2023-08-17 10:43:132023-08-17 10:43:15

Judging History

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

  • [2023-08-17 10:43:15]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:7868kb
  • [2023-08-17 10:43:13]
  • 提交

answer

#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+5;
int t,n,m;
int f[N][30];
int a[N];
map<int ,int> q;
int read()
{
	int res=0;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		res=10*res+c-'0';
		c=getchar();
	}
	return res;
}
struct node
{
	int l,r;
}w[N];
void yuchuli()
{
	for(int i=1;i<=n;i++)
	{
		f[i][0]=a[i];
	}
	int p=log(n)/log(2);
	for(int j=1;j<=p;j++)
	{
		for(int i=1;i<=n-(1<<j)+1;i++)
		{
			f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
		}
	}
}
int ask(int l,int r)
{
	int p=log(r-l+1)/log(2);
	return min(f[l][p],f[r-(1<<p)+1][p]);
}
//int find1(int l,int r,int p)
//{
//	if(p==m+1)
//	{
//		return ask(l,r);
//	}
//	if(r<w[p].l)
//	{
//		return ask(l,r)+find1(w[p].l,w[p].r,p+1);
//	}
//	if(w[p].l>=l&&w[p].r<=r)
//	{
//		return find1(w[p].l,w[p].r,p+1);
//	}
//	
//}
int find2(int l,int r,int p)
{
	if(p==m)
	{
		if(!l&&!r)
		{
			return ask(w[p].l,w[p].r );
		}
		int ans1=ask(l,w[p].l)+ask(r,w[p].r);
		int ans2=ask(w[p].l,r);
		return min(ans1,ans2);
	}
	if(r<w[p].l)
	{
		if(q[p])
		{
			return q[p];
		}
		int num=ask(l,r);
		if(w[p+1].l>w[p].r)
		{
			if(!l&&!r)
			{
				return q[p]=ask(w[p].l,w[p].r)+find2(0,0,p+1);
			}
			return ask(l,r)+ask(w[p].l,w[p].r)+find2(0,0,p+1);
		}
		if(!l&&!r)
		{
			return q[p]=find2(w[p].l,w[p].r,p+1);
		}
		return ask(l,r)+find2(w[p].l,w[p].r,p+1);
	}
	if(w[p].l>=l&&w[p].r<=r)
	{
		if(w[p+1].l>w[p].r)
		{
			return  ask(w[p].l,w[p].r)+find2(0,0,p+1);
		}
		return find2(w[p].l,w[p].r,p+1);
	}
	if(w[p+1].l>w[p].r)
	{
		int ans1=ask(l,w[p].l)+ask(r,w[p].r);
		int ans2=ask(w[p].l,r);
		return min(ans1,ans2)+find2(0,0,p+1);
	}
	if(w[p+1].l>r)
	{
		return ask(l,r)+find2(r,w[p].r,p+1);
	}
	int ans1=ask(l,r)+find2(r,w[p].r,p+1);
	int ans2=find2(w[p].l,r,p+1);
	int ans=min(ans1,ans2);
	return ans;
}
signed main()
{
//	std::ios::sync_with_stdio(false);
//	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		q.clear();
		n=read();
		for(int i=1;i<=n;i++)
		{
			a[i]=read();
		}
		yuchuli();
		m=read();
		for(int i=1;i<=m;i++)
		{
			w[i].l=read();
			w[i].r=read();
		}
		//a[n+1]=0;
		//w[m+1].l=w[m+1].r=n+1;
		int ans=find2(0,0,1);
		//cout<<ans<<endl;
		printf("%lld\n",ans);
	}
}

详细

Test #1:

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

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
Time Limit Exceeded

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:

61
48
4
28
131
68
23
3
44
165
118
52
68
69
188
48
117
89
60
98
30
23
1
12
136
93
290
216
94
150
316
57
46
18
17
24
10
152
34
47
35
115
48
75
107
55
16
126
110
29
103
47
336
192
111
13
430
34
65
16
30
33
52
69
72
140
81
147
106
20
82
57
85
58
211
53
7
17
192
82
189
100
96
24
171
62
139
12
19
74
133
8...

result: