MY rank

「QFOI R1」贴贴
题目描述
小 R 是一个可爱的女孩子,她希望通过给洛谷题目写题解的方式跟出题人贴贴。
她发现,如果从题解界面点击“提交题解”按钮,博客中会自动生成 URL 标识符,也就是文章的链接。
其中,标识符的生成规则如下:
- 将题号的所有大写字母转为小写。
- 将上一步结果的所有下划线转为减号。
- 在上一步结果前面加上
solution-。
她准备给一道题目写题解,已知这道题的题号,你能求出 URL 标识符吗?
输入格式
一行,一个字符串 sss,表示题号。
输出格式
一行,一个字符串,表示 URL 标识符。
样例 #1
样例输入 #1
P9202
样例输出 #1
solution-p9202
样例 #2
样例输入 #2
CF1797F
样例输出 #2
solution-cf1797f
样例 #3
样例输入 #3
AT_abc312_h
样例输出 #3
solution-at-abc312-h
提示
样例 333 解释
根据生成规则:
- 将题号的所有大写字母转为小写:
at_abc312_h。 - 将上一步结果的所有下划线转为减号:
at-abc312-h。 - 在上一步结果前面加上
solution-:solution-at-abc312-h。
数据范围
本题共 101010 个测试点,每个测试点 101010 分。
对于全部数据,保证题号仅包含大写字母(ASCII 65∼9065\sim 9065∼90)、小写字母(ASCII 97∼12297\sim 12297∼122)、数字(ASCII 48∼5748\sim 5748∼57)、下划线(ASCII 959595),且长度不超过 202020。
对于全部数据,答案中应当仅包含小写字母(ASCII 97∼12297\sim 12297∼122)、数字(ASCII 48∼5748\sim 5748∼57)、减号(ASCII 454545)。
- 对于测试点 111:保证为主题库题目。
- 对于测试点 222:保证为入门与面试题目。
- 对于测试点 3∼43\sim 43∼4:保证为 CodeForces 题目。
- 对于测试点 5∼65\sim 65∼6:保证为 SPOJ 题目。
- 对于测试点 7∼87\sim 87∼8:保证为 AtCoder 题目。
- 对于测试点 9∼109\sim 109∼10:保证为 UVA 题目。
核心思路
纯模拟,不解释
AC代码
#include<bits/stdc++.h>
using namespace std;
void be(string &s){
for(int i = 0;i < s.size();i++){
if(s[i] == '_')s[i] = '-';
if(s[i] >= 'A'&&s[i] <= 'Z')s[i] = s[i]-'A'+'a';
}
}
int main(){
string s;
cin>>s;
be(s);
cout<<"solution-"<<s;
return 0;
}
「QFOI R1」抱抱
题目描述
小 R 是一个可爱的女孩子,她希望跟大家抱抱,顺便给大家分蛋糕吃。
蛋糕是一个大小为 a×b×ca\times b\times ca×b×c 的长方体,其中每个单位正方体都被赋予了一个坐标 (x,y,z)(x,y,z)(x,y,z)(1≤x≤a,1≤y≤b,1≤z≤c1\le x\le a,1\le y\le b,1\le z\le c1≤x≤a,1≤y≤b,1≤z≤c)。
共进行 mmm 次切蛋糕操作,每次按如下三种方式之一切分:
- 切出 x≤kx\le kx≤k 的部分分给大家。
- 切出 y≤ky\le ky≤k 的部分分给大家。
- 切出 z≤kz\le kz≤k 的部分分给大家。
由于她自己也想吃蛋糕,她希望知道在每次切蛋糕后,还剩下多少体积没有分给大家。
输入格式
第一行四个整数 a,b,c,ma,b,c,ma,b,c,m,表示蛋糕的大小和切蛋糕次数。
接下来 mmm 行,每行两个整数 op,kop,kop,k,表示进行【题目描述】中的第 opopop 种操作,参数为 kkk。
输出格式
mmm 行,每行一个整数,表示剩余部分体积。
样例 #1
样例输入 #1
3 3 3 2
1 2
2 1
样例输出 #1
9
6
样例 #2
样例输入 #2
1000000 1000000 1000000 6
1 123456
2 654321
3 233333
2 111111
1 333333
3 1000000
样例输出 #2
876544000000000000
303002853376000000
232302288589217792
232302288589217792
176680542935560631
0
提示
样例 111 解释
第一次切蛋糕,将所有 x≤2x\le 2x≤2 的部分切掉,剩余的单位正方体有 (3,1,1),(3,1,2),(3,1,3),(3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3)(3,1,1),(3,1,2),(3,1,3),(3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3)(3,1,1),(3,1,2),(3,1,3),(3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3) 共 999 个。
第二次切蛋糕,将所有 y≤1y\le 1y≤1 的部分切掉,剩余的单位正方体有 (3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3)(3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3)(3,2,1),(3,2,2),(3,2,3),(3,3,1),(3,3,2),(3,3,3) 共 666 个。
样例 222 解释
第四次切蛋糕没有任何作用,因为第二次切蛋糕时 y≤654321y\le 654321y≤654321 的部分已经被切掉,此时已经不存在 y≤111111y\le 111111y≤111111 的单位正方体。
注意每次操作中的参数 kkk 是初始时决定的绝对坐标,不会随着操作的进行而改变。
数据范围
本题共 202020 个测试点,每个测试点 555 分。
对于全部数据,保证 1≤a,b,c≤1061\le a,b,c\le 10^61≤a,b,c≤106,1≤m≤2×1051\le m\le 2\times 10^51≤m≤2×105,op∈{1,2,3}op\in\{1,2,3\}op∈{1,2,3},若 op=1op=1op=1 则 1≤k≤a1\le k\le a1≤k≤a,若 op=2op=2op=2 则 1≤k≤b1\le k\le b1≤k≤b,若 op=3op=3op=3 则 1≤k≤c1\le k\le c1≤k≤c。
- 对于测试点 1∼51\sim 51∼5:保证 a,b,c,m≤100a,b,c,m\le 100a,b,c,m≤100。
- 对于测试点 6∼106\sim 106∼10:保证 b=c=1b=c=1b=c=1,op=1op=1op=1。
- 对于测试点 11∼1511\sim 1511∼15:保证 c=1c=1c=1,op∈{1,2}op\in\{1,2\}op∈{1,2}。
- 对于测试点 16∼2016\sim 2016∼20:无特殊限制。
核心思路
因为,绝对坐标+完全切割,所以,其实是可以直接求得。
我称这个做法为维度分解。
AC代码
#include<bits/stdc++.h>
using namespace std;
long long a,b,c;
long long nowa,nowb,nowc;
int m;
int main(){
cin>>a>>b>>c>>m;
nowa = a,nowb = b,nowc = c;
while(m--){
int op;
cin>>op;
if(op == 1){
long long x;
cin>>x;
nowa = min(nowa,a-x);
}
if(op == 2){
long long y;
cin>>y;
nowb = min(nowb,b-y);
}
if(op == 3){
long long z;
cin>>z;
nowc = min(nowc,c-z);
}
cout<<nowa*nowb*nowc<<endl;
}
return 0;
}
「QFOI R1」摸摸
题目描述
小 R 是一个可爱的女孩子,她喜欢被摸头。
但是摸头之前,必须答对她提出的一个问题。
她有一个长度为 nnn 的数列 aaa,初始时所有元素均为 000。另有两个长度为 nnn 的数列 t,bt,bt,b。
她可以进行两种操作:
- 将 ttt 与 ttt 的倒序对应元素相加,得到新的 ttt。
- 例如,t=[1,4,2]t=[1,4,2]t=[1,4,2] 变为 t′=[1+2,4+4,2+1]=[3,8,3]t'=[1+2,4+4,2+1]=[3,8,3]t′=[1+2,4+4,2+1]=[3,8,3]。
- 将 aaa 与 ttt 对应元素相加,得到新的 aaa。
- 例如,a=[1,2,3],t=[1,4,2]a=[1,2,3],t=[1,4,2]a=[1,2,3],t=[1,4,2] 变为 a′=[1+1,2+4,3+2]=[2,6,5]a'=[1+1,2+4,3+2]=[2,6,5]a′=[1+1,2+4,3+2]=[2,6,5]。
是否可能通过若干次以上操作将 aaa 变为 bbb?
你希望摸她的头 TTT 次,因此有 TTT 组数据。
输入格式
第一行一个整数 TTT,表示数据组数。
对于每组数据:
- 第一行一个整数 nnn,表示数列长度。
- 第二行 nnn 个整数,第 iii 个整数为 tit_iti。
- 第三行 nnn 个整数,第 iii 个整数为 bib_ibi。
输出格式
共 TTT 行,每行一个为 Yes 或 No 的字符串,表示每组数据是否可能将 aaa 变为 bbb。
字符串不区分大小写,如果答案为 Yes 的话,yes、YES、yEs 等都将被判为正确。
样例 #1
样例输入 #1
2
3
1 2 2
5 8 7
3
1 2 2
2 4 3
样例输出 #1
Yes
No
提示
样例解释
对于第一组数据:
- 初始时:a=[0,0,0]a=[0,0,0]a=[0,0,0],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[1,2,2]a=[1,2,2]a=[1,2,2],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[2,4,4]a=[2,4,4]a=[2,4,4],t=[1,2,2]t=[1,2,2]t=[1,2,2],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作一:a=[2,4,4]a=[2,4,4]a=[2,4,4],t=[3,4,3]t=[3,4,3]t=[3,4,3],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
- 执行操作二:a=[5,8,7]a=[5,8,7]a=[5,8,7],t=[3,4,3]t=[3,4,3]t=[3,4,3],b=[5,8,7]b=[5,8,7]b=[5,8,7]。
此时 a=ba=ba=b,符合要求。
对于第二组数据,可以证明不存在合法方案。
数据范围
本题共 202020 个测试点,每个测试点 555 分。
记 ∑n\sum n∑n 表示每组数据的 nnn 之和。
对于全部数据,保证 1≤∑n≤2×1031\le\sum n\le 2\times 10^31≤∑n≤2×103,n≥1n\ge 1n≥1,1≤ti,bi≤2×1031\le t_i,b_i\le 2\times 10^31≤ti,bi≤2×103。
- 对于测试点 1∼41\sim 41∼4:保证 n≤2n\le 2n≤2。
- 对于测试点 5∼85\sim 85∼8:保证所有 tit_iti 都相等。
- 对于测试点 9∼129\sim 129∼12:保证 bi=bn−i+1b_i=b_{n-i+1}bi=bn−i+1。
- 对于测试点 13∼1613\sim 1613∼16:保证 ∑n,ti,bi≤200\sum n,t_i,b_i\le 200∑n,ti,bi≤200。
- 对于测试点 17∼2017\sim 2017∼20:无特殊限制。
核心思路
t表示t的初始状态,t1 表示1次变化后的状态,t2 表示2次变化后的状态,一次类推。
经过观察a+t2a+t2a+t2 === a+t1∗2a+t1*2a+t1∗2
更具这个结论可以得出t1与t2…tn都是等价的。
因此,这道题就是找, b−tb-tb−t ∗k−t1∗m*k-t1*m∗k−t1∗m = 0,0,0..,0,0,0{0,0,0..,0,0,0}0,0,0..,0,0,0的情况
此时,我们只需要枚举k就行了。
而t1*m这一部分,可以通过写一个check()来判断。
AC代码
#include<bits/stdc++.h>
using namespace std;
int n;
int b[2020],t[2020],t2[2020],res[2020];
bool check(){
memset(res,0,sizeof(res));
bool ans = 1;
for(int i = 1;i <= n;i++){
if(b[i]%t2[i] != 0)return 0;
else res[i] = b[i]/t2[i];
}
for(int i = 2;i <= n;i++){
if(res[i] != res[i-1])return 0;
}
return 1;
}
int main(){
int T;
cin>>T;
while(T--){
cin>>n;
for(int i = 1;i <= n;i++){
cin>>t[i];
}
for(int i = 1;i <= n;i++){
t2[i] = t[i] + t[n-i+1];
}
for(int i = 1;i <= n;i++){
cin>>b[i];
}
bool pd = 1;
while(1){
if(check()){
cout<<"Yes"<<endl;
pd = 0;
break;
}
bool con = 0;
for(int i = 1;i <= n;i++){
b[i] = b[i]-t[i];
if(b[i] < 0){
con = 1;
break;
}
}
if(con)break;
}
if(pd)cout<<"No"<<endl;
}
return 0;
}
「QFOI R1」头
题目描述
小 R 是一个可爱的女孩子。有一天,她在被摸头时,突然灵光乍现,便随手加强了一道题给你做。
这道题的名字叫涂色游戏。初始时你有一个 nnn 行 mmm 列的网格,所有格子上都没有颜色。有 kkk 种颜色的刷子,颜色编号为 1∼k1\sim k1∼k。然后给出 qqq 次操作,每次操作给出 op,l,r,c,top,l,r,c,top,l,r,c,t 五个参数:
- 如果 op=1op=1op=1,表示将第 l∼rl\sim rl∼r 行的所有格子涂成颜色 ccc。
- 如果 op=2op=2op=2,表示将第 l∼rl\sim rl∼r 列的所有格子涂成颜色 ccc。
- 如果 t=0t=0t=0,意味着如果涂色时遇到已经被染色的格子,就不再进行染色。
- 如果 t=1t=1t=1,意味着如果涂色时遇到已经被染色的格子,就用新的颜色覆盖它。
在所有涂色操作结束以后,对于每种颜色,求出有多少个格子被染成了这种颜色。
输入格式
第一行四个整数 n,m,k,qn,m,k,qn,m,k,q,表示行数、列数、颜色数和操作数。
接下来 qqq 行,每行五个整数 op,l,r,c,top,l,r,c,top,l,r,c,t,表示这次操作的参数。
输出格式
一行 kkk 个整数,第 iii 个整数表示被染成颜色 iii 的格子数量。
样例 #1
样例输入 #1
5 5 2 4
1 2 4 1 0
2 4 5 1 1
2 2 4 2 0
1 1 1 2 1
样例输出 #1
17 7
样例 #2
样例输入 #2
5 5 3 6
2 1 3 3 1
2 2 4 1 0
1 4 4 2 0
2 1 1 1 0
1 2 5 2 0
1 1 5 3 0
样例输出 #2
5 4 16
提示
样例 111 解释
用浅灰色表示颜色 111,灰色表示颜色 222。
涂色过程如图所示:

