打卡信奥刷题(3243)用C++实现信奥题 P8539 「Wdoi-2」来自地上的支援
P8539 「Wdoi-2」来自地上的支援
题目背景
波光粼粼的山顶湖与庄严神圣的神社之下,是一座复合型活火山。
沿幻想风穴而下,便能到达火山之下,废弃已久的地狱原址。
在旧地狱中,有一座大都市。那里是旧地狱还是地狱的时候在那工作的众鬼们居住的地方,只有那里亡者们是无法踏入去的。后来地狱体制改革,机构搬离了这个地方。
因为这个缘故这块地狱变成了废墟,但却有一部分看上了那里的妖怪擅作主张占领了那里,于是就成了如今的旧地狱了。
这里比地上更没有秩序可言。悍匪恶霸,特别是惹人类讨厌的家伙都喜欢搬到这边定居下来。
自旧地狱喷泻而出的间歇泉,给妖怪之山带来了优良的温泉,也喷出了大量的怨灵。
为了解决这次异变,乐园的巫女和普通的魔法使结伴而行,在来自地上的支援下,自幻想风穴直冲地底。
先后结(bao)识(da)了黑暗洞窟中的明亮之网、地壳下的嫉妒心、人们所谈论的怪力乱神后,二人来到了遗址中心的洋馆,地灵殿。
受这里主人的指引,二人来到了位于深处的间歇泉地下中心。
题目描述
简要题意
给定正整数 nnn、vvv 和长度为 nnn 的数组 {Ai}\{A_i\}{Ai}。
有一个长度为 nnn 的数组 BBB,初始值与 AAA 相同。
执行 nnn 次操作,第 iii 次操作在 [1,i][1,i][1,i] 中按如下规则选取一个正整数 jjj,然后把 BjB_jBj 变成 Bj+vB_j+vBj+v:
- 选取 BjB_jBj 最大的 jjj。
- BjB_jBj 相同时选择 AjA_jAj 最大的 jjj。
- Aj,BjA_j,B_jAj,Bj 均相同,选择较小的 jjj。
我们称这是选中了一次 jjj。
有 mmm 次询问,每次询问给定 xi,kix_i,k_ixi,ki。表示求最小的 sss,使得若将 AxiA_{x_i}Axi 的初始值改为 sss(注意此时 BxiB_{x_i}Bxi 的初始值也会跟着改变),xix_ixi 至少被选中 kik_iki 次,或报告不存在(结果为 000)。请注意,sss 不存在最小值时也是报告不存在(结果为 000)。
询问之间互相独立,也就是每次询问不会对 AxiA_{x_i}Axi 和 BxiB_{x_i}Bxi 产生实质性更改。
原始题意
到达控制中心之后,主角组和灵乌路空进行了激烈的狗斗大赛。负责技术维护的河童需要接受荷取来自地上指挥部的指令,保障生产安全。
具体地,有 nnn 个核反应机组依次排开,第 iii 个机组的活动强度为 AiA_iAi。为了维护平衡,控制系统依次操作 nnn 次,第 iii 次操作会在前 iii 个机组中找到一个当前活动度最高的机组,进行一次调节平衡操作,并将其活动度增加 vvv。倘若有多个机组活动度最高,就应当选择初始活动度最大的,若还是无法比较,则取编号最小。
为了在自动控制系统的基础上调节平衡,荷取会发出 mmm 条指令,形如她每次会给出两个整数 xi,kix_i,k_ixi,ki,表示她会修改第 xix_ixi 个机组的初始活动度。她希望通过修改(必须改成一个非负整数 sss)后,xix_ixi 号机组至少被平衡 kik_iki 次。如果无论如何都无法达到要求,那么结果就是 000;否则请求出满足条件的最小的 sss。
输入格式
- 第一行有三个整数 n,m,vn, m, vn,m,v。
- 接下来一行,有 nnn 个整数,描述 aia_iai。
- 接下来 mmm 行,每行有两个整数 xi,kix_i,k_ixi,ki,描述一次询问。
输出格式
- 一行,输出两个整数,表示所有结果的异或和与加法和。
输入输出样例 #1
输入 #1
7 2 3
1 4 1 5 4 1 1
3 3
6 4
输出 #1
7 7
输入输出样例 #2
输入 #2
10 10 9
14 91 84 13 97 92 23 64 31 10
5 2
5 5
9 1
2 6
9 1
5 4
3 5
2 8
8 2
5 4
输出 #2
245 1177
说明/提示
样例 1 解释
对于第一次询问,我们将 A3A_3A3 修改为 777。
- 第一次操作选择了位置 111,于是 B1B_1B1 变为 444。
- 第二次操作选择了位置 222,于是 B2B_2B2 变为 777。虽然操作前 B1=B2B_1=B_2B1=B2,但是 A2>A1A_2>A_1A2>A1,因此选择位置 222。
- 第三次操作选择了位置 333,于是 B3B_3B3 变为 101010。
- 第四次操作选择了位置 333,于是 B3B_3B3 变为 131313。
- 第五次操作选择了位置 333,于是 B3B_3B3 变为 161616。
- 第六次操作选择了位置 333,于是 B3B_3B3 变为 191919。
- 第七次操作选择了位置 333,于是 B3B_3B3 变为 222222。
于是位置 333 一共被选择了 555 次,满足题意。可以证明,如果把 A3A_3A3 的初始值设为 666,无法达成要求。于是该询问结果为 777。
对于第二个询问,容易发现不可能有 444 次以上操作选择位置 666。因此该询问结果为 000。
7⊕0=77\oplus 0=77⊕0=7,7+0=77+0=77+0=7,因此输出 7,77,77,7。
数据范围
Subtaskn,m≤ai≤v≤分值110100101021005×103502031031091001041051091002552×10610910035 \def\arraystretch{1.5} \begin{array}{|c|c|c|c|c|}\hline \textbf{Subtask} & \bm{n,m\le} & \bm {a_i\le } & \bm{v\le} & \textbf{分值} \cr\hline 1 & 10 & 100 & 10 & 10 \cr\hline 2 & 100 & 5\times 10^3 & 50 & 20 \cr\hline 3 & 10^3 & 10^9 & 100 & 10 \cr\hline 4 & 10^5 & 10^9 & 100 & 25 \cr\hline 5 & 2\times 10^6 & 10^9 & 100 & 35 \cr\hline \end{array}Subtask12345n,m≤101001031052×106ai≤1005×103109109109v≤1050100100100分值1020102535
对于全部数据,满足 1≤n,m≤2×1061 \le n,m \le 2\times 10^61≤n,m≤2×106,1≤v≤1001 \le v \le 1001≤v≤100,1≤ai≤1091 \le a_i \le 10 ^ 91≤ai≤109,1≤x,k≤n1 \le x,k \le n1≤x,k≤n。
本题 IO 量较大,请选择合适的输入方式。
C++实现
#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=l;i>=r;i--)
using namespace std;
typedef long long i64;
const int INF =2147483647;
const int MAXN =1e7+3;
int n,m,v,w,l,F[MAXN],G[MAXN],A[MAXN],X[MAXN],K[MAXN];
i64 ans1,ans2; char _file[256];
int qread(){
int w=1,c,ret;
while((c=getchar())> '9'||c< '0')
w=(c=='-'?-1:1); ret=c-'0';
while((c=getchar())>='0'&&c<='9')
ret=ret*10+c-'0';
return ret*w;
}
int main(int argc,char **argv){
n=qread(),m=qread(),v=qread();
up(1,n,i) A[i]=qread();
up(1,m,i) X[i]=qread(),K[i]=qread();
A[0]=-INF;
up(1,n,i){
A[i]=w=A[i]-i*v;
if(w>=A[F[i-1]]) G[i]=F[i-1],F[i]=i; else
if(w>=A[G[i-1]]) G[i]=i,F[i]=F[i-1]; else
G[i]=G[i-1],F[i]=F[i-1];
}
up(1,m,i){
int x=X[i],k=K[i],y=x+k-1; l=0;
if(y<n)
l=max(0,x*v+(F[y]==x?A[G[y]]+(G[y]>x):A[F[y]]+(F[y]>x)));
ans1^=l,ans2+=l;
}
printf("%lld %lld\n",ans1,ans2);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐

所有评论(0)