Codeforces 961E - Tufurama
思路:
线段树或者分块
遍历 1 - n - 1,求 区间[i + 1, min(a[i], n)]大于等于 i 的个数,累加起来
线段树:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define ls rt << 1, l, m
#define rs rt << 1 | 1, m + 1, r
#define mem(a, b) memset(a, b, sizeof(a)) const int N = 2e5 + ;
vector<int> vc[N<<];
int a[N];
void build(int rt, int l, int r) {
if (l == r) {
vc[rt].pb(a[l]);
return ;
}
for (int i = l; i <= r; i++) vc[rt].pb(a[i]);
sort(vc[rt].begin(), vc[rt].end());
int m = l + r >> ;
build(ls);
build(rs);
}
int query(int L, int R, int rt, int l, int r) {
if (L > R) return ;
if (L <= l && r <= R) {
return vc[rt].size()-(lower_bound(vc[rt].begin(), vc[rt].end(), L - ) - vc[rt].begin());
}
int ans = ;
int m = l + r >> ;
if (L <= m) ans += query(L, R, ls);
if (R > m) ans += query(L, R, rs);
return ans;
}
int main() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
build(, , n);
LL ans = ;
for (int i = ; i < n; i++) {
ans += query(i + , min(a[i], n), , , n);
}
printf("%lld\n",ans);
return ;
}
分块:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pb push_back
#define mem(a, b) memset(a, b, sizeof(a)) const int N = 2e5 + ;
int a[N], block[], belong[N];
int blo;
vector<int> vc[];
int query(int L, int R){
if (R < L) return ;
int ans = ;
if (belong[L] == belong[R]) {
for (int i = L; i <= R; i++) {
if (a[i] >= L - ) ans++;
}
return ans;
}
for (int i = L; i <= belong[L] * blo; i++){
if (a[i] >= L - ) ans++;
}
for (int i = belong[L] + ; i <= belong[R] - ; i++) {
ans += vc[i].size() - (lower_bound(vc[i].begin(), vc[i].end(), L - ) - vc[i].begin());
}
for (int i = (belong[R] - ) * blo + ; i <= R; i++) {
if (a[i] >= L - ) ans++;
}
return ans;
}
int main() {
int n;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
blo = sqrt(n);
for (int i = ; i <= n; i++) {
belong[i] = (i - ) / blo + ;
}
for (int i = ; i <= n; i++) {
vc[belong[i]].pb(a[i]);
}
for (int i = ; i <= belong[n]; i++) {
sort(vc[i].begin(), vc[i].end());
}
LL ans = ;
for (int i = ; i <= n - ; i++) {
ans += query(i + , min(n, a[i]));
//cout << ans << endl;
}
printf("%lld\n", ans);
return ;
}
Codeforces 961E - Tufurama的更多相关文章
- 2018.12.05 codeforces 961E. Tufurama(主席树)
传送门 一眼主席树sbsbsb题(%%%树状数组大佬们). 简化题意:求满足x<y,y≤ax,x≤ayx<y,y\le a_x,x\le a_yx<y,y≤ax,x≤ay的(x, ...
- Codeforces 961E - Tufurama 树状数组
转自:https://blog.csdn.net/my_sunshine26/article/details/79831362 题目大意: i从1开始 基本思路: 完全没思路,所以上来就二分,果不其然 ...
- Tufurama CodeForces - 961E
Tufurama CodeForces - 961E 题意:有一部电视剧有n季,每一季有ai集.问有多少对i,j存在第i季第j集也同时存在第j季第i集. 思路:核心问题还是统计对于第i季,你要统计第i ...
- Tufurama CodeForces - 961E (cdq分治)
题面 One day Polycarp decided to rewatch his absolute favourite episode of well-known TV series " ...
- CF 961E Tufurama
JYZdalao上课讲了这道题,觉得很好可做 其实也是一道理解了就水爆了的题目 把题意抽象化,可以发现题目求的满足 i<j a[i]>=j a[j]>=i 的i,j对数.由于i,j顺 ...
- Codeforces 961E 主席树
题意: 给出一个n个数的序列,求有几对(i,j)满足a[i]>=j&&a[j]>=i,(i,j)和(j,i)只能算一对. 考虑第i个数会有几个j(j<i)满足条件,首 ...
- 【树状数组】CF961E Tufurama
挺巧妙的数据结构题(不过据说这是一种套路? E. Tufurama One day Polycarp decided to rewatch his absolute favourite episode ...
- Educational Codeforces Round 41 E. Tufurama (961E)
[题解] 第一眼看题飞快地想到一种做法,然后假掉了. 这道题其实是主席树的模板题来着.但是也有别的水法. 我们可以发现每个位置的查询区间是[1,min(a[i],i-1)],所以我们可以把查询区间按照 ...
- Educational Codeforces Round 41 967 E. Tufurama (CDQ分治 求 二维点数)
Educational Codeforces Round 41 (Rated for Div. 2) E. Tufurama (CDQ分治 求 二维点数) time limit per test 2 ...
随机推荐
- sqlloader parallel调用报ORA-26002: table has index defined upon it.解决方法
ORA-26002: table has index defined upon it. This issue is caused when using the bulk load option in ...
- python简说(二十八)json.path
import jsonpathres = jsonpath.jsonpath(d,'$..name') 字典,模糊匹配
- (5keras自带的模型之间的关系)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署
其中: 1.VGG 网络以及从 2012 年以来的 AlexNet 都遵循现在的基本卷积网络的原型布局:一系列卷积层.最大池化层和激活层,最后还有一些全连接的分类层. 2.ResNet 的作者将 ...
- Link Cut Tree学习笔记
从这里开始 动态树问题和Link Cut Tree 一些定义 access操作 换根操作 link和cut操作 时间复杂度证明 Link Cut Tree维护链上信息 Link Cut Tree维护子 ...
- python脚本解析json文件
python脚本解析json文件 没写完.但是有效果.初次尝试,写的比较不简洁... 比较烦的地方在于: 1,中文编码: pSpecs.decode('raw_unicode_escape') 2,花 ...
- topcoder srm 410 div1
problem1 link 不包含$gridConnections$ 的联通块一定是连在所有包含$gridConnections$的联通块中最大的那一块上. import java.util.*; i ...
- Python3基础 list in/not in 判断一个变量是否在列表中存在
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Linux lvm 分区知识笔记
盘面上可以细分出扇区(Sector)与柱面(Cylinder)两种单位,其中扇区每个为512bytes那么大. 通常所说的"硬盘分区"就是指修改磁盘分区表,它定义了"第n ...
- HDU 2647 Reward 【拓扑排序反向建图+队列】
题目 Reward Dandelion's uncle is a boss of a factory. As the spring festival is coming , he wants to d ...
- SpringBoot 使用Sharding-JDBC进行分库分表及其分布式ID的生成
为解决关系型数据库面对海量数据由于数据量过大而导致的性能问题时,将数据进行分片是行之有效的解决方案,而将集中于单一节点的数据拆分并分别存储到多个数据库或表,称为分库分表. 分库可以有效分散高并发量,分 ...