喵哈哈村的魔法考试 Round #4 (Div.2) 题解
有任何疑问,可以加我QQ:475517977进行讨论。
A 喵哈哈村的嘟嘟熊魔法(1)
题解
这道题我们只要倒着来做就可以了,因为交换杯子是可逆的,我们倒着去模拟一遍就好了。
有个函数叫做swap(a,b),表示交换a,b
#include<bits/stdc++.h>
using namespace std;
int a[10];
int x[105],y[105];
int main(){
int n;
while(scanf("%d",&n)!=EOF){
scanf("%d%d%d",&a[1],&a[2],&a[3]);
for(int i=0;i<n;i++){
scanf("%d%d",&x[i],&y[i]);
}
for(int i=n-1;i>=0;i--)
swap(a[x[i]],a[y[i]]);
for(int i=1;i<=3;i++)
cout<<a[i]<<" ";
cout<<endl;
}
}
B 喵哈哈村的嘟嘟熊魔法(2)
题解
拿一个数组记录一下num[a[i]],表示a[i]出现了多少次,由于里面的数都是正数,所以开一个大数据就行了。
其实可以用map<int,int>
面试题的话,你需要构造一个函数f(x)^3=1,这样就可以了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+6;
map<int,int>H;
int n,a[maxn];
int main(){
while(cin>>n){
for(int i=0;i<n;i++)
cin>>a[i];
H.clear();
for(int i=0;i<n;i++)
H[a[i]]++;
for(int i=0;i<n;i++)
if(H[a[i]]==1)
cout<<a[i]<<endl;
}
}
C 喵哈哈村的嘟嘟熊魔法(3)
题解
注意数据范围,数据范围只有100,所以每次修改就暴力修改,每次询问,我们就O(100)的去查询就好了。
其实你写个动态k-th number 树套树也可以
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
int n,m;
int value[105];
int a[maxn];
int main(){
while(cin>>n>>m){
memset(value,0,sizeof(value));
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
value[a[i]]++;
}
for(int i=0;i<m;i++){
int op;
scanf("%d",&op);
if(op==1){
int x,y;
scanf("%d%d",&x,&y);
value[a[x]]--;
a[x]=y;
value[a[x]]++;
}
else{
int num = 2;
for(int j=100;j>=1;j--){
if(value[j]>=num){
cout<<j<<endl;
break;
}else{
num-=value[j];
}
}
}
}
}
}
D 喵哈哈村的嘟嘟熊魔法(4)
题解
如果全是正数的话,那么我们two pointers就好了。
但是有正有负怎么办呢,我们枚举中间的mid,然后判断左右是否存在l和r分界线就好了。
左分界线需要满足prefix[l-1]=prefix[mid-1]-prefix[l],移项可以得到prefix[l]+prefix[l-1]=prefix[mid-1]
用一个set判断有没有就可以了。
但是这样做并不能知道左边的和是多少,所以你的set里面应该还带一个现在的和是多少,然后左右再check一下就好了。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+7;
set<pair<long long,long long> >S;
long long a[maxn],b[maxn];
set<long long> ans[maxn];
int n,flag[maxn];
int main(){
while(cin>>n){
for(int i=0;i<n;i++){
cin>>a[i];
}
b[0]=a[0];
for(int i=1;i<n;i++)
b[i]=a[i]+b[i-1];
for(int i=0;i<n;i++)
{
flag[i]=0;
ans[i].clear();
}
S.clear();
for(int i=3;i<n;i++){
S.insert(make_pair(b[i-3]+b[i-2],b[i-2]));
set<pair<long long,long long> >::iterator s = S.lower_bound(make_pair(b[i-1],-1000000LL));
while(s!=S.end()&&(*s).first==b[i-1]){
flag[i]=1;
ans[i].insert(b[i-1]-(*s).second);
s++;
}
}
S.clear();
b[n-1]=a[n-1];
for(int i=n-2;i>=0;i--){
b[i]=a[i]+b[i+1];
}
int Flag = 0;
for(int i=n-4;i>=0;i--){
S.insert(make_pair(b[i+3]+b[i+2],b[i+2]));
set<pair<long long,long long> >::iterator s = S.lower_bound(make_pair(b[i+1],-1000000LL));
while((s!=S.end()&&(*s).first==b[i+1])){
if(ans[i].find(b[i+1]-(*s).second)!=ans[i].end()&&flag[i]){
Flag = 1;
}
s++;
}
if(Flag)break;
}
if(Flag == 1){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
}
E 喵哈哈村的嘟嘟熊魔法(5)
一道简单的网络流,如果你会网络流,这道题就是傻逼题。
否则GG
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int oo=2000000000;
struct nod{
int from,con,pre,c,v,flow,rever;
}edge[100000];
int num[100000],dist[100000],indexs[100000],now[100000],pos[100000],use[100000],lists[1100000],from[100000];
int ans,p,s,t,nexts,n,m,i,j,all,ti[200][200];
void build(int a,int b,int c,int v)
{
p++;
edge[p].from=a;
edge[p].con=b;
edge[p].pre=pos[a];
edge[p].c=c;
edge[p].v=v;
edge[p].rever=p+1;
pos[a]=p;
p++;
edge[p].from=b;
edge[p].con=a;
edge[p].pre=pos[b];
edge[p].c=c;
edge[p].flow=c;
edge[p].v=-v;
edge[p].rever=p-1;
pos[b]=p;
}
void spfas()
{
int w,k,l,r,j;
for (j=i+n+m+2;j>=1;j--) dist[j]=oo;
dist[s]=0;
l=1; r=1; lists[1]=s; use[s]=1;
while (l<=r)
{
k=lists[l];
for (w=pos[k];w;w=edge[w].pre)
if (edge[w].c!=edge[w].flow && dist[edge[w].con]>dist[k]+edge[w].v)
{
dist[edge[w].con]=dist[k]+edge[w].v;
from[edge[w].con]=w;
if (use[edge[w].con]==0)
{
use[edge[w].con]=1;
lists[++r]=edge[w].con;
}
}
l++;
use[k]=0;
}
k=t;
while (k!=s)
{
if (edge[from[k]].from==s) nexts=indexs[k];
ans+=edge[from[k]].v;
edge[edge[from[k]].rever].flow--;
edge[from[k]].flow++;
k=edge[from[k]].from;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++) scanf("%d",&num[i]),all+=num[i];
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
scanf("%d",&ti[i][j]);
s=1; t=2;
for (i=1;i<=n;i++) build(m+2+i,t,num[i],0);
for (i=1;i<=m;i++)
{
now[i]=1;
build(s,i+2,1,0);
indexs[i+2]=i;
for (j=1;j<=n;j++) build(i+2,m+2+j,1,ti[j][i]);
}
for (i=1;i<=all;i++)
{
spfas();
now[nexts]++; indexs[n+m+2+i]=nexts;
build(s,n+m+2+i,1,0);
for (j=1;j<=n;j++) build(n+m+2+i,m+2+j,1,now[nexts]*ti[j][nexts]);
}
printf("%d\n",ans);
}
喵哈哈村的魔法考试 Round #4 (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 #20 (Div.2) 题解
题解: A 喵哈哈村的跳棋比赛 题解:其实我们要理解题意就好了,画画图看看这个题意.x<y,那么就交换:x>y,那么x=x%y. 如果我们经过很多次,或者y<=0了,那么就会无限循环 ...
- 喵哈哈村的魔法考试 Round #18 (Div.2) 题解
喵哈哈村的古怪石碑(一) 题解:暴力check一下是等比数列还是等差数列,然后输出答案即可.注意如果数据范围是1e9的话,就要快速幂了. 代码: #include <cstdio> #in ...
- 喵哈哈村的魔法考试 Round #13 (Div.2) 题解
喵哈哈村的木星传说(一) 旋转90°,找找规律就知道(x,y)->(n-1-y,x) 然后输出就好了. #include<bits/stdc++.h> using namespace ...
随机推荐
- SpringJMS解析-JmsTemplate
目录 通用代码抽取execute() 发送消息的实现 接收消息 尽管消息接收可以使用消息监听器的方式替代模版方法,但是在发送的时候是无法替代的,在Spring中必须要使用JmsTemplate提供的方 ...
- bzoj千题计划261:bzoj3294: [Cqoi2011]放棋子
http://www.lydsy.com/JudgeOnline/problem.php?id=3294 如果一个颜色的棋子放在了第i行第j列,那这种颜色就会占据第i行第j列,其他颜色不能往这儿放 设 ...
- 20155204 2016-2017-2 《Java程序设计》第8周学习总结
学号 2016-2017-2 <Java程序设计>第X周学习总结 教材学习内容总结 想要取得channel的操作对象,可以使用channels类,它定义了静态方法newChannel(). ...
- F - Friends ZOJ - 3710(暴力)
题目链接:https://cn.vjudge.net/contest/280949#problem/F 题目大意:给你n个人,然后给你m个关系,每个关系输入t1, t2 .代表t1和t2是朋友关系(双 ...
- Android Studio 新建drawable-hdpi、drawable-mdpi等
在不同的模式“Project” / “Android”的文件夹中查看文件夹.如果文件夹丢失,您可以轻松添加它们. 1.在“res”文件夹上右键“New”->”Android Resource D ...
- Servlet笔记8--乱码解决方案
乱码解决方案: 代码详解: package com.bjpowernode.javaweb.servlet; import java.io.IOException; import javax.serv ...
- 使用/dev/uinput的简要介绍(含demo程序)【转】
转自:https://blog.csdn.net/zhongkunjia/article/details/75142699 uinput机制有2个很大的优点: 1) 不用自己写驱动(比如弄个红外遥控器 ...
- linux du查询目录所占的磁盘空间
linux查询目录所占的磁盘空间 du -hxs /* --exclude=/proc |sort -rh 命令和选项的解释: du – 估计文件的空间使用情况 -hsx – (-h)更易读的格式,( ...
- 字符串前面加u、r、b的含义
u/U:表示unicode字符串 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. 一般英文字符在使用各种编码下, 基本都可以正常解析, 所以一般不带u:但是中文, ...
- Java中类与类的关系
在java中类和类的关系大致分三种:泛化.关联.依赖. 1. 泛化(Generalization) "XX是一个XX"关系(is a),通常使用的关键词为 extends.impl ...