共有 171717 个区域被染成颜色 111,777 个区域被染成颜色 222。
数据范围
本题共 202020 个测试点,每个测试点 555 分。
对于全部数据,保证 1≤n,m,q≤2×1061\le n,m,q\le 2\times 10^61≤n,m,q≤2×106,1≤k≤5×1051\le k\le 5\times 10^51≤k≤5×105,op∈{1,2}op\in\{1,2\}op∈{1,2},若 op=1op=1op=1 则 1≤l≤r≤n1\le l\le r\le n1≤l≤r≤n,若 op=2op=2op=2 则 1≤l≤r≤m1\le l\le r\le m1≤l≤r≤m,1≤c≤k1\le c\le k1≤c≤k,t∈{0,1}t\in\{0,1\}t∈{0,1}。
- 对于测试点 1∼31\sim 31∼3:保证 n,m,k,q≤200n,m,k,q\le 200n,m,k,q≤200。
- 对于测试点 4∼64\sim 64∼6:保证 n,m,k,q≤2×103n,m,k,q\le 2\times 10^3n,m,k,q≤2×103。
- 对于测试点 7∼97\sim 97∼9:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q≤105,op=1op=1op=1。
- 对于测试点 10∼1210\sim 1210∼12:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q≤105,t=1t=1t=1。
- 对于测试点 13∼1813\sim 1813∼18:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q≤105。
- 对于测试点 19∼2019\sim 2019∼20:无特殊限制。
15pt 思路
纯暴力,赛时想不出正解。
#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;
int mp[1001][1010],cnt[1000100];
void op1(int l,int r,int c,int t){
for(int i = l;i <= r;i++){
for(int j = 1;j <= m;j++){
if(t == 1)mp[i][j] = c;
else if(mp[i][j] == -1)mp[i][j] = c;
}
}
}
void op2(int l,int r,int c,int t){
for(int i = 1;i <= n;i++){
for(int j = l;j <= r;j++){
if(t == 1)mp[i][j] = c;
else if(mp[i][j] == -1)mp[i][j] = c;
}
}
}
int main(){
memset(mp,-1,sizeof(mp));
cin>>n>>m>>k>>q;
while(q--){
int op,l,r,c,t;
cin>>op>>l>>r>>c>>t;
if(op == 1){
op1(l,r,c,t);
}
else op2(l,r,c,t);
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(mp[i][j] != -1)cnt[mp[i][j]]++;
}
}
for(int i = 1;i <= k;i++)cout<<cnt[i]<<" ";
return 0;
}
239

被折叠的 条评论
为什么被折叠?



