首页 > TAG信息列表 > 画展

逛画展

逛画展 博览馆正在展出由世上最佳的 M 位画家所画的图画。 wangjy 想到博览馆去看这几位大师的作品。 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a 和 b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票的价钱就是一张图画

逛画展(二分+队列)

题目: 见https://www.luogu.com.cn/problem/P1638 思路: 我以为我这么做会超时来着,没想到ac了,具体思路就是:为了满足题目要求即花最少的钱,那么我们就二分区间长度,如果在该长度下满足题意,那么就缩短长度,反之就增加长度,至于如何判断是否满足呢,可以想象一个定长的窗口从

P1638 逛画展(尺取法)

https://www.luogu.com.cn/problem/P1638 #include <bits/stdc++.h> using namespace std; #define int long long const int maxn = 1e6 + 10; int n,m; int a[maxn],b[maxn]; int l = 1, r= 1; int ans = maxn,k = 1; int ll,rr; signed main(){ //freopen("

逛画展(单调队列)

这么简单的我都想不出来 思路: 开一个vis[]标记在区间[l,r]中已经出现的画的数量,当每个画vis[i]==1那么看到的画的数量++,左端如果画的数量>1那么向左移动, 右端不断标记然后加入队列中,当 画的数量=画家的数量 记录区间端点值 #include <iostream> using namespace std; con

P1638 逛画展

  显然数据只能nlogn以下。   其实O(n)就能做。   对于一个数,我们维护它最后出现的位置p [ ] 。那么对于L~R(假设已经达到m种画都有),R+1时,至少一个数的p会被更新。那么如果这个左端点在这个区间中还有一个,即 L < p [ a [ L ] ] ,那么这个L删掉是没有影响的,我们就让L++;否则L不变,

P1638 逛画展(直尺法)

这道题是直尺法的模板题:    #include<iostream>using namespace std;const int maxn = 1e6 + 5;const int M = 2e3 + 5;int n, m, a[maxn], vis[M];int main(){ cin >> n >> m; for (int i = 0; i < n; ++i)cin >> a[i]; int st = 0, en = 0, num