本来打算划划水洗洗睡了,突然听到这次的主人公是冈部伦太郎

石头门(《steins;gate》)主题的比赛,岂有不打之理!

石头门真的很棒啊!人设也好剧情也赞曲子也特别好听。

推荐http://music.163.com/#/m/song?id=26259014&userid=115264555

(强行跑题)

Okabe and Future Gadget Laboratory

O(n^4)暴力妥妥的

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
vector<int>r[],c[];
int mp[][];
int check(int a,int x,int y){
for(int i=;i<r[x].size();i++){
for(int j=;j<c[y].size();j++){
if(r[x][i]+c[y][j]==a)return ;
}
}
return ;
}
int main(){
int i,j;
int n=read();
for(i=;i<=n;i++){
for(j=;j<=n;j++){
mp[i][j]=read();
r[i].push_back(mp[i][j]);
c[j].push_back(mp[i][j]);
}
}
for(i=;i<=n;i++){
for(j=;j<=n;j++){
if(mp[i][j]==)continue;
if(!check(mp[i][j],i,j)){
printf("NO\n");
return ;
}
}
}
printf("YES\n");
return ;
}

A

Okabe and Banana Trees

枚举 扫描

发现枚举横坐标最多需要枚举1e7次

推一下收益的式子就可以了。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
LL calc(LL x,LL y){
LL res=(+y)*y/*(x+);
res+=(+x)*x/*y;
res+=(+x)*x/;
return res;
}
LL ans=;
int main(){
int i,j;
int m,b;
m=read();b=read();
for(int i=;i>=;i++){
int y=b-ceil((double)i/m);
if(y<)break;
ans=max(ans,calc(i,y));
}
printf("%I64d\n",ans);
return ;
}

B

Okabe and Boxes

贪心 构造

显然当不能满足要求的出栈序的时候就要把栈内元素排序。

真的都排序的话复杂度受不了,只存还没有排过序的就可以了

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
priority_queue<int>q;
int last,ord;
int n,x;
char s[];
int st[mxn],top=;
int main(){
int i,j;
n=read();
int ed=n<<;
ord=;
int ans=;
for(i=;i<=ed;i++){
// printf("i:%d\n",i);
scanf("%s",s);
if(s[]=='a'){
scanf("%d",&x);
q.push(-x);
st[++top]=x;
last=x;
}
else{//remove
if(last==ord){
q.pop();
ord++;
if(top)top--;
if(top){
last=st[top];
}
else last=-q.top();
}
else{
ans++;
ord++;
q.pop();
last=-q.top();
top=;
}
}
// printf("top:%d last:%d\n",q.top(),last);
}
printf("%d\n",ans);
return ;
}

C

Okabe and City

图论 最短路 脑洞题

正解是把每行每列看做一个点,在这些点和原有的点之间花式连边跑最短路。

然而博主用非显式建边的方法暴力跑了一发过去了。

只要有1w个点全在一行的数据就能把我的方法卡掉。。

  ↑然而没有这种数据233

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
struct edge{
int v,nxt;
}e[mxn<<];
int hd[mxn],mct=;
void add_edge(int u,int v){
e[++mct].v=v;e[mct].nxt=hd[u];hd[u]=mct;return;
}
void insert(int u,int v){
add_edge(u,v);add_edge(v,u);
}
int n,m,K;
struct point{
int x,y;
}a[mxn];
vector<int>r[mxn],c[mxn];
int f[mxn];
queue<int>q;
bool inq[mxn];
void SPFA(int st){
memset(f,0x3f,sizeof f);
q.push(st);f[st]=;
while(!q.empty()){
int u=q.front();q.pop();inq[u]=;
// if(f[u]>f[K])continue; // nope!
int x=a[u].x;
for(int i=;i<r[x].size();i++){
int v=r[x][i],cost=(abs(a[u].y-a[v].y)==)?:;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
//
for(int i=;i<r[x+].size();i++){
int v=r[x+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<r[x+].size();i++){
int v=r[x+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<r[x-].size();i++){
int v=r[x-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
if(x>){
for(int i=;i<r[x-].size();i++){
int v=r[x-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
//
int y=a[u].y;
for(int i=;i<c[y].size();i++){
int v=c[y][i],cost=(abs(a[u].x-a[v].x)==)?:;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<c[y-].size();i++){
int v=c[y-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
if(y>){
for(int i=;i<c[y-].size();i++){
int v=c[y-][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
}
for(int i=;i<c[y+].size();i++){
int v=c[y+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
for(int i=;i<c[y+].size();i++){
int v=c[y+][i],cost=;
if(f[v]>f[u]+cost){
f[v]=f[u]+cost;
if(!inq[v]){
inq[v]=;
q.push(v);
}
}
}
/*
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
// printf("u:%d v:%d\n",u,v);
if(f[v]>f[u]+1){
f[v]=f[u]+1;
if(!inq[v]){
inq[v]=1;
q.push(v);
}
}
}
*/
}
return;
}
map<int,int>mp[mxn];
int main(){
int i,j;
n=read();m=read();K=read();
for(i=;i<=K;i++){
a[i].x=read();a[i].y=read();
r[a[i].x].push_back(i);
c[a[i].y].push_back(i);
mp[a[i].x][a[i].y]=i;
}
//
/*
for(i=1;i<=K;i++){
if(mp[a[i].x+1][a[i].y+1]){
insert(i,mp[a[i].x+1][a[i].y+1]);
}
if(mp[a[i].x-1][a[i].y+1]){
insert(i,mp[a[i].x-1][a[i].y+1]);
}
}
*/
for(i=;i<=K;i++){
if(a[i].x== && a[i].y==){
SPFA(i);break;
}
}
int ans=0x3f3f3f3f;
for(i=;i<=K;i++){
// printf("i:%d f:%d\n",i,f[i]);
if(a[i].x==n && a[i].y==m)ans=min(ans,f[i]);
if(a[i].x>=n- || a[i].y>=m-)ans=min(ans,f[i]+);
}
if(ans==0x3f3f3f3f)ans=-;
printf("%d\n",ans);
return ;
}

