喵哈哈村的魔法考试 Round #7 (Div.2)

注意!后四道题来自于周日的hihocoder offer收割赛第九场。

我建了个群:欢迎加入qscoj交流群,群号码:540667432

大概作为该oj的讨论吧,未来应该会上线一个bbs的。

喵哈哈村的七十六

签到题,直接for一遍判断就好了嘛

#include<bits/stdc++.h>
using namespace std;
int n,a;
int main(){
while(cin>>n>>a){
int ans = 0;
for(int i=0;i<n;i++){
int b,c;
cin>>b>>c;
if(a>=b)ans=max(ans,c);
}
cout<<ans<<endl;
}
}

喵哈哈村的麦克雷

对于这道题,你需要知道bfs。

把0压进队列里面,然后BFS就行了。

bfs找到的,就一定是最近的路。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 805;
string s[maxn];
int mp[maxn][maxn];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int n,m;
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
memset(mp,-1,sizeof(mp));
for(int i=0;i<n;i++)
cin>>s[i];
queue<int> QX,QY;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='0'){
mp[i][j]=0;
QX.push(i);
QY.push(j);
}
}
}
while(!QX.empty()){
int nx = QX.front();
int ny = QY.front();
QX.pop();
QY.pop();
for(int i=0;i<4;i++){
int nex=nx+dx[i];
int ney=ny+dy[i];
if(nex<0||nex>=n)continue;
if(ney<0||ney>=m)continue;
if(mp[nex][ney]!=-1)continue;
mp[nex][ney]=mp[nx][ny]+1;
QX.push(nex);
QY.push(ney);
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<mp[i][j]<<" ";
}
cout<<endl;
}
}
}

喵哈哈村的Dva

这道题实际上是模拟题,考虑的情况有点多。

我这里给一个我的做法:

手写一个cal()函数,表示1970年到这一天需要多少秒,然后两者相减,就是中间的答案。

然后就是讨论+特判了……

