--- title: "电影" created: 2025-11-28 tags: - 算法 --- # 电影 ## 题目 [电影](https://www.acwing.com/problem/content/description/105/) ![[image-7872f05c.png]] ## 思路分析 和模版题基本一致 甚至更简单 找到所有要用的语言的下标 记录在alls里面去 对alls进行排序去重 得到一个新的缩小了的数组 这个数组自然有一个新的下标 我们要用find使得原离散数组和压缩数组和操作用的数组联系起来 (find可以在压缩数组里面找到离散数组的某个值 返回一个压缩数组里的下标 利用这个下标在操作用的数组里面进行一系列操作) 科学家会的语言可能重复 那其实就是插入操作 每一个科学家就做一次对应下标内容的++ 对于第i场电影 有两个属性b c 若看b 其实就是find(b) 得到的下标 看该语言会的人有多少个 如果更多就更新一下 若看c 也是同理 会b语言的更多要优先于c 因为b是很高兴 c是比较高兴 所以只有当b找到的与记录的最大值相等时 才看c 不断去更新电影号即可 ## 代码实现 ```cpp #include using namespace std; const int N=600010; int a[N],b[N],c[N]; int n,m; vector alls,add; int find(int x) { int l=0,r=alls.size()-1; while(l>1; if(alls[mid]>=x) r=mid; else l=mid+1; } return r; // return lower_bound(alls.begin(),alls.end(),x)-alls.begin(); } int main() { cin>>n; while(n--){ int a;cin>>a; alls.push_back(a); add.push_back(a); } cin>>m; for(int i=0;i>b[i]; alls.push_back(b[i]); } for(int i=0;i>c[i]; alls.push_back(c[i]); } sort(alls.begin(),alls.end()); alls.erase(unique(alls.begin(),alls.end()),alls.end()); for(auto i:add){ a[find(i)]++; } int res=0,Like=0,like=0; for(int i=0;i