喵哈哈村的魔法考试 Round #18 (Div.2) 题解
喵哈哈村的古怪石碑(一)
题解:暴力check一下是等比数列还是等差数列,然后输出答案即可。注意如果数据范围是1e9的话,就要快速幂了。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
//#define LOCAL
const int N=100+10;
const int MOD=100007;
using namespace std;
long long a1,a2,a3,n,an;
void init(){
}
void dc(){
long long d=a2-a1;
an=a1+d*(n-1);
printf("%lld\n",an%MOD);
}
long long pow(long long a,long long b){
if (b==0) return 1;
if (b==1) return a%MOD;
long long tmp=pow(a,b/2);
if (b%2==0) return (tmp*tmp)%MOD;
else return ((tmp*tmp)%MOD*a)%MOD;
}
void db(){
long long q=a2/a1;
an=a1*pow(q,n-1);
printf("%lld\n",an%MOD);
}
int main(){
while(scanf("%lld%lld%lld%lld",&a1,&a2,&a3,&n)!=EOF){
if (a1!=1 || (a1==1 && a2-a1==a3-a2)) dc();
else db();
}
return 0;
}
喵哈哈村的古怪石碑(二)
题解:题目翻译过来,其实就是动态求全局第k大。小数据就直接暴力找第k大就好了。大数据你可以分块,也可以写个平衡树。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<ctime>
#include<queue>
#include<vector>
using namespace std;
#define clr(f,x) memset(f,x,sizeof f)
#define rep(it,a,b) for(int it=a;it<=b;++it)
#define _rep(it,a,b) for(int it=a;it>=b;--it)
#define vrep(it,a) for(int it=a;it--;)
#define PII pair<int,int>
#define mp make_pair
#define pb push_back
#define X first
#define Y second
#define LL long long
const int maxn=20010;
int n;
int f[maxn],l[maxn],r[maxn],sz[maxn],v[maxn];
int root,tt;
inline void update(int x){
sz[x]=(l[x]>0)*sz[l[x]]+(r[x]>0)*sz[r[x]]+1;
}
inline void lt(int x){
int y=f[x],z=f[y];
f[x]=z;
if(z)l[z]==y?l[z]=x:r[z]=x;
f[r[y]=l[x]]=y;
f[l[x]=y]=x;
update(y);
}
inline void rt(int x){
int y=f[x],z=f[y];
f[x]=z;
if(z)l[z]==y?l[z]=x:r[z]=x;
f[l[y]=r[x]]=y;
f[r[x]=y]=x;
update(y);
}
inline void splay(int x){
while(f[x]){
int y=f[x],z=f[y];
if(!z){l[y]==x?rt(x):lt(x);break;}
if(l[z]==y)
if(l[y]==x)rt(y),rt(x);
else lt(x),rt(x);
if(r[z]==y)
if(r[y]==x)lt(y),lt(x);
else rt(x),lt(x);
}
update(x);
root=x;
}
inline int rk(int x){
int y=root;
while(1){
if(sz[l[y]]+1==x)return y;
if(sz[l[y]]<x){
x-=sz[l[y]]+1;
y=r[y];
}else y=l[y];
}
}
inline void del(int x){
splay(x);
if(r[x]==0){
f[root=l[x]]=0;
return;
}
int y=r[x];
f[y]=0;
while(l[y])y=l[y];
f[l[y]=l[x]]=y;
splay(l[x]);
}
inline void ins(int &x,int y){
if(!x){
v[x=++tt]=y;
return;
}
if(y>=v[x])ins(r[x],y),f[r[x]]=x;
else ins(l[x],y),f[l[x]]=x;
}
inline void work(){
scanf("%d",&n);
int x,y,z;
tt=0;
LL total=0;
int ans=0;
rep(i,1,n){
scanf("%d%d",&x,&y);
if(!x){
total+=y;
ins(root,y);
splay(tt);
}else{
z=rk(sz[root]-y+1);
ans^=v[z];
if((LL)v[z]*sz[root]<=total){
total+=v[z];
ins(root,v[z]);
splay(tt);
}else{
total-=v[z];
del(z);
}
}
}
printf("%d\n",ans);
}
int main(){
work();
return 0;
}
喵哈哈村的古怪石碑(三)
题解:实际上翻译过来就是求最大生成树,这个和求最小生成树是一样的,我们还是用克鲁斯卡尔来做就好了。
代码:
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
const double eps = 1e-10;
const int INF = ~0U>>1;
using namespace std;
int n, nes, sg;
int ap[5010], bp[5010];
int f[5010];
double ans;
struct quk
{
double dis;
int a, b;
} e[12502510];
struct point
{
double x, y;
} p[5010];
double dist(point a, point b)
{
return (a.x * b.x + a.y * b.y + abs(a.x - b.x) + abs(a.y - b.y) + sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y))) / 3;
}
int father(int u)
{
return f[u] == u ? u : f[u] = father(f[u]);
}
bool marge(int p)
{
int u = father(e[p].a), v = father(e[p].b);
if (u == v) return false;
ap[++nes] = e[p].a; bp[nes] = e[p].b; ans += e[p].dis;
f[u] = v;
return true;
}
bool cmp(const quk &a, const quk &b)
{
return a.dis > b.dis;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%lf %lf", &p[i].x, &p[i].y), f[i] = i;
for (int i = 1; i <= n; ++i)
for (int j = i + 1; j <= n; ++j)
e[++sg].dis = dist(p[i], p[j]), e[sg].a = i, e[sg].b = j;
sort(e + 1, e + sg + 1, cmp);
int nop = 0;
for (int i = 1; i < n; ++i)
while (!marge(++nop));
printf("%.4f\n", ans);
}
喵哈哈村的奇怪石碑(四)
题解:实际上是模拟题,我们对于每一个基因,我们都能够分析出概率是多少,然后所有的乘起来,再化简就好了。
但是这道题要高精度,注意~
代码:
#include <iostream>
using namespace std;
const int max_num = 100000000l;
typedef struct { bool flag; int cnt2, cnt3; } Cell;
typedef struct { Cell unisex[2] , gene[6][3]; } Table;
typedef struct { int len, num[80];} Gjd;
class Node
{
Table genotype[4];
void makenum();
void makelist();
public:
int ans2, ans3;
Gjd num2[2081], num3[2081];
void init() { makenum(); makelist(); }
void reclear() { ans2 = ans3 = 0; }
bool calc(int x, int y, int z)
{
if(z >= 4)
{
z -= 4;
if(!genotype[x].unisex[z].flag) return false;
ans2 += genotype[x].unisex[z].cnt2;
ans3 += genotype[x].unisex[z].cnt3;
}
else
{
if(!genotype[x].gene[y][z].flag) return false;
ans2 += genotype[x].gene[y][z].cnt2;
ans3 += genotype[x].gene[y][z].cnt3;
}
return true;
}
} You;
ostream& operator << (ostream &out, const Gjd &x)
{
int i = x.len - 1;
out << x.num[i];
while(i--) out.width(8), out << x.num[i];
return out;
}
int main()
{
int T, n;
string ma, fa, me;
ios::sync_with_stdio(false);
cin >> T;
if(T <= 0 || T > 20) return 1;
cout.fill('0');
You.init();
while(T--)
{
cin >> n >> ma >> fa >> me;
if(n <= 0 || n > 520 || (int)ma.length() != n || (int)fa.length() != n || (int)me.length() != n) return 1;
You.reclear();
while(n--)
{
if(me[n] == '3' || (me[n] >= '4' && !((ma[n] < '4') ^ (fa[n] < '4')))) return 1;
if(ma[n] <= fa[n])
{ if(!You.calc((int)ma[n] - '0', (int)fa[n] - '0', (int)me[n] - '0')) break; }
else if(!You.calc((int)fa[n] - '0', (int)ma[n] - '0', (int)me[n] - '0')) break;
}
if(n >= 0) cout << "0/0" << endl;
else cout << You.num3[You.ans3] << "/" << You.num2[You.ans2] << endl;
}
return 0;
}
void Node::makenum()
{
int i, j;
num2[0].len = num2[0].num[0] = num3[0].len = num3[0].num[0] = 1;
for(i = 1; i <= 2080; ++i)
{
num2[i].len = num2[i - 1].len;
for(j = 0; j < num2[i].len; ++j)
{
num2[i].num[j] += num2[i - 1].num[j] << 1;
if(num2[i].num[j] >= max_num)
{
num2[i].num[j + 1] += num2[i].num[j] / max_num;
num2[i].num[j] %= max_num;
}
}
if(num2[i].num[num2[i].len]) ++num2[i].len;
num3[i].len = num3[i - 1].len;
for(j = 0; j < num3[i].len; ++j)
{
num3[i].num[j] += num3[i - 1].num[j] * 3;
if(num3[i].num[j] >= max_num)
{
num3[i].num[j + 1] += num3[i].num[j] / max_num;
num3[i].num[j] %= max_num;
}
}
if(num3[i].num[num3[i].len]) ++num3[i].len;
}
}
void Node::makelist()
{
//unisex
genotype[0].unisex[0].flag = true;
genotype[1].unisex[0].flag = genotype[1].unisex[1].flag = true;
genotype[1].unisex[0].cnt2 = genotype[1].unisex[1].cnt2 = 1;
genotype[2].unisex[1].flag = true;
genotype[3].unisex[0].flag = genotype[3].unisex[1].flag = true;
genotype[3].unisex[0].cnt2 = genotype[3].unisex[1].cnt2 = 2;
genotype[3].unisex[0].cnt3 = 1;
//gene
genotype[0].gene[0][0].flag = true;
genotype[0].gene[1][0].flag = genotype[0].gene[1][1].flag = true;
genotype[0].gene[1][0].cnt2 = genotype[0].gene[1][1].cnt2 = 1;
genotype[0].gene[2][1].flag = true;
genotype[0].gene[3][0].flag = genotype[0].gene[3][1].flag = true;
genotype[0].gene[3][0].cnt2 = genotype[0].gene[3][1].cnt2 = 2;
genotype[0].gene[3][0].cnt3 = 1;
genotype[0].gene[4][0].flag = true;
genotype[0].gene[5][1].flag = true;
genotype[1].gene[1][0].flag = genotype[1].gene[1][1].flag = genotype[1].gene[1][2].flag = true;
genotype[1].gene[1][0].cnt2 = genotype[1].gene[1][2].cnt2 = 2;
genotype[1].gene[1][1].cnt2 = 1;
genotype[1].gene[2][1].flag = genotype[1].gene[2][2].flag = true;
genotype[1].gene[2][1].cnt2 = genotype[1].gene[2][2].cnt2 = 1;
genotype[1].gene[3][0].flag = genotype[1].gene[3][1].flag = genotype[1].gene[3][2].flag = true;
genotype[1].gene[3][0].cnt2 = genotype[1].gene[3][2].cnt2 = 3;
genotype[1].gene[3][1].cnt2 = 1;
genotype[1].gene[3][0].cnt3 = 1;
genotype[1].gene[4][0].flag = genotype[1].gene[4][1].flag = true;
genotype[1].gene[4][0].cnt2 = genotype[1].gene[4][1].cnt2 = 1;
genotype[1].gene[5][1].flag = genotype[1].gene[5][2].flag = true;
genotype[1].gene[5][1].cnt2 = genotype[1].gene[5][2].cnt2 = 1;
genotype[2].gene[2][2].flag = true;
genotype[2].gene[3][1].flag = genotype[2].gene[3][2].flag = true;
genotype[2].gene[3][1].cnt2 = genotype[2].gene[3][2].cnt2 = 2;
genotype[2].gene[3][1].cnt3 = 1;
genotype[2].gene[4][1].flag = true;
genotype[2].gene[5][2].flag = true;
genotype[3].gene[3][0].flag = genotype[3].gene[3][1].flag = genotype[3].gene[3][2].flag = true;
genotype[3].gene[3][0].cnt2 = genotype[3].gene[3][2].cnt2 = 4;
genotype[3].gene[3][1].cnt2 = 3;
genotype[3].gene[3][0].cnt3 = 2;
genotype[3].gene[3][1].cnt3 = 1;
genotype[3].gene[4][0].flag = genotype[3].gene[4][1].flag = true;
genotype[3].gene[4][0].cnt2 = genotype[3].gene[4][1].cnt2 = 2;
genotype[3].gene[4][0].cnt3 = 1;
genotype[3].gene[5][1].flag = genotype[3].gene[5][2].flag = true;
genotype[3].gene[5][1].cnt2 = genotype[3].gene[5][2].cnt2 = 2;
genotype[3].gene[5][1].cnt3 = 1;
}
喵哈哈村的魔法考试 Round #18 (Div.2) 题解的更多相关文章
- 喵哈哈村的魔法考试 Round #2 (Div.2) 题解
喵哈哈村的魔法考试 Round #2 (Div.2) 题解 A.喵哈哈村的战争 题解: 这道题就是for一遍,统计每个村子的战斗力的和,然后统计哪个村子的战斗力和大一点就好了. 唯一的坑点,就是这道题 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解
喵哈哈村的魔法考试 Round #1 (Div.2) 题解 特别感谢出题人,qscqesze. 也特别感谢测题人Xiper和CS_LYJ1997. 没有他们的付出,就不会有这场比赛. A 喵哈哈村的魔 ...
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...
- 喵哈哈村的魔法考试 Round #1 (Div.2) 题解&源码(A.水+暴力,B.dp+栈)
A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05 最后更新: 2017年2月21日 20:06 时间限制: 1000ms 内存限制: 128M 描述 传说喵哈哈村有三种神 ...
- 喵哈哈村的魔法考试 Round #19 (Div.2) 题解
题解: 喵哈哈村的魔力源泉(1) 题解:签到题. 代码: #include<bits/stdc++.h> using namespace std; int main(){ long lon ...
- 喵哈哈村的魔法考试 Round #14 (Div.2) 题解
喵哈哈村的四月半活动(一) 题解: 唯一的case,就是两边长度一样的时候,第三边只有一种情况. #include <iostream> #include <cstdio> # ...
- 喵哈哈村的魔法考试 Round #4 (Div.2) 题解
有任何疑问,可以加我QQ:475517977进行讨论. A 喵哈哈村的嘟嘟熊魔法(1) 题解 这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了. 有个函数叫做swap(a ...
- 喵哈哈村的魔法考试 Round #20 (Div.2) 题解
题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...
- 喵哈哈村的魔法考试 Round #13 (Div.2) 题解
喵哈哈村的木星传说(一) 旋转90°,找找规律就知道(x,y)->(n-1-y,x) 然后输出就好了. #include<bits/stdc++.h> using namespace ...
随机推荐
- eclipse引入系统类库
引入系统类库1.第一步:项目,右键,build path,remove报错的类库 2.第二步:项目,右键,build path→Add Library→JRE System Library,Next3 ...
- c# 界面自适应大小
采用在窗体事件SizeChanged里面代码控制大小和位置,达到自动适应窗体大小,这样做调整起来方便. private void FrmMain_SizeChanged(object sender, ...
- Expm 3_2 寻找最邻近的点对
[问题描述] 设p1=(x1,y1), p2=(x2,y2), … , pn=(xn,yn) 是平面上n个点构成的集合S,设计和实现找出集合S中距离最近点对的算法. 每一个格子最多只能存在一个点, ...
- 基于Golang设计一套微服务架构[转]
article- @嘟嘟噜- May/26/2018 18:35:30 如何基于Golang设计一套微服务架构 微服务(Microservices),这个近几年我们经常听到.那么现在市面上的的微服 ...
- css 中两个class之间没有空格与有空格有什么区别
第一个匹配: <div class="ul item"></div>:无法匹配:<div class="ul"></d ...
- 深度学习Bible学习笔记:第一章 前言
写在前面:请务必踏踏实实看书,结合笔记或视频来理解学习,任何技术,啃砖头是最扎实最系统的,为避免知识碎片化,切忌抛却书本的学习!!! 一 什么是深度学习 1 关于AI: AI系统必须具备从原始数据提取 ...
- java :: Java中的双冒号操作符
java中的双冒号操作符 定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion. 通常的情况下: 把 x -& ...
- Ubuntu 下安装LEMP环境 实战
---恢复内容开始--- 1.nginx的服务端的安装 打开命令行终端,在终端输入,sudo apt-get install nginx 回车即开始安装 kxlc-t@ubuntu:~$ sudo ...
- Mac上安装stf
一,安装 STF的依赖比较多,如下: Node.js >= 0.12ADB properly set upRethinkDB >= 2.2GraphicsMagick (for resiz ...
- 《剑指offer》-左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...