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. nagios插件nagiosql安装配置

    nagios插件nagiosql安装配置 # Nagiosql install [root@Cagios ~]# yum install -y libssh2 libssh-devel [root@C ...

  2. Android中Application类总结

    本文出处: 炎之铠csdn博客:http://blog.csdn.net/totond 炎之铠邮箱:yanzhikai_yjk@qq.com 本文原创,转载请注明本出处! 前言 最近的开发中经常使用到 ...

  3. acedinitget

    // 提示用户选择选择方式 acedInitGet(0, _T("W CP")); int nRs = acedGetKword(_T("\n请输入关键字确定选择方式[窗 ...

  4. js  计算是今天多少周

    /** * 判断年份是否为润年 * * @param {Number} year */ function isLeapYear(year) { return (year % 400 == 0) || ...

  5. [Luogu] P3907 圈的异或

    题目描述 给出无向图G,边 (Ai,Bi)的权是Ci,判断下列性质是否成立: 对于任意圈C,其边权的异或和是0 输入输出格式 输入格式: 第1 行,1 个整数T,表示数据的组数. 每组数据第1 行,2 ...

  6. 仿探探卡片滑动vue封装并发布到npm

    项目初始化使用 webpack-simple 方式比较方便和容易配置,原来的方式各种坑慎入 vue init webpack-simple vue-card-slide cd vue-card-sli ...

  7. Python 4 循环语句while

    while  [条件]:        条件这里满足布尔运算True则无限循环while里面代码. 固定条件的 基本的while循环, 如果if匹配那么 则执行打印登录成功,和break跳出整个循环, ...

  8. 清北学堂模拟赛d5t5 exLCS

    分析:比较巧妙的一道题.经典的LCS算法复杂度是O(nm)的,理论上没有比这个复杂度更低的算法,除非题目有一些限制.这道题中两个字符串的长度不一样,f[i][j]如果表示第一个串前i个,第二个串前j个 ...

  9. hdu_2925_Musical Chairs_201311121643

    Musical Chairs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  10. 洛谷 P1586 四方定理

    P1586 四方定理 题目描述 四方定理是众所周知的:任意一个正整数nn,可以分解为不超过四个整数的平方和.例如:25=1^{2}+2^{2}+2^{2}+4^{2}25=1​2​​+2​2​​+2​ ...