A:暴力枚举

模拟

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n;
int a[N][N];
int main()
{
scanf("%d", &n);
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j)
scanf("%d", &a[i][j]);
for(int i = ; i <= n; ++i)
for(int j = ; j <= n; ++j) if(a[i][j] != )
{
bool flag = false;
for(int x = ; x <= n; ++x) if(x != i)
for(int y = ; y <= n; ++y) if(y != j)
if(a[i][j] == a[x][j] + a[i][y])
{
flag = true;
break;
}
if(!flag)
{
puts("No");
return ;
}
}
puts("Yes");
return ;
}

B:其实我们发现,枚举纵坐标就能枚举出直线上所有的点,然后里面的价值可以O(1)算出,于是枚举纵坐标即可。

模拟

#include<bits/stdc++.h>
using namespace std;
int m, b;
int main()
{
long long ans = ;
scanf("%d%d", &m, &b);
for(long long y = ; y <= b; ++y)
{
long long x = m * b - m * y,
tot = (1ll + x) * x / 2ll * (y + 1ll) + (1ll + y) * y / 2ll * (x + 1ll);
ans = max(ans, tot);
}
printf("%lld\n", ans);
return ;
}

C:这道题挺奥妙的。

脑洞

我们可以维护一个pq,当当前的值和pq的最小值不等时说明要调整。那么我们得问题就在于如何记录当前的值。然后发现这样不好做,因为调整后所有值都变了,那么我们换着一种思路,我们记录到第一个不符合的值之前有多少个符合的。当每次出现不符合的值时,把这个值赋成1,然后累加。每次删除时,我们只要减一,如果减到零了,说明需要调整,那么之前不符合的也符合了,所以之前那些值是没有用的,这样就完成了。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
int n, ans, cnt;
priority_queue<int, vector<int>, greater<int> > q;
int main()
{
scanf("%d", &n);
bool flag = true;
for(int i = ; i <= * n; ++i)
{
char opt[]; scanf("%s", opt);
if(opt[] == 'a')
{
int pos; scanf("%d", &pos);
if(!q.empty() && pos > q.top())
cnt = ; //如果不行了 ,那么肯定需要排序,之前不算
else if(cnt)
++cnt; //如果之前不行,现在行,计算可以不用调整的次数
q.push(pos);
}
if(opt[] == 'r')
{
q.pop();
if(cnt)
{
--cnt; //累计在不行之前能减的次数
if(cnt == ) ++ans;
}
}
}
printf("%d\n", ans);
return ;
}

题解的方法是维护一个栈,每次remove时看是否和应该remove的值相等,相等就弹出,不等就ans+1,把所有元素弹出。这样为什么是对的呢?因为如果当前的数和栈顶相同,那么就是可以的,否则就需要调整。调整完了之后之前的数是有序的,也就不用再调整了,只有进来不可行的才需要调整。(我也理解的不是很透彻,还是上面那个方法直观)

#include<bits/stdc++.h>
using namespace std;
int n, ans, now = ;
stack<int> st;
int main()
{
scanf("%d", &n);
for(int i = ; i <= * n; ++i)
{
char opt[]; scanf("%s", opt);
if(opt[] == 'a')
{
int pos; scanf("%d", &pos);
st.push(pos);
}
if(opt[] == 'r')
{
if(!st.empty())
{
if(now == st.top()) st.pop();
else
{
ans++;
while(!st.empty()) st.pop();
}
}
++now;
}
}
printf("%d\n", ans);
return ;
}

D:这道题写的时候出题人说样例挂了,还有这种操作。。。

最短路

我们发现,只有横纵坐标有一个相差<=2时可以走过去,那么我们就可以考虑建图。这里要分类讨论一下边权的情况,还有终点是否亮。代码里都有了,然后跑最短路就行,可以用deque也可以用dijiestra,dijiestra跑得还挺快。记住不能把边存下来,有n^2条边。

#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = ;
struct data {
int x, y;
} a[N];
int n, m, k;
priority_queue<PII, vector<PII>, greater<PII> >q;
int d[N], used[N], Q[N];
bool flag = true;
bool cp(data x, data y)
{
return x.x == y.x ? x.y < y.y : x.x < y.x;
}
void dijiestra()
{
memset(used, , sizeof(used));
for(int i = ; i <= k; ++i) d[i] = << ;
q.push(PII(, ));
while(!q.empty())
{
PII x = q.top(); q.pop();
int u = x.second;
if(used[u]) continue;
used[u] = ;
for(int i = ; i <= k; ++i) if(i != u)
if(abs(a[i].x - a[u].x) <= || abs(a[i].y - a[u].y) <= )
{
int w = ;
if((abs(a[i].x - a[u].x) == || abs(a[i].y - a[u].y) == ) && (a[i].x - a[u].x == || a[i].y - a[u].y == ))
w = ;
if(a[i].x == n && a[i].y == m && !flag)
{
w = ;
if((abs(a[i].x - a[u].x) == || abs(a[i].y - a[u].y) == ) && (abs(a[i].x - a[u].x) >= && abs(a[i].y - a[u].y) >= ))
w = << ;
}
if(d[i] > d[u] + w)
{
d[i] = d[u] + w;
q.push(PII(d[i], i));
}
}
}
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= k; ++i)
scanf("%d%d", &a[i].x, &a[i].y);
sort(a + , a + k + , cp);
if(a[k].x != n || a[k].y != m)
{
flag = false;
a[++k].x = n;
a[k].y = m;
}
dijiestra();
printf("%d\n", d[k] >= << ? - : d[k]);
return ;
}

