雪崩,全错掉了GG。前两道题相对之前的难度大一点啊,不过A题有个循环应该是从0开始而不是1开始这样的低级错误不应该犯。B题差不多是一个BFS,但是我当时始终绕着最短路径写来写去,一直各种TLE与WA。C题是一道二分,挺容易的,昨天一直在写B,没做真是可惜。

A

我用DFS写的,相对比较麻烦了。就是按照它的变化次序,来把0-9都试一遍,看有没有满足的。由于那个循环不小心写成了1-9,直接崩了。哎,教训。

B

题目大意就是求从顶点1到其它所有顶点的最短路径值。每两个点之间的距离为下标的差的绝对值。另外每个点还有一个自己的ai,点i到ai的距离为1。共有20w个顶点,我想直接用最短路那儿的方法求一个单源最短路径的,但不管是SPFA(时间复杂度O(kE)),还是用堆优化的dijkstra(时间复杂度O(E+nlogn))都要超时。最后自己又尝试了一个比较怪的dfs,还是超时,到最后就一直卡在这里结束了。第二天看题解发现是用BFS写的,因为DFS扩展的状态太多(每次都有n个),很多带来了重复计算导致效率低下,实际上,由于后面处理的一定比前面处理的距离要长,那么我们只要处理3个状态,即当前状态的前一个、后一个和跳跃的那一个就好了。已经处理过的就不要再处理了。

//
//  main.cpp
//  Codeforces 361 A
//
//  Created by 赵奕 on 16/7/7.
//  Copyright © 2016年 赵奕. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
const int MAX = 99999999;
int n,dis[200010],a[200010];
int flag[200010];
using namespace std;
queue<int> q,q2;
void pushing(int x,int y)
{if (x < 1 || x > n || flag[x])return ;q.push(x);q2.push(y);flag[x] = 1;dis[x] = y;
}
int main()
{int i,j,s,t;cin >> n;memset(flag,0,sizeof(flag));for (i = 1; i <= n; ++i)scanf("%d",&a[i]);q.push(1);q2.push(0);flag[1] = 1;while (!q.empty()){s = q.front();q.pop();t = q2.front();q2.pop();pushing(s-1,t+1);pushing(s+1,t+1);pushing(a[s],t+1);}for (i = 1; i <= n; ++i){cout << dis[i] << " " ;}return 0;
}

C

题目大意就是有四个数,设第一个数为x,那么第二、三、四个数就分别为kx,k*k*x,k*k*k*x,其中k是任意的。并且这四个数都不能大于n,然后假定符合条件的有m组。题目给定m,问满足有m对的这四个数的最小n为多少。
求最大值的最小。二分。对于每个n,对于每个x,共有[n/(x^3)]个k。让x从2到三次根号下n做一遍循环求一下就好了。

//
//  main.cpp
//  Codeforces 361 C
//
//  Created by 赵奕 on 16/7/7.
//  Copyright © 2016年 赵奕. All rights reserved.
//#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
const int MAX = 99999999;
typedef long long ll;
ll n,dis[200010],a[200010];
using namespace std;
ll work(ll k)
{ll i,j;j = 0;for (i = 2; i * i * i <= k; ++i){j += k/(i*i*i);}return j;
}
int main()
{ll h,i,j,l,r,mid,ans;cin >> n;l = 1;r = 1e18;ans = -1;while (l <= r){mid  = (l+r) >> 1;h = work(mid);if (h >= n){if (h==n)ans = mid;r = mid-1;}elsel = mid+1;}cout << ans << endl;return 0;
}

D

二分+数据结构
题目大意是给你两个长度为20w的数组a、b,求有多少个子区间满足max{a[i]}=min{b[i]}。
我们的做法是固定住区间的右位置,来求有多少个左位置满足条件。然后把这些加起来即可。当右位置固定时,a数组关于左位置的最大值是单调不升的,b数组关于左位置是单调不降的,因此我们可以用二分法来求得有多少满足题意的子区间。我们维护这样的一个值t,使得[t,i]区间,a的最大值比b的最小值一定要小(因为,再往后,位置t仍然没有作用,我们此时把t往后挪)然后在[t,i]区间内找到a的最大值和b的最小值的位置,取它们的较小值为mp,那么从t…mp位置的[j,i]一定都是满足的。
参考小数据:
6
1 2 3 2 1 2
6 7 1 2 3 2

在第三个位置时,A中的最大值3>B中的最小值1,一步步往后拱直至A和B都空了。
在第四个位置时,A中的最大值2=B中的最小值1,此时从4到4都是满足[j,i]满足的。cnt +=1;
在第五个位置,A中的最大值2仍然=B中的最小值1,此时A中的最大值在4,B中的最小值在4,此时从4到4都是满足[j,i]满足的。 cnt+=1
在第五个位置,A中的最大值2仍然=B中的最小值1,此时A中的最大值在6,B中的最小值在6,此时从4到6都是满足[j,i]满足的。cnt+=3;

