lower_bound

2018 ccpc final

匿名 (未验证) 提交于 2019-12-03 00:14:01
2018 CCPC FINAL kunkun全球后援队训练赛赛 A. 签到 笨比mwh wa了两发 #include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #pragma GCC optimize(2) using namespace std; typedef long long ll; const int N = 1e5 + 5; int t, n, m, kas; struct node{ int d, t; }list[N]; bool cmp(node a, node b){ if (a.d == b.d) return a.t < b.t; return a.d < b.d; } int main() { // cin.tie(0); // cout.tie(0); // ios::sync_with_stdio(0); cin >> t; kas = 0; while (t--) { cin >> n >> m; for (int i = 0; i < n; ++i) cin >> list[i].d; for (int i = 0; i < n; ++i) cin >> list[i].t; sort(list, list + n,

『珂朵莉树 Old Driver Tree』

匿名 (未验证) 提交于 2019-12-03 00:03:02
珂朵莉树其实不是树,只是一个借助平衡树实现的数据结构,主要是对于有区间赋值的数据结构题,可以用很暴力的代码很高效地完成任务,当然这是建立在数据随机的基础上的。 即使数据不是随机的,写一个珂朵莉树用来当做暴力也是很划算的。 珂朵莉树可以使用 std::map 来实现, 并且代码量极小,不知道为什么大家都要写 set 。 那么问题来了,如何使用 \(map\) 来实现珂朵莉树呢?众所周知,用 \(set\) 的实现方式都是维护一个连续的相同区间, \(map\) 当然也是同理,我们仍然用 \(map\) 的第一维当数组下标,把相同一段元素的值存在段下标的最后一个位置,就比如这样: 我们只在红色数字的下标位置申请 \(map\) 空间,存储数值。然后我们就可以非常方便的操作 \(map\) 了,看具体操作吧。 整体的定义和申明如下: #define it map<int,int>::iterator struct ChthollyTree { map <int,int> s; inline int find(int p) { } inline void split(int p) { } inline pair<it,it> range(int l,int r) { } }; find 我们需要实现珂朵莉树的 \(find\) 操作,就是在 \(map\) 中定位原数列一个位置的值

STL初步

[亡魂溺海] 提交于 2019-12-02 06:44:50
STL初步 1.排序与检索 algorithm头文件中的sort可以给任意对象排序,包括内置类型和自定义类型,前提是定义了“<”运算符。 排序之后可以用lower_bound查找大于或等于x的第一个位置。 待排序/查找的元素可以放在数组里,也可以放在vector里。 #include<algorithm> #include<iostream> #inlcude<cstdio> using namespace std; const int N=100; //比较函数,降序排列 bool cmp(int x,int y) { return x>y; } int main() { int a[N]; for(int i=0;i<N;i++) scanf("%d",&a[i]); //sort有三个参数,分别是数组首地址、尾地址,比较函数。比较函数可省略,默认为从小到大进行排序,即升序排列 sort(a,a+N,cmp); //若数据存在vector中,则以sort(a.begin(),a.end())的方式调用。 int x=5; //lower_bound有三个参数,分别是数组首地址、尾地址,和待查找元素 int p=lower_bound(a,a+N,x); } 2.不定长数组:vector vector头文件中的vector是一个不定长数组,可以用clear()清空,size(

STL lower_bound upper_bound 用法

和自甴很熟 提交于 2019-12-02 00:30:19
1.lower_bound(begin,end,x) 返回第一个>=x的位置,找不到return .end() 2.upper_bound (begin,end,x) 返回第一个>x的位置,找不到return .end() 减掉begin得到下标 vector版 #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<vector> using namespace std; vector<int>a; int b[10]; int main(){ a.push_back(1); a.push_back(1); a.push_back(2); a.push_back(3); int p=lower_bound(a.begin(),a.end(),1)-a.begin(); int q=lower_bound(a.begin(),a.end(),2)-a.begin(); printf("%d %d\n",p,q);// 0 2 p=upper_bound(a.begin(),a.end(),1)-a.begin(); q=upper_bound(a.begin(),a.end(),2)-a.begin();

[CF1236D] Alice and the Doll - 模拟,STL

与世无争的帅哥 提交于 2019-12-01 23:48:57
[CF1236D] Alice and the Doll Description \(N \times M\) 网格,有 \(K\) 个格子里有障碍物。每次经过一个格子的时候只能直走或者右转一次。初态在 \((1,1)\) 格子向上。求是否存在一条路径经过所有无障碍格子恰好一次。 Solution 最优的走法是遇到障碍或者边界就右转,否则直走。 走过一排格子相当于挪动边界线。 这两个结论仔细品味起来很挺有深度的。 然后暴力模拟就可以了,找障碍物的过程可以用 set 优化。 这题的坐标系好像有点奇怪,SB的我就这么搞反坐标WA了一发。然后忘记开longlong又WA了一发。 Code #include <bits/stdc++.h> using namespace std; #define int long long const int N = 100005; int n,m,k,t1,t2,t3,t4,lx,ly,ux,uy,dir,ans=1; set <int> sx[N],sy[N]; int FindIncX(int x,int y) { return min(ux,*sy[y].lower_bound(x)); } int FindDecX(int x,int y) { return max(lx,*(--sy[y].lower_bound(x))); } int

