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

石头门(《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. 如何防止app接口被别人调用

    app开发的时候,如何保护app的接口呢? 用https是我想到的办法,但是不知道怎么实现,所以就考虑用token,虽然不是绝对有效,但是能防止一般的用户来攻击,高手非要攻击,只能报警了吧. toke ...

  2. DPDK报文分类与访问控制

    原创翻译,转载请注明出处. dpdk提供了一个访问控制库,提供了基于一系列分类规则对接收到的报文进行分类的能力.ACL库用来在一系列规则上执行N元组查找,可以实现多个分类和对每个分类查找最佳匹配(最高 ...

  3. C++ Primer Plus学习:第三章

    C++入门第三章:处理数据 面向对象编程(OOP)的本质是设计并扩展自己的数据类型. 内置的C++数据类型分为基本类型和复合类型. 基本类型分为整数和浮点数. 复合类型分为数组.字符串.指针和结构. ...

  4. 安装DHCP 服务器 指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码

    DHCP服务详解 前言:动态主机配置协议,给局域网内的主机分配IP地址,子网掩码,网关,DNS ARP协议 arp: address resolveing protocol (地址解析协议) 实现:I ...

  5. 写在SVM之前——凸优化与对偶问题

    SVM之问题形式化 SVM之对偶问题 SVM之核函数 SVM之解决线性不可分 >>>写在SVM之前——凸优化与对偶问题 本篇是写在SVM之前的关于优化问题的一点知识,在SVM中会用到 ...

  6. eclipse中jsp页面Invalid location of tag 解决办法分析小结

    在jsp页面使用标签过程中有时候不注意规则的话,eclipse会提示一些错误,下面针对这些错误提出相应的解决办法: <form></form>标签 1. Invalid loc ...

  7. BurpSuite 激活破解

    1.下载软件关于Burp Suite, 它是进行Web应用安全测试的一个集成平台,无缝融合各种安全工具并提供全面的接口适配,支持完整的Web应用测试流程,从最初的映射和应用程序的攻击面分析到发现和利用 ...

  8. 第196天:js---调用函数的五种方式

    一.普通方式 /*普通模式*/ // 声明一个函数,并调用 function func() { console.log("Hello World"); } func(); 二.函数 ...

  9. Vue 取出记录数后,页面显示刚开始显示部分,点击更多显示全部

    实例的实现,是使用computed计算属性,还有对数组使用.slice函数,不改变原数据对象. <div id="app"> <ul> <li v-f ...

  10. 【Java】时间转json格式化

     @DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")     @JsonFormat(pattern="yyyy-MM-ddHH: ...