#include <cstdio>
#include <iostream>
#include <set>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;typedef long long Long;
typedef pair<Long, int> PLI;int main() {int N;cin >> N;vector<int> A(N),  B(N);for(int &v : A)cin >> v;for(int &v : B)cin >> v;int t = 0;Long cnt = 0;set<PLI> SB;//按照pair的第一个元素来排,第一个相等的话按第二个来排set<PLI,greater<PLI>> SA;//a数组是求最大值,因此按照从大到小的greater来排for(int i = 0; i < N; ++i){SA.insert(PLI(A[i],i));//每次把当前的数和位置插入set里SB.insert(PLI(B[i],-i));while(!SA.empty() && !SB.empty() && SA.begin()->first > SB.begin()->first ){//如果当前A序列的最大值比B的最小值要大,显然[t,i]区间没有满足的,那么把t往前拱,使得把A的大的弄掉,B的小的弄掉SA.erase(SA.lower_bound(PLI(A[t],t)));SB.erase(SB.lower_bound(PLI(B[t],-t)));t++;}if(!SA.empty() && !SB.empty() && SA.begin()->first == SB.begin()->first){//如果此时A的最大值和B的最小值相等。那么计算有多少个j使得在[j,i]满足题意。int mp = min( SA.begin()->second, -(SB.begin()->second) );//A里面第一个存放的是t到i位置的最大值的位置cnt += mp - t + 1;//j属于[t,mp]都满足[j,i]区间...}}cout << cnt << endl;return 0;
}

Codeforces Round 361 div2相关推荐

  1. Codeforces Round #361 (Div. 2) B. Mike and Shortcuts bfs

    B. Mike and Shortcuts 题目连接: http://www.codeforces.com/contest/689/problem/B Description Recently, Mi ...

  2. codeforces Round#429 (Div2)

    2017-08-20 10:00:37 writer:pprp 用头文件#include <bits/stdc++.h>很方便 A. Generous Kefa codeforces 84 ...

  3. Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 离散化】

    任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...

  4. Codeforces Round#310 div2

    C题:这题说的是套娃,如果做题的时候知道是套娃,那就好理解多了 规则1:套娃A可以放到套娃B里面,当且仅当套娃B没有放在其他套娃里面 规则2:套娃A放在套娃B里面,且套娃B没有放在其他套娃里面,那么可 ...

  5. Codeforces Round #359 div2

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

  6. Codeforces Round #360(div2)

    考完试的晚上,打了场codeforces,主要感觉由于睡眠不够,最后差了点劲啊,C题基本上都过了,但忙中出错最后把数组调小易于debug后再提交又忘记改回来了,看到Runtime Error自己竟没反 ...

  7. codeforces round 416 div2补题

    第一题,水题 A. Vladik and Courtes #include<bits/stdc++.h> using namespace std; int main() {long lon ...

  8. codeforces round 421 div2 补题 CF 820 A-E

    A Mister B and Book Reading  O(n)暴力即可 #include<bits/stdc++.h> using namespace std; typedef lon ...

  9. codeforces round #576 div2 D Welfare State(线段树)[单点修改+区间修改]

    题意:有一些数字,以及一些操作.操作一是单点修改,输入1 b c,将位置b改成c,操作二是输入2 a,将不大于a的数全部改成a.求更改完毕后的数. tag的运用:tag是对被覆盖区间上加一个标记,那么 ...

最新文章

  1. matlab 双向链表,双向链表基本操作(C语言实现)
  2. VC+MO2.0连接ArcSDE并且读出SDE中的空间数据(三)
  3. 《.NET设计规范 约定、惯用法与模式》读书笔记
  4. python网络编程---TCP客户端
  5. 免费 Flash 留言板 -Powered by Kong
  6. 前端怎么使用jsessionid_前端搞微前端 | 侑夕 - 如何落地微前端一体化运营工作台...
  7. Redis登陆服务器和批量删除指定的key
  8. debian apt-get php,Debian系统apt-get命令整理
  9. Pytorch nn.functional.pad()的简单用法
  10. java8中class怎么用_Java8中你可能不知道的一些地方之方法引用实战
  11. Struts2学习笔记(十八) 防止表单重复提交
  12. 【记录】JS回调函数(小例子)
  13. 未来计算机技术的发展趋势有哪些,计算机技术的未来发展趋势,以及其应用范围...
  14. 一个对于小数四舍五入的算法C语言版
  15. ICU - International Components for Unicode
  16. English Corpora - 英语语料库
  17. “我的一剂良药”之开源指北
  18. sfp寄存器_SFP+-光模块测试指导
  19. vscode中自动换行快捷键_VSCode Mac实用快捷键、插件
  20. 自动化测试平台及可视化界面

热门文章

  1. 是计算机程序设计语言的是,计算机设计语言
  2. Latex常用总结(2):输入矩阵(输入矩阵、对角阵、方程组等)
  3. NOIP2014提高组A.石头剪刀布
  4. Detected memory leaks!内存泄漏,溢出,内存越界问题分析
  5. 新能源汽车档位控制器软件功能定义及其策略
  6. SSCoin交易开放时间及未来价值
  7. 如何更改已经pushed的commit的注释信息(How to change the pushed commit message)
  8. 690. Employee Importance
  9. MSSQL日期按星期几汇总排序
  10. 【笨木头Lua专栏】基础补充02:函数的几个特别之处