#include<bits/stdc++.h>
using namespace std; string s1,s2,s3,s4;
int YYYY1,m1,d1,h1,f1,mi1,y2,m2,d2,h2,f2,mi2;
int V1[50]={1972,1973,1974,1975,1976,1977,1978,1979,1987,1989,1990,1995,1998,2005,2008,2016};//16
int V2[50]={1972,1981,1982,1983,1985,1992,1993,1994,1997,2012,2015};//11
int M[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void gettime(){
YYYY1=0,m1=0,d1=0,h1=0,f1=0,mi1=0,y2=0,m2=0,d2=0,h2=0,f2=0,mi2=0;
for(int i=0;i<4;i++){
YYYY1=YYYY1*10+(s1[i]-'0');
y2=y2*10+(s3[i]-'0');
}
for(int i=5;i<7;i++){
m1=m1*10+(s1[i]-'0');
m2=m2*10+(s3[i]-'0');
}
for(int i=8;i<10;i++){
d1=d1*10+(s1[i]-'0');
d2=d2*10+(s3[i]-'0');
}
for(int i=0;i<2;i++){
h1=h1*10+(s2[i]-'0');
h2=h2*10+(s4[i]-'0');
}
for(int i=3;i<5;i++){
f1=f1*10+(s2[i]-'0');
f2=f2*10+(s4[i]-'0');
}
for(int i=6;i<8;i++){
mi1=mi1*10+(s2[i]-'0');
mi2=mi2*10+(s4[i]-'0');
}
}
bool check(int p)
{
if(p%400==0)return 1;
if(p%4==0&&p%100!=0)return 1;
return 0;
}
int check2(int y){
int tmp = 0;
for(int i=0;i<16;i++)
if(V1[i]==y)tmp++;
for(int i=0;i<11;i++)
if(V2[i]==y)tmp++;
return tmp;
}
int check6(int y){
for(int i=0;i<11;i++)
if(V2[i]==y)return 1;
return 0;
}
int check12(int y){
for(int i=0;i<16;i++)
if(V1[i]==y)return 1;
return 0;
}
long long solve(int y,int m,int d,int h,int f,int mi){
long long tmp = 0;
for(int i=1970;i<y;i++){
if(check(i))tmp+=1ll*366*24*60*60;
else tmp+=1ll*365*24*60*60;
tmp+=check2(i);
}
for(int j=0;j<m-1;j++){
if(j==1&&check(y))tmp+=1ll*29*24*60*60;
else tmp+=1ll*M[j]*24*60*60;
if(j==5&&check6(y))tmp++;
}
for(int k=0;k<d-1;k++){
tmp+=24*60*60;
}
for(int i=0;i<h;i++){
tmp+=60*60;
}
for(int i=0;i<f;i++)
tmp+=60;
tmp+=mi;
return tmp;
}
int main(){
while(cin>>s1>>s2>>s3>>s4){
gettime();
long long ans=solve(y2,m2,d2,h2,f2,mi2)-solve(YYYY1,m1,d1,h1,f1,mi1);
cout<<ans<<endl;
}
}

喵哈哈村的卢西奥

两种情况:

第一种情况,有两个是子树,这个东西用启发式合并/dp去维护一下当前sz[x]=all/3的个数就好了。

第二种情况,只有一个是子树,那么第二段显然是包含了第一段的,那么就存在一个的size=2all/3,一个sz=all/3的情况,统计一下就好了。

dfs处理一下就好了,具体看代码:

#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm> #include <string>
#include <sstream>
#include <iomanip>
#include <iostream>
#include <fstream>
// #include <unordered_set> using namespace std; #define FF first
#define SS second
#define MP make_pair
#define PB push_back
#define lson rt << 1, l, mid
#define rson rt << 1 | 1, mid + 1, r
#define FOR(i, n, m) for(int i = n; i <= m; i++)
#define REP(i, n, m) for(int i = n; i >= m; i--)
#define ll long long typedef long long LL;
typedef pair<int,int> PII;
typedef pair<LL, LL> PLL;
typedef unsigned long long ULL; /****************************define***************************************/
const int mod = 1e9 + 7;
const int maxn = 100010; int n;
int v[maxn], sz[maxn], p[maxn];
vector<int> nd[maxn];
int s;
int cn = 0, cn2 = 0;
ll ans = 0; void Dfs_sz(int u){
sz[u] += v[u];
int t = nd[u].size();
FOR(i, 0, t-1) {
Dfs_sz(nd[u][i]);
sz[u] += sz[nd[u][i]];
}
}
void Dfs(int u){
//printf("node %d. ans %d. cn %d. cn2 %d. sz %d\n", u, ans, cn, cn2, sz[u]);
if(sz[u] == s/3) {
ans += cn + cn2;
//printf("node %d. ans %d\n", u, ans);
}
if(p[u] != 0 && sz[u] == s*2/3) cn2++;
int t = nd[u].size();
FOR(i, 0, t-1){
Dfs(nd[u][i]);
}
if(sz[u] == s/3) cn++;
if(p[u] != 0 && sz[u] == s*2/3) cn2--;
} int main(){
int t;
cin >> t;
while(t--){
cn = 0, cn2 = 0;
s = 0, ans = 0;
FOR(i, 0, maxn-1) nd[i].clear();
memset(sz, 0, sizeof(sz)); int n, root=-1;
cin >> n;
FOR(i, 1, n) {
cin >> v[i] >> p[i];
s += v[i];
nd[p[i]].PB(i);
if(p[i] == 0) root=i;
}
if(s % 3 != 0) cout << 0 << endl;
else{
Dfs_sz(root);
Dfs(root);
printf("%lld\n", ans);
}
}
return 0;
}

喵哈哈村的小美

数学题,杨氏矩阵,百度钩子公式有惊喜。

如果不会的话,其实暴力打表+oeis也能做出来,一维一维的去查就好了。

大力推荐一个网站 oeis.org!!!!!!!!!

如果不知道的话,你就out了。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
const int mod = 1e9+7;
const int Maxn = 1e6+6;
int mp[maxn][maxn];
bool check(int n,int m){
int flag = 1;
for(int i=0;i<n;i++){
for(int j=1;j<m;j++){
if(mp[i][j]<mp[i][j-1])flag=0;
}
}
for(int i=1;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]<mp[i-1][j])flag=0;
}
}
return flag;
}
int gcd(int a, int b, int& x, int& y) {
if (!a) {
x = 0, y = 1;
return b;
}
int xx, yy, g = gcd(b % a, a, xx, yy);
x = yy - b / a * xx;
y = xx;
return g;
} inline int normal(int n) {
n %= mod;
(n < 0) && (n += mod);
return n;
} inline int inv(int a) {
int x, y;
assert(gcd(a, mod, x, y) == 1);
return normal(x);
} inline int add(int a, int b) { return a + b >= mod ? a + b - mod : a + b; }
inline int sub(int a, int b) { return a - b < 0 ? a - b + mod : a - b; }
inline int mul(int a, int b) { return int(a * 1ll * b % mod); }
inline int _div(int a, int b) { return mul(a, inv(b)); } long long p[Maxn];
long long solve2(long long x){
//(2n)!/(n!(n+1)!)
return _div(p[2*x],mul(p[x],p[x+1]));
}
long long solve3(long long x){
//2*(3*n)!/(n!*(n+1)!*(n+2)!);
return _div(mul(2,p[3*x]),mul(p[x],mul(p[x+1],p[x+2])));
} int main(){
p[0]=1;
for(int i=1;i<Maxn;i++){
p[i]=p[i-1]*i%mod;
}
int n,m;
while(cin>>n>>m){
if(n==1){
cout<<"1"<<endl;
}
else if(n==2){
cout<<solve2(m)<<endl;
}else{
cout<<solve3(m)<<endl;
}
}
/*
vector<int> V;
for(int i=0;i<n*m;i++)
V.push_back(i);
int ans = 0;
do{
int tot = 0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
mp[i][j]=V[tot++];
}
}
if(check(n,m))ans++;
}while(next_permutation(V.begin(),V.end()));
cout<<solve3(m)<<endl;
cout<<ans<<endl;
*/
}

