[NOIP模拟] 区间
来源:互联网 发布:淘宝客怎么做推广技巧 编辑:程序博客网 时间:2024/05/21 05:08
[NOIP模拟] 区间
2017.11.03 T1
Solution
很好我已经遇见两个作为 T1 比 T2 难的NOIP题,估计是自己太弱了。
对于每一个询问我们必须做到小于
Code :
#include <cstdio>#include <cstdlib>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <cmath>#include <ctime>#include <map>#include <vector>#define mp make_pairusing namespace std;inline int read() { int i = 0, f = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)) { i = (i << 3) + (i << 1) + ch - '0'; ch = getchar(); } return i * f;}const int MAXN = 8000 + 5;int a[MAXN], b[MAXN], n, k, m, cnt[MAXN * 2], check[MAXN * 2];map<int, int> num;vector<int> p[MAXN];map<pair<int, int>, int> ans;inline void disc_init() { sort(b + 1, b + n + 1); m = unique(b + 1, b + n + 1) - b - 1; for(int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + m + 1, a[i]) - b, num[b[a[i]]] = a[i];}inline int solve(int x, int y, int l) { int sum = n; check[sum] = l, cnt[sum] = 0; int pos = 0, tmp = 0; int i = 0, j = 0, now = 0, mn = 0x3f3f3f3f, mx = (int)0xC0000000; while(p[x][i] != n + 1 || p[y][j] != n + 1) { if(p[x][i + 1] <= p[y][j + 1]) { tmp += (cnt[sum] + cnt[sum] + p[x][i + 1] - pos - 1) * (p[x][i + 1] - pos) / 2; cnt[sum] += p[x][i + 1] - pos; pos = p[x][++i]; ++sum; if(check[sum] != l) check[sum] = l, cnt[sum] = 0; //printf("%d\n", cnt[sum - 1]); } else { tmp += (cnt[sum] + cnt[sum] + p[y][j + 1] - pos - 1) * (p[y][j + 1] - pos) / 2; cnt[sum] += p[y][j + 1] - pos; pos = p[y][++j]; --sum; if(check[sum] != l) check[sum] = l, cnt[sum] = 0; //printf("%d\n", cnt[sum + 1]); } //printf("%d %d %d %d\n", pos, sum, p[x][i], p[y][j]); } //printf("mx = %d mn = %d\n", mx, mn); ans[mp(x, y)] = tmp; return tmp;}int main() { //freopen("1.in", "r", stdin); n = read(), k = read(); for(int i = 1; i <= n; ++i) a[i] = read(), b[i] = a[i]; disc_init(); for(int i = 0; i <= m; ++i) p[i].push_back(0); for(int i = 1; i <= n; ++i) p[a[i]].push_back(i); for(int i = 0; i <= m; ++i) p[i].push_back(n + 1), p[i].push_back(n + 2); for(int i = 1; i <= k; ++i) { int x = read(), y = read(); x = num[x], y = num[y]; if(x > y) swap(x, y); int now = ans[mp(x, y)]; if(!now) cout<<solve(x, y, i)<<'\n'; else cout<<now<<'\n'; }}
阅读全文
0 0
- [NOIP模拟] 区间
- NOIP模拟 01祖玛【区间dp】
- NOIP模拟(11.03)T1 区间
- 20161024的考试】noip模拟,dp,区间中位数,值域分块
- NOIP模拟 10.17 单调队列 + 树形Dp + 区间Dp
- Noip模拟
- 【NOIP模拟】20151004模拟
- 【NOIP模拟】 20151005模拟
- 【NOIP模拟】 20151006模拟
- 【NOIP模拟】 20151007模拟
- 【NOIP模拟】20151014模拟
- 【NOIP模拟】20151015模拟
- NOIP题库区间合并
- 2017.04.02【NOIP 普及组】模拟赛C组 T1:区间
- JZOJ1489.2017.04.02【NOIP 普及组】模拟赛C组 T1区间
- #NOIP模拟赛#吃糖果candy(缩小选边范围--mod区间)
- 【09 NOIP 模拟】light
- [NOIP模拟]Day1
- CCNA课程(一)
- python从入门到实践,习题15-5重构
- keil环境下为什么有时候不用while语句也可以不跑飞?
- BroadcastReceiver 详解
- 如何在Windows下装Unbuntu
- [NOIP模拟] 区间
- 版本控制之Git---脚本提交
- ubuntu16.04安装sbt
- RSA算法原理(二)
- 树状结构学习(1)、最大-最小划分树
- 【C++】通过模板实现一个通用的冒泡排序
- go get 使用代理
- spring boot,cloud,微信点餐系统,小程序开发视频教程
- iOS小技巧-为项目添加全局PrefixHeader.pch预编译文件