acwing-241. 楼兰图腾-树状数组板子题+开脑洞
原题链接
题意:给你一组数,让你找出所有aiak的个数与ai>aj<ak的个数.
思路: 看到这个题瞬间想到了三层的暴力(暴力破万物),但是n是200000,跑三层服务器会跑吐的,必然超时.
我们来优化下我们记录下任意一个位置,它左右两边x大于它的数的个数与小于它的个数,这个题可以离线操作,那就万事大吉了.
做法:创建一个树状数组,存储区间内的个数,我们将数组按照值升序排序对于每个值,先查询左右区间的个数,查出来的值就是左右两边小于它的数的个数了,相乘就是结果,大于的也一样算,我这里是清空数组从大到小跑了一遍.
优化:y是 1 到 n 的一个排列。所有y均不相同,那么对于任意一个数字,它左边小于它的数字加上大于它的数字的和就是它左边的所有数字,右边同理,只需要跑一次树状数组就够了,不过A了就懒得优化了…
题外话:这种强行单调的操作方式常见的,以后会经常见到的…
扩展:如果y可以相同的话把查询那部分改一下就行了,相同的先压入栈里面延迟更新,找到不同的再都一起更新就好了.
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
#include <string>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <map>
#include <list>
#include <ctime>using namespace std;#ifdef Wang_Zhifeng
#define debug(x) printf("debug:%s=%d\n",#x,x);
//#define debug(x) cout << #x << ": " << x << endl;
#endif#define ll long long
#define ld long double
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f#define EXP 1e-8
#define MOD 1000000007
#define N 200005#define random(x) rand()%x+1
#define lowbit(a) ((a)&-(a))
int c[N];
int n;void change_point(int x, int y, int n) {for(int i = x; i <= n; i += lowbit(i))c[i] += y;
}int ask_interval(int x) {int ans = 0;for(int i = x; i; i -= lowbit(i))ans += c[i];return ans;
}void init() {for(int i = 0; i <= n; ++i) {c[i] = 0;}
}struct node {int val;int pos;
} arr[N];bool cmp(node a, node b) {return a.val > b.val;
}void input() {scanf("%d", &n);for(int i = 1; i <= n; ++i) {scanf("%d", &arr[i].val);arr[i].pos = i;}
}void solve() {ll ans1 = 0;ll ans2 = 0;ll tmp1 = 0;ll tmp2 = 0;sort(arr+1, arr+n+1, cmp);init();for(int i = 1; i <= n; ++i) {tmp1 = ask_interval(arr[i].pos);tmp2 = ask_interval(n);ans1 += (tmp2-tmp1)*tmp1;change_point(arr[i].pos, 1, n);}init();for(int i = n; i >= 1; --i) {tmp1 = ask_interval(arr[i].pos);tmp2 = ask_interval(n);ans2 += (tmp2-tmp1)*tmp1;change_point(arr[i].pos, 1, n);}printf("%lld %lld", ans1, ans2);
}int main() {#ifdef Wang_Zhifeng
#pragma comment(linker, "/STACK:102400000,102400000")freopen("in.txt", "r", stdin);setvbuf(stdout, NULL, _IOFBF, 1024);std::ios::sync_with_stdio(false);cin.tie(0);
#endifinput();solve();return 0;
}
acwing-241. 楼兰图腾-树状数组板子题+开脑洞相关推荐
- 树状数组板子题之一:hdu 1166 敌兵布阵
树状数组板子题之一:hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手 ...
- 楼兰图腾(树状数组)
题目描述: 思路: 题目字很多,但是题意并不难懂,其实我们就是要找当前数前面和后面分别有多少数大于或小于当前数字,然后再将找到的两个数量相乘就是当前数字能组成的图腾数量. 例如: 1 2 3 1 2 ...
- NOIP刷题记录(打鼹鼠)——二维树状数组板子题
一.题目描述 在这个"打鼹鼠"的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大--).洞口都在一个大小为n的正方形中.这个正方形在一个平面直角坐标系中,左下角为 ...
- hdu1166敌兵布阵 树状数组裸题
树状数组裸题 动态更新区间内的点,动态查询区间和 敌兵布阵 ac代码 #include<iostream> #include<algorithm> #include<cs ...
- AcWing 241 楼兰图腾(树状数组详解)
树状数组 问题引入 树状数组是一种实现起来比较简单的高级数据结构. 我们知道,对于一个数组a[i],其前缀和s[i]表示a数组里面前i个元素之和,而求区间l到r的元素之和可以用s[r] - s[l-1 ...
- AcWing 241 楼兰图腾
241. 楼兰图腾 在完成了分配任务之后,西部 314来到了楼兰古城的西部. 相传很久以前这片土地上(比楼兰古城还早)生活着两个部落,一个部落崇拜尖刀(V),一个部落崇拜铁锹(∧),他们分别用 V 和 ...
- HDU1166 敌兵布阵(树状数组模板题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU - 6183 Color it(动态开点线段树/树状数组套动态开点线段树)
题目链接:点击查看 题目大意:给出一个二维平面坐标系,需要完成四种操作: 0:删除所有点 1 xycx\ y\ cx y c:在点 (x,y)(x,y)(x,y) 处添加颜色 ccc 2 xy1y2x ...
- hdu 1166 敌兵布阵 树状数组 模板题
这题是树状数组入门的一模板题,非常基础,被小白成为"赤裸裸"的入门题,哈哈,一个plus,一个sum全部搞定 #include<stdio.h> #include< ...
最新文章
- ConstraintLayout 全解析
- oracle中计算某月的天数
- 密码认证协议PAT怎么配置?
- java rabbitmq 工具类_RabbitMq通用管理工具类
- php分区表,分区表的基本操作
- JVM上的高并发HTTP客户端
- lua是编译成c语言再执行嘛,go_lua_c: 使用go编译lua脚本为字节码,通过网络传给c,通过c执行lua脚本。...
- C程序设计语言现代方法11:指针
- RequestInfo关键点解析
- linux apache安全,基于Linux平台的Web安全技术研究——Apache安全.doc
- matlab解全微分方程,通过MATLAB求二阶全微分方程解析解
- 第七次人口普查数据可视化---pyecharts
- 测试基本理论-看这篇就够了
- 受欢迎的牛+Trajan缩点+树形dp
- QT打印打印excel
- 动态规划 leetcode-714 最佳买卖股票时机含手续费
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
- 7月20日到12月3日
- 【机器人学】逆运动学
- cogs 1487. 麻球繁衍
热门文章
- 杀软测评通报:“AV-Test”最新一轮测试结果及与“VB100”认证
- java基于springboot+vue服装商城-服装销售网站
- 阿里云OSS图片的上传与展示:案例
- EndNote最全参考文献style
- 说说大型高并发高负载网站的系统架构 1
- Cisco 安全设备管理工具 (SDM)
- SpringBoot详细笔记记录
- 苹果公司创始人乔布斯生平简介
- react错误:Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infini
- C语言实现YUV420sp图像剪裁