喵哈哈村的魔法考试 Round #7 (Div.2) 题解的更多相关文章

  1. 喵哈哈村的魔法考试 Round #2 (Div.2) 题解

    喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...

  2. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解

    喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...

  3. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

  4. 喵哈哈村的魔法考试 Round #19 (Div.2) 题解

    题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...

  5. 喵哈哈村的魔法考试 Round #14 (Div.2) 题解

    喵哈哈村的四月半活动(一) 题解: 唯一的case,就是两边长度一样的时候,第三边只有一种情况. #include <iostream> #include <cstdio> # ...

  6. 喵哈哈村的魔法考试 Round #4 (Div.2) 题解

    有任何疑问,可以加我QQ:475517977进行讨论. A 喵哈哈村的嘟嘟熊魔法(1) 题解 这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了. 有个函数叫做swap(a ...

  7. 喵哈哈村的魔法考试 Round #20 (Div.2) 题解

    题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...

  8. 喵哈哈村的魔法考试 Round #18 (Div.2) 题解

    喵哈哈村的古怪石碑(一) 题解:暴力check一下是等比数列还是等差数列,然后输出答案即可.注意如果数据范围是1e9的话,就要快速幂了. 代码: #include <cstdio> #in ...

  9. 喵哈哈村的魔法考试 Round #13 (Div.2) 题解

    喵哈哈村的木星传说(一) 旋转90°,找找规律就知道(x,y)->(n-1-y,x) 然后输出就好了. #include<bits/stdc++.h> using namespace ...

随机推荐

  1. bzoj千题计划218:bzoj2333: [SCOI2011]棘手的操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=2333 上次那个是线段树,再发一个左偏树 维护两种左偏树 第一种是对每个联通块维护一个左偏树 第二种是 ...

  2. ASP.NET MVC学习(二)之控制器Controller

    1.控制器 Controller接收用户请求,将Model和View匹配在一起,共同完成用户请求.它是一个分发器,通过选择不同的Model.View,可以决定完成不同的用户请求. 但Controlle ...

  3. Web性能优化系列(1):Web性能优化分析

    本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...

  4. 非常有助于理解二极管PN结原理的资料

    https://www.zhihu.com/question/60053574/answer/174137061 我理解的半导体 pn 结的原理,哪里错了? https://blog.csdn.net ...

  5. MySQL 5.6 Replication 复制 FAQ

    原文请参照MySQL官方文档Reference Manual,版本5.6.10. 复制功能使得数据可以从一个MySQL数据库(master主库)复制到另一个或多个MySQL数据库(slave从库).缺 ...

  6. 五大常见的MySQL高可用方案【转】

    1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...

  7. System.Web.Routing入门及进阶 下篇

    上面介绍的是最简单的一种定义方式.当然我们可以建立更复杂的规则.其中就包括设定规则的默认值以及设定规则的正则表达式. UrlRouting高级应用 预计效果: 当我访问/a/b.aspx时就会转到De ...

  8. Springboot分模块开发详解(2):建立子工程

    1.创建base-entity 选中base工程,右键创建一个新的maven工程 自动选择了base这个目录存放子工程 创建后,pom.xml修改成如下内容: <?xml version=&qu ...

  9. 深度学习框架之TensorFlow的概念及安装(ubuntu下基于pip的安装,IDE为Pycharm)

    2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源. 1.TensorFlow的概念 TensorFlow 是使用数据流图进行数值计算的开源软件库.也就是说,Tensor ...

  10. 使用eclipse为Servlet在Tomcat中的部署方法

    一:下载安装jdk,tomcat,eclipse: 使用eclipse建立动态web项目lcj,更改编译文件目录,方法如下: 右键点击→工程名称→属性(Properties)或(Building Pa ...