【LGR-162-Div.3】洛谷基础赛 #5 & QFOI Round 1 赛时代码

MY rank

在这里插入图片描述

「QFOI R1」贴贴

题目描述

小 R 是一个可爱的女孩子,她希望通过给洛谷题目写题解的方式跟出题人贴贴。

她发现,如果从题解界面点击“提交题解”按钮,博客中会自动生成 URL 标识符,也就是文章的链接。

其中,标识符的生成规则如下:

  • 将题号的所有大写字母转为小写。
  • 将上一步结果的所有下划线转为减号。
  • 在上一步结果前面加上 solution-

她准备给一道题目写题解,已知这道题的题号,你能求出 URL 标识符吗?

输入格式

一行,一个字符串 s s s,表示题号。

输出格式

一行,一个字符串,表示 URL 标识符。

样例 #1

样例输入 #1

P9202

样例输出 #1

solution-p9202

样例 #2

样例输入 #2

CF1797F

样例输出 #2

solution-cf1797f

样例 #3

样例输入 #3

AT_abc312_h

样例输出 #3

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 6590)、小写字母(ASCII 97 ∼ 122 97\sim 122 97122)、数字(ASCII 48 ∼ 57 48\sim 57 4857)、下划线(ASCII 95 95 95),且长度不超过 20 20 20

对于全部数据,答案中应当仅包含小写字母(ASCII 97 ∼ 122 97\sim 122 97122)、数字(ASCII 48 ∼ 57 48\sim 57 4857)、减号(ASCII 45 45 45)。

  • 对于测试点 1 1 1:保证为主题库题目。
  • 对于测试点 2 2 2:保证为入门与面试题目。
  • 对于测试点 3 ∼ 4 3\sim 4 34:保证为 CodeForces 题目。
  • 对于测试点 5 ∼ 6 5\sim 6 56:保证为 SPOJ 题目。
  • 对于测试点 7 ∼ 8 7\sim 8 78:保证为 AtCoder 题目。
  • 对于测试点 9 ∼ 10 9\sim 10 910:保证为 UVA 题目。

核心思路

纯模拟,不解释

AC代码

#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;
	
}

「QFOI R1」抱抱

题目描述

小 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 1xa,1yb,1zc)。

共进行 m m m 次切蛋糕操作,每次按如下三种方式之一切分:

  1. 切出 x ≤ k x\le k xk 的部分分给大家。
  2. 切出 y ≤ k y\le k yk 的部分分给大家。
  3. 切出 z ≤ k z\le k zk 的部分分给大家。

由于她自己也想吃蛋糕,她希望知道在每次切蛋糕后,还剩下多少体积没有分给大家。

输入格式

第一行四个整数 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 行,每行一个整数,表示剩余部分体积。

样例 #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

提示

样例 1 1 1 解释

第一次切蛋糕,将所有 x ≤ 2 x\le 2 x2 的部分切掉,剩余的单位正方体有 ( 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 y1 的部分切掉,剩余的单位正方体有 ( 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 y654321 的部分已经被切掉,此时已经不存在 y ≤ 111111 y\le 111111 y111111 的单位正方体。

注意每次操作中的参数 k k k 是初始时决定的绝对坐标,不会随着操作的进行而改变。


数据范围

本题共 20 20 20 个测试点,每个测试点 5 5 5 分。

对于全部数据,保证 1 ≤ a , b , c ≤ 1 0 6 1\le a,b,c\le 10^6 1a,b,c106 1 ≤ m ≤ 2 × 1 0 5 1\le m\le 2\times 10^5 1m2×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 1ka,若 o p = 2 op=2 op=2 1 ≤ k ≤ b 1\le k\le b 1kb,若 o p = 3 op=3 op=3 1 ≤ k ≤ c 1\le k\le c 1kc

  • 对于测试点 1 ∼ 5 1\sim 5 15:保证 a , b , c , m ≤ 100 a,b,c,m\le 100 a,b,c,m100
  • 对于测试点 6 ∼ 10 6\sim 10 610:保证 b = c = 1 b=c=1 b=c=1 o p = 1 op=1 op=1
  • 对于测试点 11 ∼ 15 11\sim 15 1115:保证 c = 1 c=1 c=1 o p ∈ { 1 , 2 } op\in\{1,2\} op{1,2}
  • 对于测试点 16 ∼ 20 16\sim 20 1620:无特殊限制。

核心思路

因为,绝对坐标+完全切割,所以,其实是可以直接求得。
我称这个做法为维度分解。

AC代码

#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;
	
}

「QFOI R1」摸摸

题目描述

小 R 是一个可爱的女孩子,她喜欢被摸头。

但是摸头之前,必须答对她提出的一个问题。

她有一个长度为 n n n 的数列 a a a,初始时所有元素均为 0 0 0。另有两个长度为 n n n 的数列 t , b t,b t,b

她可以进行两种操作:

  1. t t t t t t 的倒序对应元素相加,得到新的 t t t
    • 例如, 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]
  2. a a a t t t 对应元素相加,得到新的 a a a
    • 例如, 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]

是否可能通过若干次以上操作将 a a a 变为 b b b

你希望摸她的头 T T T 次,因此有 T T T 组数据。

输入格式

