洛谷3月月赛div2 题解(模拟+数学+贪心+数学)
由于本人太蒻了,div1的没有参加,胡乱写了写div2的代码就赶过来了。
T1 苏联人
题目背景
题目名称是吸引你点进来的。
这是一道正常的题,和苏联没有任何关系。
题目描述
你在打 EE Round 1,发现第一题非常无聊。于是你不打了,去下国际象棋了。
结果你发现,由于神秘力量的影响,你的棋子只剩下若干黑色的战车,若干黑色的主教和一只白色的国王了。
由于你很无聊,所以你把一些黑色棋子放在了 8×88\times 88×8 的棋盘上。
由于你很无聊,所以你想知道,国王放在哪些格子是安全的。换句话说,有哪些格子不会被战车和主教攻击到。当然,国王不能放在已经有棋子的地方。
为了防止你无聊透顶而不知道国际象棋的规则,这里给出以下提示(如果你知道规则那么可以跳过):
国际象棋中,战车可以横向、竖向移动,且格数不受限制。但不能越过其他棋子。
如图,黄色的格子为战车能走到(攻击到)的格子。
国际象棋中,主教可以斜向移动,且格数不受限制。但不能越过其他棋子。
如图,黄色的格子为主教能走到(攻击到)的格子。
简单来说,如果当前位置到目标位置的直线上存在其他棋子,则可以称为“越过了其他棋子”。
如果目标位置是对方的棋子,那么移动到目标位置后,对方的棋子会被吃掉。
更进一步地,你要找的所有位置,必须满足没有黑色棋子能一步走到。
如果你还是没有读懂,可以结合样例进行理解。
输入格式
共 8 行,每行 8 个字符,表示棋盘的状态。
其中 .
表示空位,R
表示战车,B
表示主教。
————————————————————————————————————————————————-
根据题意模拟即可,数据比较水。
#include<bits/stdc++.h>
using namespace std;
int a[][];
int main()
{
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
a[i][j]=;
char ch;cin>>ch;
if (ch=='B') a[i][j]=;
else if (ch=='R') a[i][j]=;
}
for (int i=;i<=;i++)
for (int j=;j<=;j++)
{
if (a[i][j]==||a[i][j]==) continue;
if (a[i][j]==)
{
for (int k=j-;k>=;k--)
if (a[i][k]==||a[i][k]==) break;
else a[i][k]=;
for (int k=j+;k<=;k++)
if (a[i][k]==||a[i][k]==) break;
else a[i][k]=;
for (int k=i-;k>=;k--)
if (a[k][j]==||a[k][j]==) break;
else a[k][j]=;
for (int k=i+;k<=;k++)
if (a[k][j]==||a[k][j]==) break;
else a[k][j]=;
}
if (a[i][j]==)
{
for (int k=i-,l=j-;min(k,l)>=;k--,l--)
if (a[k][l]==||a[k][l]==) break;
else a[k][l]=;
for (int k=i+,l=j+;max(k,l)<=;k++,l++)
if (a[k][l]==||a[k][l]==) break;
else a[k][l]=;
for (int k=i+;i+j-k>=&&k<=;k++)
if (a[k][i+j-k]==||a[k][i+j-k]==) break;
else a[k][i+j-k]=;
for (int k=i-;k>=&&i+j-k<=;k--)
if (a[k][i+j-k]==||a[k][i+j-k]==) break;
else a[k][i+j-k]=;
}
}
for (int i=;i<=;i++)
{
for (int j=;j<=;j++)
if (a[i][j]==) cout<<;
else cout<<;
cout<<endl;
}
return ;
}
T2 迫害
题目描述
有 kkk 个人,X 要对这 kkk 个人进行迫害。
这 kkk 个人,每一个人都拥有一个数字,分别从 111 至 kkk。
X 拥有 n+mn+mn+m 个数字,这些数字为 nnn 个 111 和 mmm 个大小可由 X 决定的数字(每个数字定好之后不能更换)。
X 能对这些人进行迫害,当且仅当他能用手中若干个数的加和等于被迫害人的数字,一次迫害就成功了(不会消耗数字)。
由于 X 的权利极大,又十分邪恶,他想要从第 111 个人开始一个一个进行迫害行动。
由于小 Z 也在这个被迫害的行列里,他十分的慌张,希望你来告诉他 X 能最多能从第一个人开始连续迫害多少个人。
由于被迫害的人太多了,所以请将答案对 100000000710000000071000000007 取模。
输入格式
第一行两个整数 n,mn,mn,m,表示 X 有 nnn 个 111,有 mmm 个大小可自定的数。
输出格式
请你告诉小 Z,X 能迫害多少个人。
--------------------------------------------------------------------------------------
可以发现这样的规律:
n=1
1 2 4 8 16……为最佳方案数
n=2
1 1 3 6 12 24……为最佳方案数
归纳得出方案总数为pow(2,m)*(n+1)-1,需要使用快速幂。
#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
int n,m;
const int mod=;
unsigned long long qcal(int a, int b) {
int ans = , base = a;
while (b != ) {
if (b & != )
{
ans *= base;
ans%=mod;
}
base *= base;
base%=mod;
b >>= ;
b%=mod;
}
return ans%mod;
}
signed main()
{
cin>>n>>m;
unsigned long long ans=qcal(,m)*(n+);
ans%=mod;
printf("%lld",(ans-)%mod);
return ;
}
T3 代价
题目描述
给出一段序列,删数。代价为a[i-1]*a[i]*a[i+1]。求最小代价。
输入格式
第一行一个正整数 n。
第二行 n 个正整数,第 i个数表示 a[i+1]。
输出格式
一行一个正整数,表示最小的代价和。
-----------------------------------------------------------------------------
贪心比较显然,但关键是怎么贪?
以样例为例:
4
19 26 8 17
序列上实际是1 19 26 8 17 1
既然让代价最小,那我们可以让序列从一端出去,即ans+=a[i]*a[i+1]。因为不管怎样,相邻的两个数必有一乘,乘1能将代价最小化。
但实际上情况要复杂。序列中可能有无穷多个1。按照这种贪心策略,这时候的1是要分开处理的。所以我们不妨将两个1之间的序列单独处理。
具体可以看代码。
#include<bits/stdc++.h>
#define int long long
using namespace std;
int ans,a[],minn=0x3f3f3f3f,n,cnt;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
signed main()
{
n=read();
a[]=a[n+]=;
for (int i=;i<=n;i++){
a[i]=read();
minn=min(a[i],minn);
}
if (minn==)
{
minn=0x3f3f3f3f;
for (int i=;i<=n+;i++)
{
if (a[i]==)
{
++cnt;
if (minn!=0x3f3f3f3f) ans+=minn,minn=0x3f3f3f3f;
continue;
}
minn=min(a[i],minn);
if (a[i+]!=) ans+=1ll*a[i]*a[i+];
}
ans+=cnt-;
}
else{
ans=minn;
for (int i=;i<n;i++) ans+=1ll*a[i]*a[i+];
}
printf("%lld",ans);
return ;
}
T4 礼物
-------------------------------------------------------------------------------------------------------
我事先并不知道正解是什么,如果洛谷出题解了,我会仔细看正解的,我的程序很慢很慢。
什么?证明?不存在的!我这种数学蒟蒻怎么会证明!
通过对n<=100的数据进行打表我们可以发现,ans=从1到num所有质数的乘积之和(除了被标记的质数)-1;
(其实是笔者手算了一大堆数据,现在感觉挺秃然的
所以我们现在可以愉快地写代码了。
你会惊奇地发现,全TLE了。
所以这就要考验各位OIer的人品和卡常技巧了。
1.八聚氧
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
下面是代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<bitset>//压位用的,不然内存会爆炸,笔者用int时内存达到了1G
using namespace std;
int prime[],num;
int n,m,c;
int p[];
bitset<>v;
int main()
{
scanf("%d%d%d",&n,&m,&c);
for (register int i=;i<=n;++i)//您需要灵活优化线性筛素数,才能防止被3e8的数据卡掉
{
if (!v[i]){
prime[++num]=i;
}
if((!(i&))&&(i<<)<=n){
v[i<<]=;
continue;
}
for(register int j=;j<=num;j+=){
if(i*prime[j]>n)break;
v[i*prime[j]]=;
if(!(i%prime[j]))break;
if(j+>num)break;
if(i*prime[j+]>n)break;
v[i*prime[j+]]=;
if(!(i%prime[j+]))break;
if(j+>num)break;
if(i*prime[j+]>n)break;
v[i*prime[j+]]=;
if(!(i%prime[j+]))break;
if(j+>num)break;
if(i*prime[j+]>n)break;
v[i*prime[j+]]=;
if(!(i%prime[j+]))break;
}
}
for(register int i=;i<=m;i++){
scanf("%d",&p[i]);
if(p[i]==){//1肯定不行,因为上来就出错,a3=3
printf("-1\n");
return ;
}
}
sort(p+,p+m+);//这里排序是为了更好地去重
int now=;
int ans=;
for(register int i=;i<=num;++i){
if(now<=m&&p[now]==i){
while(now<=m&&p[now]==i)now++;
continue;
}
ans=(1ll*ans*prime[i])%c;
}
printf("%d\n",(ans-+c)%c);
return ;
}
啊啊啊啊重复一遍我只是个蒟蒻,其实把这个代码发出来是为了给一点思路都没有的同学看的,咱别的不行,OI的基本操作咱还是要会的。
顺带一提,这道题我提交了43次才通过,名副其实的毒瘤题目。
洛谷3月月赛div2 题解(模拟+数学+贪心+数学)的更多相关文章
- 【LGR-070】洛谷 3 月月赛-官方题解
本次免费为大家提供[LGR-070]洛谷 3 月月赛的官方题解,点个赞再走呗! 代码就不上了,大家可以到别的博客上去找找!希望这篇博客能对你有所帮助!
- 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心
题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi,地面的高度是 h_0 = 0 ...
- 洛谷10月月赛II题解
[咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...
- 最大字段和&洛谷11月月赛DIV2 T1
蒟蒻只能打一打DIV2的基础题 太卑微了 这道题的本质其实是再建一个数组,如果s串i位置是0那么就给a[i]赋值为1,表示要累加个数,如果是1那么就把a[i]赋值为-1,表示个数减一,最后求最大子段和 ...
- 洛谷3月月赛 R1 Step! ZERO to ONE
洛谷3月月赛 R1 Step! ZERO to ONE 普及组难度 290.25/310滚粗 t1 10分的日语翻译题....太难了不会... t2 真·普及组.略 注意长为1的情况 #include ...
- 【洛谷5月月赛】玩游戏(NTT,生成函数)
[洛谷5月月赛]玩游戏(NTT,生成函数) 题面 Luogu 题解 看一下要求的是什么东西 \((a_x+b_y)^i\)的期望.期望显然是所有答案和的平均数. 所以求出所有的答案就在乘一个逆元就好了 ...
- 洛谷9月月赛round2
洛谷9月月赛2 t1 题意:懒得说了 分析:模拟 代码: program flag; var a:..,..]of char; n,i,m,j,x,y,ans,k:longint; begin ass ...
- 「P4996」「洛谷11月月赛」 咕咕咕(数论
题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...
- 「P4994」「洛谷11月月赛」 终于结束的起点(枚举
题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...
随机推荐
- Oracle 对表的基本CURD操作
Oracle对表的基本Curd操作: 样式表: 接下来对这张(表明:Stud)表进行Curd操作(请看面SQL代码) 增加新的字段列:alter table Stud add(heigh ...
- 浏览器如何解析css选择器?
浏览器会『从右往左』解析CSS选择器. 我们知道DOM Tree与Style Rules合成为 Render Tree,实际上是需要将Style Rules附着到DOM Tree上, 因此需要根据选择 ...
- 痞子衡嵌入式:其实i.MXRT1050,1020,1015系列ROM也提供了FlexSPI driver API
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1050/1020/1015系列ROM中的FlexSPI驱动API使用. 今天痞子衡去4S店给爱车做保养了,保养一次要等两小 ...
- python 将指定文件夹中的指定文件放入指定文件夹中
import os import shutil import re #获取指定文件中文件名 def get_filename(filetype): name =[] final_name_list = ...
- scrapy 基础组件专题(九):scrapy-redis 源码分析
下面我们来看看,scrapy-redis的每一个源代码文件都实现了什么功能,最后如何实现分布式的爬虫系统: connection.py 连接得配置文件 defaults.py 默认得配置文件 dupe ...
- 前端02 /HTML标签
前端02 /HTML标签 目录 前端02 /HTML标签 1.特殊字符 2.标签分类 标签嵌套 1.块级标签(行内标签) 1.1div标签(块标签) 1.2p标签(块标签) 2.内联标签 2.1 sp ...
- 邂逅Vue.js
1.简单认识一下Vue.js Vue (读音 /vjuː/,类似于 view),不要读错. Vue是一个渐进式的框架,什么是渐进式的呢? p渐进式意味着你可以将Vue作为你应用的一部分嵌入其中,带来更 ...
- JMeter-一个接口的返回值作为输入传给其他接口
背景: 在用JMeter写接口case,遇到一种情况,接口1查看列表接口,接口2查看详情接口,接口2需要传入接口1列表的第一条数据的id 解决方案: 首先放一下总体截图 具体步骤 1-新建一个Thre ...
- sanri-tools-maven 企业软件开发工具集
9420 开发工具包 sanri-tools-maven 是一个开源的用于企业开发的工具包,重点想解决项目开发中一些比较麻烦的问题 根据表和模板生成相应代码:一些身份证,企业代码,车架号的验证与生成: ...
- equals方法与==关系的总结
/** * ==&&equals区别 * * ==比较的是栈内存中的值 * 对于基本类型数据,比较的是栈内存中的值 * 对于引用数据类型,比较的是栈内存中的值(值的真是含义是一个地址) ...