用\(vector\)进行离散化:ios
#include<bits/stdc++.h> using namespace std; int n,a[10005],c[10005]; //c[]即储存离散化后的数 vector<int>v; inline int query(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;} int main() { scanf("%d",&n); for(register int i=1;i<=n;++i) scanf("%d",&a[i]),v.push_back(a[i]); sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for(int i=1;i<=n;++i) c[i]=query(a[i]); }
\(unique()\)是\(C++\)标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),因此使用前须要对数组进行排序(升序降序都可),具体使用以下:c++
对于长度为\(n\)数组\(a\),\(unique(a+1,a+n+1)\)返回的是迭代器,迭代器指向的是重复元素的首地址数组
若是非要获得不重元素的个数,能够用 \(unique(a+1,a+n+1) -a - 1\)表示;函数
下面举个栗子:this
好比这是去重前已排好序的数:spa
1 | 1 | 1 | 2 | 3 | 4 | 4 | 5 |
---|
那么unique一遍后,就会获得以下的数组:code
1 | 2 | 3 | 4 | 5 | 1 | 1 | 4 |
---|
从这里能够看出\(unique\)只是帮你整理出不重复元素,重复的元素仍是码放在后面。排序
因此这时就要用到\(erase\),删除\(a[v.begin()] - a[v.end()-1]\)get
而后就能够写一个\(query\)函数找出某个数被离散化成了什么it
\(m\)部电影和\(n\)个珂学家最多有\(m \times 2+ n\)种语言,咱们把全部涉及的语言\(push\)到\(v\)里面,排序并进行离散化,
而后开个\(2 \times m + n\)的数组去统计每一个人会的语言,
最后枚举每一个电影判断.
#include<cstdio> #include<vector> #include<algorithm> using namespace std; #define ll long long #define rg register struct ios{ template<typename TP> inline ios operator >> (TP &x) { TP f=1;x=0;rg char c=getchar(); for(;c>'9' || c<'0';c=getchar()) if(c=='-') f=-1; for(;c>='0' && c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^'0'); x*=f; return *this; } template<typename TP> inline ios operator << (TP x) { int top=0,s[66]; if(x<0) x=-x,putchar('-'); if(!x) putchar('0'); while(x) s[++top]=x%10+'0',x/=10; while(top) putchar(s[top--]); return *this; } inline ios operator << (char s) { putchar(s); return *this; } }io; const int N=2e5+5; int a[N],s[N],n,t,index[N*3],m,r[N],maxx=-1,maxy=-1,ans=1; //a[]表示电影语言,s[]表示电影字幕,r[]为人的语言,maxx是最多有几我的听得懂,maxy表示有几我的看得懂 //可能有没有人能听懂或看懂这样的数据,因此就把ans初值置为1 vector<int>v; inline int query(int x) {return lower_bound(v.begin(),v.end(),x)-v.begin()+1;} int main() { io>>n; for(rg int i=1;i<=n;++i) io>>r[i],v.push_back(r[i]); io>>m; for(rg int i=1;i<=m;++i) io>>a[i],v.push_back(a[i]); for(rg int i=1;i<=m;++i) io>>s[i],v.push_back(s[i]); sort(v.begin(),v.end()),v.erase(unique(v.begin(),v.end()),v.end()); for(rg int i=1;i<=n;++i) ++index[query(r[i])]; for(rg int i=1;i<=m;++i) { int x=query(a[i]),y=query(s[i]); if(index[x]>maxx) maxx=index[x],maxy=index[y],ans=i; //若是两部电影能听懂的人同样多,就比较能看懂字幕的人的多少 else if(index[x]==maxx&&index[y]>maxy) maxy=index[y],ans=i; } io<<ans; return 0; }