当天心情不太好,后面补上。
A:比较重要的string的sort运用+二分(数组模拟会很麻烦,考试的时候不知道什么原因卡了)
B:dijkstra变种
D:素数筛+因数分解,桶的妙用,1e8的数1e4内质数除完后一定剩下质数。最后map遍历很好用
E:水题
F:思维题
H:BFS
I:最小生成树
M:大水
【L带错榜了】
A:Scrambled Letters
题目:给你n字符串,字符串的字母顺序可以随意改,让你求出每个字符串在字符串序列中可以排到的最前位置和最后位置。
string妙用(以前不会begin,end)
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int N=2e5+5;
string slow[N],shigh[N];
string sl[N],sh[N];
string s[N];
bool cmp(char a,char b){
return a>b;
}
void work(){
int n;cin>>n;
rep(i,1,n){
cin>>s[i];
slow[i]=shigh[i]=s[i];
sort(slow[i].begin(),slow[i].end());
sort(shigh[i].begin(),shigh[i].end(),cmp);
sl[i]=slow[i];
sh[i]=shigh[i];
}
sort(slow+1,slow+n+1);
sort(shigh+1,shigh+n+1);
rep(i,1,n){
cout<<lower_bound(shigh+1,shigh+n+1,sl[i])-shigh<<" "<<upper_bound(slow+1,slow+n+1,sh[i])-slow-1<<endl;
}
}
signed main(){
CIO;
work();
return 0;
}
D:Brave Cowcow Don't Afraid Difficulties
好像是原创(标题喜感)
题目:给你n个数(n<2000,ai<1e8),展示LCM后的的数的质因数,和每个质因数的数量。
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
using namespace std;
const int M=2e5+5;
int prime[M];
int c=0;
bool isVisit[M];
void oulashai(int n){
for(int i=2;i<=n;++i){
if(isVisit[i]==false)
prime[++c]=i;
for(int j=1;j<=c&&i*prime[j]<=n;++j){
isVisit[i*prime[j]]=true;
if (i%prime[j]==0)
break;
}
}
}
const int N=1e8+5;
int a[2005];
int t[N];
map<int,int> m;
void work(){
oulashai(100000);
int n;cin>>n;int cnt=0;
rep(i,1,n){
cin>>a[i];
rep(j,1,c){
cnt=0;
while (a[i]%prime[j]==0){
a[i]=a[i]/prime[j];
cnt++;
}
if (cnt!=0){
m[prime[j]]=max(m[prime[j]],cnt);
}
if (a[i]==1) break;
}
if (a[i]!=1){
m[a[i]]=max(m[a[i]],1ll);
}
}
map<int,int>::iterator it;
for (it=m.begin();it!=m.end();it++){
if (it->second!=0){
cout<<it->first<<" "<<it->second<<endl;
}
}
}
signed main(){
CIO;
work();
return 0;
}
B:Milk Routing
Dijstra变种题目(云里雾里)
#include <bits/stdc++.h>
#define int long long
#define CIO std::ios::sync_with_stdio(false)
#define rep(i, l, r) for (int i = l; i <= r; i++)
#define nep(i, r, l) for (int i = r; i >= l; i--)
#define inf 1e9+10
using namespace std;
const int N=1e3;
struct newt{
int to,next;
int limit,cost;
}e[N*N];
int n,cnt,m;
int vis[N],head[N],lj[N];
double dis[N];
priority_queue<pair<double,int> >q;
void add(int u,int v,int cost,int limit){
e[cnt].to=v;
e[cnt].limit=limit;
e[cnt].cost=cost;
e[cnt].next=head[u];
head[u]=cnt++;
}
signed main(){
memset(head,-1,sizeof(head));
cnt=0;int X;
cin>>n>>m>>X;
for(int i=1;i<=n;i++){
dis[i]=1e9+10;
lj[i]=1e9+10;
}
int a,b,cost,limit;
for(int i=1;i<=m;i++){
cin>>a>>b>>cost>>limit;
add(a,b,cost,limit);
add(b,a,cost,limit);
}
q.push({0,1});
dis[1]=0;
while(!q.empty()){
int now=q.top().second;
q.pop();
if(vis[now])continue;
vis[now]=1;double val;
for(int i=head[now];i!=-1;i=e[i].next){
int v=e[i].to,limit=e[i].limit,cost=e[i].cost;
if(limit>=lj[now]){
val=cost+double(X/lj[now]);
if(dis[v]>dis[now]+val-double(X/lj[now])){
dis[v]=dis[now]+val-double(X/lj[now]);
lj[v]=min(lj[now],limit);
q.push({-dis[v],v});
}
}
else{
val=cost+double(X/limit);
if(dis[v]>dis[now]+val-double(X/lj[now])){
dis[v]=dis[now]+val-double(X/lj[now]);
lj[v]=min(lj[now],limit);
q.push({-dis[v],v});
}
}
}
}
int ans=dis[n];
printf("%d\n",ans);
return 0;
}