社区讨论

关于时限

学术版参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mko1cu02
此快照首次捕获于
2026/01/21 21:05
4 周前
此快照最后确认于
2026/01/21 21:30
4 周前
查看原帖
以下为CF1074的div.4的D题和std,我们改了一下题面与数据范围,我们将时限设为了三倍std,但是在检验的时候ds的代码过了,豆包的TLE了。std跑拉满的数据是850ms左右,是否要增加时限?

请注意该题数据量极大,时间已设置为3倍std时限

推荐使用下列代码进行时间优化,并选择C++20(O2)提交
CPP
ios::sync_with_stdio(false);
cin.tie(nullptr);

题目背景

光头熊是一位银行管理员,用户们每天都会在银行进行操作,而光头熊要保证银行的操作合法。

题目描述

有一个包含 nn 个整数的操作数组 a1,a2,,ana_1, a_2, \ldots, a_n。执行 mm 次操作。第 i i 次操作会将第 abia_{b_i} 个用户的账户财富为设abi+cia_{b_i} + c_i
由于银行内部有规定,每当任意一个用户的任何财富大于 hh 时,银行就会启动跑路计划,使每个用户的财富都会被重置为其原始值,然后带着钱跑路去开新的银行,如果光头熊不能正常处理,它将会被开除。
在所有操作执行完毕后,输出每个用户的账户财富。

输入描述

输入的第一行包含一个整数 tt1t1061 \leq t \leq 10^6)——测试用例的数量。
每个测试用例的第一行包含三个整数 n,m,hn, m, h1n,m21051 \leq n, m \leq 2 \cdot 10^51h1091 \leq h \leq 10^9)——操作数组 aa 的长度、执行的操作次数,以及银行内部规定的上限值。
第二行包含 nn 个整数 a1,a2,,ana_1, a_2, \ldots, a_n0aih0 \leq a_i \leq h)——操作数组 aa
接下来的 mm 行每行包含两个整数 bi,cib_i, c_i1bin1 \leq b_i \leq n0ci1090 \leq c_i \leq 10^9)对操作数组执行的操作。
保证所有测试用例的 nn 的总和以及 mm 的总和均不超过 21052 \cdot 10^5

输出描述

对于每个测试用例,在所有操作执行完毕后,输出数组 aa

输入输出样例 #1

输入 #1

CPP
3
4 5 3
1 2 1
1 4
2 4
3 6
5 1 1 1 1
1 1
1 1
2 1
4 1
1 0 0 0
1 1
4 4 3
3 3 4
4 4 4

输出 #1

CPP
3 4 4
1 1 1 1
1 0 0 0

说明/提示

对于第一个测试用例,操作数组 aa 变化如下:
  • 在所有操作之前,a=[1,2,1]a = [1, 2, 1]
  • 第一次操作后 a=[5,2,1]a = [5, 2, 1]
  • 第二次操作后,a=[5,6,1]a = [5, 6, 1],但由于 6>h6 > h,计算机崩溃,a=[1,2,1]a = [1, 2, 1]
  • 第三次操作后,a=[1,2,4]a = [1, 2, 4]
  • 第四次操作后,a=[1,2,4]a = [1, 2, 4]
对于第三个测试用例,每次操作都会导致超出上限,因此 a=[1,0,0,0]a = [1, 0, 0, 0]

测试数据与约定

对于Subtask #1时限为500ms500ms
对于Subtask #2时限为700ms700ms
对于Subtask #3时限为2500ms2500ms

每组样例分值不相同

以下为std
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2 * 1e5 + 100;
long long t,n,m,h,a[N],b[N],c[N],d[N],vis[N];
int main(){
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
	cin>>t;
	for(int i = 1;i<=t;i++){ 
	    long long cnt = 0;
	    cin>>n>>m>>h;
	    for(int j = 1;j<=n;j++){
	        cin>>a[j];
	        d[j] = a[j];
	    }
	    for(int j = 1;j<=m;j++){
	    	cin>>b[j]>>c[j];
			vis[b[j]] = 0;
		}
	    for(int j = 1;j<=m;j++){
	    	long long now = b[j]; 
	        if(vis[now] < cnt)a[now] = d[now],vis[now] = cnt; 
	        a[now] += c[j];
	        if(a[now] > h){
	        	a[now] = d[now]; 
				cnt++;
	        	vis[now]++; 
			}
	    }
	    for(int j = 1;j<=n;j++){
	       if(vis[j] < cnt)cout<<d[j]<<" ";
	       else cout<<a[j]<<" ";
	    }
	    cout<<endl;
	}
	return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...