2019牛客国庆集训派对day3

落花浮王杯 提交于 2019-12-01 10:24:45
E. Grid 大意: 给定$n\cdot m$个点的图, 初始无边, $q$个操作, $(1,a,b)$表示第$a$列到第$b$列全连起来, $(2,a,b)$表示把第$a$行到第$b$行全连起来, 每次操作后输出连通块个数. 只有连接操作, 没有撤销, 那么直接用$set$暴力模拟即可. 还有一种线段树做法, 设一共$a$行连通, $b$列连通, 可以发现答案是$nm-a(m-1)-b(n-1)+max(0,(a-1)(b-1))$, 这样很容易用线段树维护, 并且可以支持删边. #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <cmath> #include <set> #include <map> #include <queue> #include <string> #include <cstring> #include <bitset> #include <functional> #include <random> #define REP(i,a,n) for(int i=a;i<=n;++i) #define PER(i,a,n) for(int i=n;i>=a;--i) #define hr putchar(10) #define pb

lower_bound upper_bound

↘锁芯ラ 提交于 2019-12-01 10:05:24
#include <iostream> // std::cout #include <algorithm> // std::lower_bound, std::upper_bound, std::sort #include <vector> // std::vector int main () { int myints[] = {10,20,30,30,20,10,10,20}; std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20 std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30 std::vector<int>::iterator low,up; low=std::lower_bound (v.begin(), v.end(), 20); // ^ up= std::upper_bound (v.begin(), v.end(), 20); // ^ std::cout << "lower_bound at position " << (low- v.begin()) << '\n'; std::cout << "upper_bound at position " << (up - v.begin()) << '\n'; return 0

2018 ccpc final

折月煮酒 提交于 2019-12-01 07:17:26
2018 CCPC FINAL kunkun全球后援队训练赛赛 A. 签到 笨比mwh wa了两发 #include <stdio.h> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #pragma GCC optimize(2) using namespace std; typedef long long ll; const int N = 1e5 + 5; int t, n, m, kas; struct node{ int d, t; }list[N]; bool cmp(node a, node b){ if (a.d == b.d) return a.t < b.t; return a.d < b.d; } int main() { // cin.tie(0); // cout.tie(0); // ios::sync_with_stdio(0); cin >> t; kas = 0; while (t--) { cin >> n >> m; for (int i = 0; i < n; ++i) cin >> list[i].d; for (int i = 0; i < n; ++i) cin >> list[i].t; sort(list, list + n,

题解 P1801 【黑匣子_NOI导刊2010提高(06)】

送分小仙女□ 提交于 2019-11-30 18:22:08
提供一种stl新的思路:vector (当然这是treap,fhq treap的简化版,清清爽爽的短代码,让您远离平衡树和对顶堆) 可采用vector在线,每次边读入GET指令边输出 ADD(x) :(插入值为x的数) 使用 insert()和lower_bound(),将某个值插入到它的下界 v.insert(lower_bound(v.begin(),v.end(),某个值),某个值); GET(i) :(输出当前vector里第i大的数) 直接输出v[i-1]因为vector是从0开始存的,v[i-1]即是vector的第i大 附上清爽崽代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define rep(i,a,b) for(ll i=a;i<=b;++i) #define dwn(i,a,b) for(ll i=a;i>=b;--i) template <typename T> inline void rd(T &x){//读入优化 x=0;char c=getchar();int f=0; while(!isdigit(c)){f|=c=='-';c=getchar();} while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar()

c++ STL里lower_bound()与upper_bound()的用法

◇◆丶佛笑我妖孽 提交于 2019-11-29 06:16:21
lower_bound()与upper_bound()是二分查找函数(用于有序区间) 用法: 说明:a[]:有序数组 用法1: * lower_bound ( a + 1 , a + 1 + n , num ) = num ; //将a[]中第一个≥num的值改为num 用法2: int k = * lower_bound ( a + 1 , a + 1 + n , num ) ; //k=a[]从1~n中第一个≥num的值 用法3: int k = lower_bound ( a + 1 , a + 1 + n , num ) - a ; //k=a[]从1~n中第一个≥num的值的位置 来源: https://blog.csdn.net/weixin_45485187/article/details/100537150