小 R 是一个可爱的女孩子,她希望通过给洛谷题目写题解的方式跟出题人贴贴。
她发现,如果从题解界面点击“提交题解”按钮,博客中会自动生成 URL 标识符,也就是文章的链接。
其中,标识符的生成规则如下:
solution-
。她准备给一道题目写题解,已知这道题的题号,你能求出 URL 标识符吗?
一行,一个字符串 s s s,表示题号。
一行,一个字符串,表示 URL 标识符。
P9202
solution-p9202
CF1797F
solution-cf1797f
AT_abc312_h
solution-at-abc312-h
样例 3 3 3 解释
根据生成规则:
at_abc312_h
。at-abc312-h
。solution-
:solution-at-abc312-h
。数据范围
本题共 10 10 10 个测试点,每个测试点 10 10 10 分。
对于全部数据,保证题号仅包含大写字母(ASCII 65 ∼ 90 65\sim 90 65∼90)、小写字母(ASCII 97 ∼ 122 97\sim 122 97∼122)、数字(ASCII 48 ∼ 57 48\sim 57 48∼57)、下划线(ASCII 95 95 95),且长度不超过 20 20 20。
对于全部数据,答案中应当仅包含小写字母(ASCII 97 ∼ 122 97\sim 122 97∼122)、数字(ASCII 48 ∼ 57 48\sim 57 48∼57)、减号(ASCII 45 45 45)。
纯模拟,不解释
#include
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;
}
小 R 是一个可爱的女孩子,她希望跟大家抱抱,顺便给大家分蛋糕吃。
蛋糕是一个大小为 a × b × c a\times b\times c a×b×c 的长方体,其中每个单位正方体都被赋予了一个坐标 ( x , y , z ) (x,y,z) (x,y,z)( 1 ≤ x ≤ a , 1 ≤ y ≤ b , 1 ≤ z ≤ c 1\le x\le a,1\le y\le b,1\le z\le c 1≤x≤a,1≤y≤b,1≤z≤c)。
共进行 m m m 次切蛋糕操作,每次按如下三种方式之一切分:
由于她自己也想吃蛋糕,她希望知道在每次切蛋糕后,还剩下多少体积没有分给大家。
第一行四个整数 a , b , c , m a,b,c,m a,b,c,m,表示蛋糕的大小和切蛋糕次数。
接下来 m m m 行,每行两个整数 o p , k op,k op,k,表示进行【题目描述】中的第 o p op op 种操作,参数为 k k k。
m m m 行,每行一个整数,表示剩余部分体积。
3 3 3 2
1 2
2 1
9
6
1000000 1000000 1000000 6
1 123456
2 654321
3 233333
2 111111
1 333333
3 1000000
876544000000000000
303002853376000000
232302288589217792
232302288589217792
176680542935560631
0
样例 1 1 1 解释
第一次切蛋糕,将所有 x ≤ 2 x\le 2 x≤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) 共 9 9 9 个。
第二次切蛋糕,将所有 y ≤ 1 y\le 1 y≤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) 共 6 6 6 个。
样例 2 2 2 解释
第四次切蛋糕没有任何作用,因为第二次切蛋糕时 y ≤ 654321 y\le 654321 y≤654321 的部分已经被切掉,此时已经不存在 y ≤ 111111 y\le 111111 y≤111111 的单位正方体。
注意每次操作中的参数 k k k 是初始时决定的绝对坐标,不会随着操作的进行而改变。
数据范围
本题共 20 20 20 个测试点,每个测试点 5 5 5 分。
对于全部数据,保证 1 ≤ a , b , c ≤ 1 0 6 1\le a,b,c\le 10^6 1≤a,b,c≤106, 1 ≤ m ≤ 2 × 1 0 5 1\le m\le 2\times 10^5 1≤m≤2×105, o p ∈ { 1 , 2 , 3 } op\in\{1,2,3\} op∈{1,2,3},若 o p = 1 op=1 op=1 则 1 ≤ k ≤ a 1\le k\le a 1≤k≤a,若 o p = 2 op=2 op=2 则 1 ≤ k ≤ b 1\le k\le b 1≤k≤b,若 o p = 3 op=3 op=3 则 1 ≤ k ≤ c 1\le k\le c 1≤k≤c。
因为,绝对坐标+完全切割,所以,其实是可以直接求得。
我称这个做法为维度分解。
#include
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;
}
小 R 是一个可爱的女孩子,她喜欢被摸头。
但是摸头之前,必须答对她提出的一个问题。
她有一个长度为 n n n 的数列 a a a,初始时所有元素均为 0 0 0。另有两个长度为 n n n 的数列 t , b t,b t,b。
她可以进行两种操作:
是否可能通过若干次以上操作将 a a a 变为 b b b?
你希望摸她的头 T T T 次,因此有 T T T 组数据。
第一行一个整数 T T T,表示数据组数。
对于每组数据:
共 T T T 行,每行一个为 Yes
或 No
的字符串,表示每组数据是否可能将 a a a 变为 b b b。
字符串不区分大小写,如果答案为 Yes
的话,yes
、YES
、yEs
等都将被判为正确。
2
3
1 2 2
5 8 7
3
1 2 2
2 4 3
Yes
No
样例解释
对于第一组数据:
此时 a = b a=b a=b,符合要求。
对于第二组数据,可以证明不存在合法方案。
数据范围
本题共 20 20 20 个测试点,每个测试点 5 5 5 分。
记 ∑ n \sum n ∑n 表示每组数据的 n n n 之和。
对于全部数据,保证 1 ≤ ∑ n ≤ 2 × 1 0 3 1\le\sum n\le 2\times 10^3 1≤∑n≤2×103, n ≥ 1 n\ge 1 n≥1, 1 ≤ t i , b i ≤ 2 × 1 0 3 1\le t_i,b_i\le 2\times 10^3 1≤ti,bi≤2×103。
t表示t的初始状态,t1 表示1次变化后的状态,t2 表示2次变化后的状态,一次类推。
经过观察 a + t 2 a+t2 a+t2 = = = a + t 1 ∗ 2 a+t1*2 a+t1∗2
更具这个结论可以得出t1与t2…tn都是等价的。
因此,这道题就是找, b − t b-t b−t ∗ k − t 1 ∗ 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()来判断。
#include
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;
}
小 R 是一个可爱的女孩子。有一天,她在被摸头时,突然灵光乍现,便随手加强了一道题给你做。
这道题的名字叫涂色游戏。初始时你有一个 n n n 行 m m m 列的网格,所有格子上都没有颜色。有 k k k 种颜色的刷子,颜色编号为 1 ∼ k 1\sim k 1∼k。然后给出 q q q 次操作,每次操作给出 o p , l , r , c , t op,l,r,c,t op,l,r,c,t 五个参数:
在所有涂色操作结束以后,对于每种颜色,求出有多少个格子被染成了这种颜色。
第一行四个整数 n , m , k , q n,m,k,q n,m,k,q,表示行数、列数、颜色数和操作数。
接下来 q q q 行,每行五个整数 o p , l , r , c , t op,l,r,c,t op,l,r,c,t,表示这次操作的参数。
一行 k k k 个整数,第 i i i 个整数表示被染成颜色 i i i 的格子数量。
5 5 2 4
1 2 4 1 0
2 4 5 1 1
2 2 4 2 0
1 1 1 2 1
17 7
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
5 4 16
样例 1 1 1 解释
用浅灰色表示颜色 1 1 1,灰色表示颜色 2 2 2。
涂色过程如图所示:
共有 17 17 17 个区域被染成颜色 1 1 1, 7 7 7 个区域被染成颜色 2 2 2。
数据范围
本题共 20 20 20 个测试点,每个测试点 5 5 5 分。
对于全部数据,保证 1 ≤ n , m , q ≤ 2 × 1 0 6 1\le n,m,q\le 2\times 10^6 1≤n,m,q≤2×106, 1 ≤ k ≤ 5 × 1 0 5 1\le k\le 5\times 10^5 1≤k≤5×105, o p ∈ { 1 , 2 } op\in\{1,2\} op∈{1,2},若 o p = 1 op=1 op=1 则 1 ≤ l ≤ r ≤ n 1\le l\le r\le n 1≤l≤r≤n,若 o p = 2 op=2 op=2 则 1 ≤ l ≤ r ≤ m 1\le l\le r\le m 1≤l≤r≤m, 1 ≤ c ≤ k 1\le c\le k 1≤c≤k, t ∈ { 0 , 1 } t\in\{0,1\} t∈{0,1}。
纯暴力,赛时想不出正解。
#include
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;
}