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

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 906590)、小写字母(ASCII 97∼12297\sim 12297122)、数字(ASCII 48∼5748\sim 574857)、下划线(ASCII 959595),且长度不超过 202020

对于全部数据,答案中应当仅包含小写字母(ASCII 97∼12297\sim 12297122)、数字(ASCII 48∼5748\sim 574857)、减号(ASCII 454545)。

  • 对于测试点 111:保证为主题库题目。
  • 对于测试点 222:保证为入门与面试题目。
  • 对于测试点 3∼43\sim 434:保证为 CodeForces 题目。
  • 对于测试点 5∼65\sim 656:保证为 SPOJ 题目。
  • 对于测试点 7∼87\sim 878:保证为 AtCoder 题目。
  • 对于测试点 9∼109\sim 10910:保证为 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 c1xa,1yb,1zc)。

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

  1. 切出 x≤kx\le kxk 的部分分给大家。
  2. 切出 y≤ky\le kyk 的部分分给大家。
  3. 切出 z≤kz\le kzk 的部分分给大家。

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

输入格式

第一行四个整数 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 2x2 的部分切掉,剩余的单位正方体有 (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 1y1 的部分切掉,剩余的单位正方体有 (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 654321y654321 的部分已经被切掉,此时已经不存在 y≤111111y\le 111111y111111 的单位正方体。

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


数据范围

本题共 202020 个测试点,每个测试点 555 分。

对于全部数据,保证 1≤a,b,c≤1061\le a,b,c\le 10^61a,b,c1061≤m≤2×1051\le m\le 2\times 10^51m2×105op∈{1,2,3}op\in\{1,2,3\}op{1,2,3},若 op=1op=1op=11≤k≤a1\le k\le a1ka,若 op=2op=2op=21≤k≤b1\le k\le b1kb,若 op=3op=3op=31≤k≤c1\le k\le c1kc

  • 对于测试点 1∼51\sim 515:保证 a,b,c,m≤100a,b,c,m\le 100a,b,c,m100
  • 对于测试点 6∼106\sim 10610:保证 b=c=1b=c=1b=c=1op=1op=1op=1
  • 对于测试点 11∼1511\sim 151115:保证 c=1c=1c=1op∈{1,2}op\in\{1,2\}op{1,2}
  • 对于测试点 16∼2016\sim 201620:无特殊限制。

核心思路

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

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

她可以进行两种操作:

  1. tttttt 的倒序对应元素相加,得到新的 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]
  2. aaattt 对应元素相加,得到新的 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 行,每行一个为 YesNo 的字符串,表示每组数据是否可能将 aaa 变为 bbb

字符串不区分大小写,如果答案为 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=ba=ba=b,符合要求。

对于第二组数据,可以证明不存在合法方案。


数据范围

本题共 202020 个测试点,每个测试点 555 分。

∑n\sum nn 表示每组数据的 nnn 之和。

对于全部数据,保证 1≤∑n≤2×1031\le\sum n\le 2\times 10^31n2×103n≥1n\ge 1n11≤ti,bi≤2×1031\le t_i,b_i\le 2\times 10^31ti,bi2×103

  • 对于测试点 1∼41\sim 414:保证 n≤2n\le 2n2
  • 对于测试点 5∼85\sim 858:保证所有 tit_iti 都相等。
  • 对于测试点 9∼129\sim 12912:保证 bi=bn−i+1b_i=b_{n-i+1}bi=bni+1
  • 对于测试点 13∼1613\sim 161316:保证 ∑n,ti,bi≤200\sum n,t_i,b_i\le 200n,ti,bi200
  • 对于测试点 17∼2017\sim 201720:无特殊限制。

核心思路

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

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

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

因此,这道题就是找, b−tb-tbt ∗k−t1∗m*k-t1*mkt1m = 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 是一个可爱的女孩子。有一天,她在被摸头时,突然灵光乍现,便随手加强了一道题给你做。

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

  • 如果 op=1op=1op=1,表示将第 l∼rl\sim rlr 行的所有格子涂成颜色 ccc
  • 如果 op=2op=2op=2,表示将第 l∼rl\sim rlr 列的所有格子涂成颜色 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 个区域被染成颜色 111777 个区域被染成颜色 222


数据范围

本题共 202020 个测试点,每个测试点 555 分。

对于全部数据,保证 1≤n,m,q≤2×1061\le n,m,q\le 2\times 10^61n,m,q2×1061≤k≤5×1051\le k\le 5\times 10^51k5×105op∈{1,2}op\in\{1,2\}op{1,2},若 op=1op=1op=11≤l≤r≤n1\le l\le r\le n1lrn,若 op=2op=2op=21≤l≤r≤m1\le l\le r\le m1lrm1≤c≤k1\le c\le k1ckt∈{0,1}t\in\{0,1\}t{0,1}

  • 对于测试点 1∼31\sim 313:保证 n,m,k,q≤200n,m,k,q\le 200n,m,k,q200
  • 对于测试点 4∼64\sim 646:保证 n,m,k,q≤2×103n,m,k,q\le 2\times 10^3n,m,k,q2×103
  • 对于测试点 7∼97\sim 979:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q105op=1op=1op=1
  • 对于测试点 10∼1210\sim 121012:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q105t=1t=1t=1
  • 对于测试点 13∼1813\sim 181318:保证 n,m,k,q≤105n,m,k,q\le 10^5n,m,k,q105
  • 对于测试点 19∼2019\sim 201920:无特殊限制。

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;
	
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值