E:昨天晚上以为这道题组合搞搞就行了。。。

矩阵快速幂

dp:dp[i][x]=dp[i-1][x-1]+dp[i-1][x]+dp[i-1][x+1] 边界不讨论了。

然后这是标准的矩阵快速幂形式,那么对于每条线段构造矩阵,最后一条线段的终点要设成k,初值dp[0][0]=1,输出dp[k][0]。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = ;
const ll mod = ;
struct mat {
ll a[][];
} l;
struct data {
ll a, b;
int c;
} a[N];
int n;
ll k;
mat operator * (mat A, mat B)
{
mat ret; memset(ret.a, , sizeof(ret.a));
for(int i = ; i <= ; ++i)
for(int j = ; j <= ; ++j)
for(int k = ; k <= ; ++k)
ret.a[i][j] = (ret.a[i][j] + A.a[i][k] * B.a[k][j] % mod) % mod;
return ret;
}
mat power(mat x, ll t)
{
mat ret; memset(ret.a, , sizeof(ret.a));
for(int i = ; i <= ; ++i)
ret.a[i][i] = ;
for(; t; t >>= , x = x * x) if(t & ) ret = x * ret;
return ret;
}
int main()
{
cin >> n >> k;
for(int i = ; i <= n; ++i)
scanf("%lld%lld%d", &a[i].a, &a[i].b, &a[i].c);
a[n].b= k;
l.a[][] = ;
for(int i = ; i <= n; ++i)
{
mat x; memset(x.a, , sizeof(x.a));
for(int j = ; j <= a[i].c; ++j)
{
if(j > )
x.a[j][j - ] = ;
x.a[j][j] = ;
if(j < a[i].c)
x.a[j][j + ] = ;
}
l = power(x, a[i].b - a[i].a) * l;
}
printf("%lld\n", l.a[][]);
return ;
}

codeforces round #420 div2的更多相关文章

  1. codeforces round 420 div2 补题 CF 821 A-E

    A Okabe and Future Gadget Laboratory 暴力 #include<bits/stdc++.h> using namespace std; typedef l ...

  2. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  3. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

  4. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  5. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  6. Codeforces Round #361 div2

    ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...

  7. Codeforces Round #626 Div2 D,E

    比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...

  8. CodeForces Round 192 Div2

    This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...

  9. Codeforces Round #359 div2

    Problem_A(CodeForces 686A): 题意: \[ 有n个输入, +\space d_i代表冰淇淋数目增加d_i个, -\space d_i表示某个孩纸需要d_i个, 如果你现在手里 ...

随机推荐

  1. Win32编程笔记

    我都决定了目前不再接触这些个浪费精力的API了,结果为了DirectX编程我特么又回来了.....微软你的东西真是坑人 以前用这玩意的时候需要什么就查,查完就忘了,这次记一记,以后再用也不至于忘的太离 ...

  2. Caffe2:添加CUDA路径

    在使用Eclipse时候,仍然出现 libcuda.so 找不到的情况..... 原因:cuda环境没有设置到系统环境中. 方案: 设置CUDA path: 在bashrc中添加路径,只对当前用户产生 ...

  3. Resetting the SMC & PRAM

    Resetting the SMC & PRAM on portables with a battery you should not remove on your own 1. Shut d ...

  4. Python 之mysql类封装

    import pymysql class MysqlHelper(object): conn = None def __init__(self, host, username, password, d ...

  5. Sping装配之——自动装配

    Sping从两个角度来实现自动化装配: 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足be ...

  6. JAVA通用工具类

    1.异常验证框架 框架1:com.google.common.base.Preconditions 框架2:org.apache.commons.lang.Validate 框架3:org.apach ...

  7. 洛谷——P1896 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...

  8. 解决高分屏/高DPI下GNOME3/Linux字体和按钮太小的问题

    更改系统设置就好了. 我的设备是Surface Pro,12英寸,分辨率2736x1824,在虚拟机里安装CentOS 7后字特别小,标题栏的最小化/最大化/关闭按钮也很小,眼睛受不了的. 更改两个设 ...

  9. Django REST framework 自定义(认证、权限、访问频率)组件

    本篇随笔在 "Django REST framework 初识" 基础上扩展 一.认证组件 # models.py class Account(models.Model): &qu ...

  10. Django settings.py的一些配置

    官方文档:settings配置 静态文件配置链接 # 语言改为中文: LANGUAGE_CODE = "zh-hans" # 时区由UTC改为Asia/Shanghai,这样有关时 ...