第一行一个整数 T T T,表示数据组数。

对于每组数据:

  • 第一行一个整数 n n n,表示数列长度。
  • 第二行 n n n 个整数,第 i i i 个整数为 t i t_i ti
  • 第三行 n n n 个整数,第 i i i 个整数为 b i b_i bi

输出格式

T T T 行,每行一个为 YesNo 的字符串,表示每组数据是否可能将 a a a 变为 b b b

字符串不区分大小写,如果答案为 Yes 的话,yesYESyEs 等都将被判为正确。

样例 #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 = 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 1n2×103 n ≥ 1 n\ge 1 n1 1 ≤ t i , b i ≤ 2 × 1 0 3 1\le t_i,b_i\le 2\times 10^3 1ti,bi2×103

  • 对于测试点 1 ∼ 4 1\sim 4 14:保证 n ≤ 2 n\le 2 n2
  • 对于测试点 5 ∼ 8 5\sim 8 58:保证所有 t i t_i ti 都相等。
  • 对于测试点 9 ∼ 12 9\sim 12 912:保证 b i = b n − i + 1 b_i=b_{n-i+1} bi=bni+1
  • 对于测试点 13 ∼ 16 13\sim 16 1316:保证 ∑ n , t i , b i ≤ 200 \sum n,t_i,b_i\le 200 n,ti,bi200
  • 对于测试点 17 ∼ 20 17\sim 20 1720:无特殊限制。

核心思路

t表示t的初始状态,t1 表示1次变化后的状态,t2 表示2次变化后的状态,一次类推。

经过观察 a + t 2 a+t2 a+t2 = = = a + t 1 ∗ 2 a+t1*2 a+t12

更具这个结论可以得出t1与t2…tn都是等价的。

因此,这道题就是找, b − t b-t bt ∗ k − t 1 ∗ m *k-t1*m kt1m = 0 , 0 , 0.. , 0 , 0 , 0 {0,0,0..,0,0,0} 0,0,0..,0,0,0的情况

此时,我们只需要枚举k就行了。

而t1*m这一部分,可以通过写一个check()来判断。

AC代码

#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;
	
}

「QFOI R1」头

题目描述

小 R 是一个可爱的女孩子。有一天,她在被摸头时,突然灵光乍现,便随手加强了一道题给你做。

这道题的名字叫涂色游戏。初始时你有一个 n n n m m m 列的网格,所有格子上都没有颜色。有 k k k 种颜色的刷子,颜色编号为 1 ∼ k 1\sim k 1k。然后给出 q q q 次操作,每次操作给出 o p , l , r , c , t op,l,r,c,t op,l,r,c,t 五个参数:

  • 如果 o p = 1 op=1 op=1,表示将第 l ∼ r l\sim r lr 行的所有格子涂成颜色 c c c
  • 如果 o p = 2 op=2 op=2,表示将第 l ∼ r l\sim r lr 列的所有格子涂成颜色 c c c
  • 如果 t = 0 t=0 t=0,意味着如果涂色时遇到已经被染色的格子,就不再进行染色。
  • 如果 t = 1 t=1 t=1,意味着如果涂色时遇到已经被染色的格子,就用新的颜色覆盖它。

在所有涂色操作结束以后,对于每种颜色,求出有多少个格子被染成了这种颜色。

输入格式

第一行四个整数 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 的格子数量。

样例 #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

提示

样例 1 1 1 解释

用浅灰色表示颜色 1 1 1,灰色表示颜色 2 2 2

涂色过程如图所示:

【LGR-162-Div.3】洛谷基础赛 #5 & QFOI Round 1 赛时代码_第1张图片

共有 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 1n,m,q2×106 1 ≤ k ≤ 5 × 1 0 5 1\le k\le 5\times 10^5 1k5×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 1lrn,若 o p = 2 op=2 op=2 1 ≤ l ≤ r ≤ m 1\le l\le r\le m 1lrm 1 ≤ c ≤ k 1\le c\le k 1ck t ∈ { 0 , 1 } t\in\{0,1\} t{0,1}

  • 对于测试点 1 ∼ 3 1\sim 3 13:保证 n , m , k , q ≤ 200 n,m,k,q\le 200 n,m,k,q200
  • 对于测试点 4 ∼ 6 4\sim 6 46:保证 n , m , k , q ≤ 2 × 1 0 3 n,m,k,q\le 2\times 10^3 n,m,k,q2×103
  • 对于测试点 7 ∼ 9 7\sim 9 79:保证 n , m , k , q ≤ 1 0 5 n,m,k,q\le 10^5 n,m,k,q105 o p = 1 op=1 op=1
  • 对于测试点 10 ∼ 12 10\sim 12 1012:保证 n , m , k , q ≤ 1 0 5 n,m,k,q\le 10^5 n,m,k,q105 t = 1 t=1 t=1
  • 对于测试点 13 ∼ 18 13\sim 18 1318:保证 n , m , k , q ≤ 1 0 5 n,m,k,q\le 10^5 n,m,k,q105
  • 对于测试点 19 ∼ 20 19\sim 20 1920:无特殊限制。

15pt 思路

纯暴力,赛时想不出正解。

#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;
	
}

你可能感兴趣的:(算法,c++,开发语言)