目录
思路:
- 设左右指针 j,i;用 i 遍历数组,对【j,i】范围路径数值出现次数记录
- 若次数大于1,则将 j 向前走,直到范围中没有重复数字
- 对每一步记录,即比较每个范围的长度,取最大值
- #include
- using namespace std;
- int a[100010],s[100010];
- int main()
- {
- int n,j=0,res=0;
- cin>>n;
- for(int i=0;i
- {
- cin>>a[i];
- s[a[i]]++;
- while(s[a[i]]>1)
- {
- s[a[j]]--;
- j++;
- }
- res=max(res,i-j+1);
- }
- cout<
-
- return 0;
- }
二进制中1的个数
思路:
位运算(& | ~ ^ >> <<)_NO.-LL的博客-CSDN博客
利用模板
while(b) b=b&(b-1); //二进制中有多少个1就循环多少次
- #include
- #include
- #include
- #include
- using namespace std;
- const int N=1e5+10;
-
- int cnt(int b)
- {
- int res=0;
- while(b)
- {
- b=b&(b-1);
- res++;
- }
- return res;
- }
-
- int main()
- {
- int n,b;
- cin>>n;
- for(int i=0;i
- {
- cin>>b;
- cout<<cnt(b)<<" ";
- }
- return 0;
- }
区间和
思路:
1、设vector > add 用于存储下标x 与要加的值c ,query用于记录要求和的区间【l,r】
2、将下标与区间(x,l,r)都存入alls中,准备离散化
3、对alls排序并去重
alls.erase(unique(alls.begin(), alls.end()), alls.end());
unique作用:把alls重复元素删除,返回新数组的最后一个位置
erase作用:把后面的元素删除,只留下去重元素
4、设计find函数查找x,并一一映射到数组a中
5、用前缀和就是区间和
6、通过遍历query,完成求区间[l,r]的和。
为什么不直接用前缀和呢?
- 因为数据为-1e9到1e9,没办法开这么大的数组,且x下标存在负值无法存储
- #include
- #include
- #include
-
- using namespace std;
-
- typedef pair<int, int> PII;
-
- const int N = 300010;
-
- int n, m;
- int a[N], s[N];
-
- vector<int> alls;
- vector
add, query; -
- int find(int x) //找到大于等于x的第一个值
- {
- int l = 0, r = alls.size() - 1;
- while (l < r)
- {
- int mid = l + r >> 1;
- if (alls[mid] >= x) r = mid;
- else l = mid + 1;
- }
- return r + 1; //让下标从1开始,方便前缀和计算
- }
-
- /*int find(int x)
- {
- return lower_bound(alls.begin(),alls.end(),x)-alls.begin() +1;
- }*/
-
- int main()
- {
- cin >> n >> m;
- for (int i = 0; i < n; i ++ )
- {
- int x, c;
- cin >> x >> c;
- add.push_back({x, c});
-
- alls.push_back(x);
- }
-
- for (int i = 0; i < m; i ++ )
- {
- int l, r;
- cin >> l >> r;
- query.push_back({l, r});
-
- alls.push_back(l);
- alls.push_back(r);
- }
-
- // 去重
- sort(alls.begin(), alls.end());
- alls.erase(unique(alls.begin(), alls.end()), alls.end());
-
- // 处理插入
- for (auto item : add)
- {
- int x = find(item.first);
- a[x] += item.second;
- }
-
- // 预处理前缀和
- for (int i = 1; i <= alls.size(); i ++ ) s[i] = s[i - 1] + a[i];
-
- // 处理询问
- for (auto item : query)
- {
- int l = find(item.first), r = find(item.second);
- cout << s[r] - s[l - 1] << endl;
- }
-
- return 0;
- }
区间合并
思路:
- 记录区间左端点st与右端点ed,将区间按左端点排序
- 因为左端点有序,只需要判断该区间左端点与前一个区间右端位置,即可确定是否合并
- #include
- #include
- #include
-
- using namespace std;
-
- typedef pair<int, int> PII;
-
- void merge(vector
&segs) - {
- vector
res; -
- sort(segs.begin(), segs.end()); //将左边界排序
-
- int st = -2e9, ed = -2e9;
- for (auto seg : segs)
- if (ed < seg.first) //不重叠,取新区间
- {
- if (st != -2e9) res.push_back({st, ed}); //不是第一次,插入新区间
- st = seg.first, ed = seg.second;
- }
- else ed = max(ed, seg.second); //有重叠,取交集
-
- if (st != -2e9) res.push_back({st, ed}); //循环结束,对最后一个区间插入
-
- segs = res;
- }
-
- int main()
- {
- int n;
- scanf("%d", &n);
-
- vector
segs; - for (int i = 0; i < n; i ++ )
- {
- int l, r;
- scanf("%d%d", &l, &r);
- segs.push_back({l, r});
- }
-
- merge(segs);
-
- cout << segs.size() << endl;
-
- return 0;
- }
-
-
相关阅读:
远程服务器Ubuntu 18.04安装VNC远程桌面
肝了一周的八万字Redis实战篇
阿里P8大牛发布《亿级流量并发手册》GitHub下载榜飙升至第一
GitHub配置SSH Keys步骤
基于html5开发的Win12网页版,抢先体验
欧科云链:成本与规模之辨——合规科技如何赋能香港Web3生态?
Python基础——分支与循环
Python 鼠标模拟
iOS 提高Xcode运行速度
【dbeaver】win环境的kerberos认证和Clouders集群中Kerberos认证使用Dbeaver连接Hive和Phoenix
-
原文地址:https://blog.csdn.net/qq_61386381/article/details/126494394