D

代码看着长,其实只要写一小段,其他都是复制的

Okabe and El Psy Kongroo

数学问题 递推 矩阵乘法

应该跟D换一下的,明显这个更简单

看到矩阵乘法就能明白了吧233

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
using namespace std;
const int mod=1e9+;
LL read(){
LL x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int sz=;
struct Mat{
int x[][];
void clear(){
memset(x,,sizeof x);return;
}
void init(int n){
for(int i=;i<=n;i++)x[i][i]=;return;
}
Mat operator * (const Mat b){
Mat res;
for(int i=;i<=sz;i++){
for(int j=;j<=sz;j++){
res.x[i][j]=;
for(int k=;k<=sz;k++){
res.x[i][j]=((LL)res.x[i][j]+(LL)x[i][k]*b.x[k][j]%mod)%mod;
}
}
}
return res;
}
void debug(){
for(int i=;i<=sz;i++){
for(int j=;j<=sz;j++){
printf("%d ",x[i][j]);
}
puts("");
}
puts("");
return;
}
};
Mat ans,bas,aa;
Mat ksm(Mat a,LL k){
Mat res;res.clear();res.init(sz);
while(k){
if(k&)res=res*a;
a=a*a;
k>>=;
}
return res;
}
int n;LL K;
void Build(int lim){
bas.clear();
for(int i=;i<=lim;i++){
bas.x[i][i]=;
if(i)bas.x[i][i-]=;
if(i<lim)bas.x[i][i+]=;
}
return;
}
int main(){
int i,j;
n=read();K=read();
ans.init();sz=;
LL a,b;int c;
int last=;
for(i=;i<=n;i++){
a=read();b=read();c=read();
if(a>=K)break;
Build(c);
b=min(b,K);
aa=ksm(bas,b-a);
ans=ans*aa;
}
printf("%d\n",ans.x[][]);
return ;
}

E

Codeforces Round #420 (Div. 2) A-E的更多相关文章

  1. 【Codeforces Round #420 (Div. 2) C】Okabe and Boxes

    [题目链接]:http://codeforces.com/contest/821/problem/C [题意] 给你2*n个操作; 包括把1..n中的某一个数压入栈顶,以及把栈顶元素弹出; 保证压入和 ...

  2. 【Codeforces Round #420 (Div. 2) B】Okabe and Banana Trees

    [题目链接]:http://codeforces.com/contest/821/problem/B [题意] 当(x,y)这个坐标中,x和y都为整数的时候; 这个坐标上会有x+y根香蕉; 然后给你一 ...

  3. 【Codeforces Round #420 (Div. 2) A】Okabe and Future Gadget Laboratory

    [题目链接]:http://codeforces.com/contest/821/problem/A [题意] 给你一个n*n的数组; 然后问你,是不是每个位置(x,y); 都能找到一个同一行的元素q ...

  4. Codeforces Round #420 (Div. 2) - C

    题目链接:http://codeforces.com/contest/821/problem/C 题意:起初有一个栈,给定2*n个命令,其中n个命令是往栈加入元素,另外n个命令是从栈中取出元素.你可以 ...

  5. Codeforces Round #420 (Div. 2) - E

    题目链接:http://codeforces.com/contest/821/problem/E 题意:起初在(0,0),现在要求走到(k,0),问你存在多少种走法. 其中有n条线段,每条线段为(a, ...

  6. Codeforces Round #420 (Div. 2) - B

    题目链接:http://codeforces.com/contest/821/problem/B 题意:二维每个整点坐标(x,y)拥有的香蕉数量为x+y,现在给你一个直线方程的m和b参数,让你找一个位 ...

  7. Codeforces Round #420 (Div. 2) - A

    题目链接:http://codeforces.com/contest/821/problem/A 题意:给定一个n*n的矩阵. 问你这个矩阵是否满足矩阵里的元素除了1以外,其他元素都可以在该元素的行和 ...

  8. Codeforces Round #420 (Div. 2)

    /*************************************************************************************************** ...

  9. Codeforces Round #420 (Div. 2) A,B,C

    A. Okabe and Future Gadget Laboratory time limit per test 2 seconds memory limit per test 256 megaby ...

  10. Codeforces Round #420 (Div. 2) E. Okabe and El Psy Kongroo 矩阵快速幂优化dp

    E. Okabe and El Psy Kongroo time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. 转 从红帽、GitHub和Docker看开源商业模式的进阶

    从红帽.GitHub和Docker看开源商业模式的进阶 发表于2014-12-16 10:26| 7594次阅读| 来源http://stratechery.com/| 0 条评论| 作者Ben Th ...

  2. MySQL 查询缓存机制(MySQL数据库调优)

    查询缓存机制:缓存的是查询语句的整个查询结果,是一个完整的select语句的缓存结果 哪些查询可能不会被缓存 :查询中包含UDF.存储函数.用户自定义变量.临时表.mysql库中系统表.或者包含列级别 ...

  3. 201621123037 《Java程序设计》第1周学习总结

    #作业01-Java基本概念 1. 本周学习总结 本周学习内容JDK JVM JRE 跨平台 .java .class 关键概念之间的联系: 总的来讲JDK是给开发人员们提供专门用来开发的环境,并且包 ...

  4. PAT 甲级 1020 Tree Traversals

    https://pintia.cn/problem-sets/994805342720868352/problems/994805485033603072 Suppose that all the k ...

  5. crontab笔记

    *  *  * * *     root    rm -f /var/spool/cron/lastrun/cron.hourly    > out.file   第一部分:执行的周期与时间   ...

  6. c语言----程序记录

    1.结构体写入文件,读取 #include <stdio.h> #include <string.h> #include <stdlib.h> #define ma ...

  7. 第98天:CSS3中transform变换详解

    transform变换详解 本文主要介绍变形transform. Transform字面上就是变形,改变的意思.在CSS3中transform主要包括以下几种:旋转rotate.扭曲skew.缩放sc ...

  8. EM算法【转】

    混合高斯模型和EM算法 这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与K-means一样,给定的训练样本是, ...

  9. Python常忘的进阶知识(下)

    0.目录 1.装饰器 1.1 为每个函数都增加一个功能 1.2 装饰器只是一种模式 1.3 语法糖 1.4 函数需要传递参数,该如何更改装饰器? 1.5 函数需要传递关键字参数,该如何更改装饰器? 2 ...

  10. 【比赛】HNOI2018 道路

    这题很考思维啊,考验我们能否快速从省选难度跳转到普及难度 考试的时候真的想得太多,觉得省选不可能这么简单吧,然后就打脸 设 \(f[i][j][x]\) 表示从根到 \(x\) 号点,有 \(i\) ...