「CF670C」 Cinema 解題報告
阿新 • • 發佈:2018-12-17
題面
傳送門
思路:
離散化、hash
對於這樣一個明顯的統計排序的題目,當然輕而易舉啦~
但是!看!語言的編號 a陣列和 b陣列的值最大在$10^9$的級別,所以開個陣列來存———That's impossible!
所以我們可以用上離散化(也就是hash)
離散化,我們有兩種寫法
第一種是自己手碼程式碼
先排序,然後去重,接著用二分一一對應,達到離散化的目的
板子:
sort(b+1,b+n+1,cmp); n=unique(b+1,b+n+1)-b-1; for(i=1;i<=n;i++) a[i]=lower_bound(b+1,b+n+1,a[i])-b;
第二種是使用STL庫的map
標頭檔案:#include <map>
定義方式:map<type,type> p;
表示將前一種type對映到後一種type
其中的型別可以很多,比如double,string,int,bool等基本型別,也包括pair這種
如map<pair<int,int>,bool>p;
允許的
操作:一般用陣列的形式,直接p[x]
訪問、寫入
PS:但是map的速度比較慢,想進一步提高可以使用unordered_map
此處不才不做講解,具體詳見洛穀日報
Code:
#include<bits/stdc++.h> using namespace std; int n,m; int b; int a[200010]; map<int,int> p; int cur,res,ans; int read() { int s=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { s=(s<<1)+(s<<3)+c-'0'; c=getchar(); } return s; } int main() { int i; int x; n=read(); for(i=1;i<=n;i++) p[read()]++;//科(珂)學家們能聽懂的語言 m=read(); for(i=1;i<=m;i++)//電影配音 a[i]=read(); b=p[read()]; ans=1;//一開始預設第一種是答案 res=p[a[1]]; cur=b; for(i=2;i<=m;i++) { b=p[read()]; x=p[a[i]]; if(x>=res)//比較聽的懂配音,看的懂字幕的人數 { if(x>res) { res=x; cur=b; ans=i; } else if(cur<b) { ans=i; cur=b; } } } printf("%d",ans);//跑過138個點!人憔悴~ return 0; }