queue
一些重要的函数 qwq
q.empty() //判断队列是否为空(为空返回true)
q.front() //返回队首元素
q.pop() //弹出队首元素
q.push(x) //将x插入队末
q.size() //返回q的大小
q.back() //返回队末元素
priority_queue(大根堆)
一些重要的函数 qwq
q.top() //返回队首元素
q.empty() //判断队列是否为空(为空返回true)
q.pop() //弹出队首元素
q.push(x) //将x插入队末
q.size() //返回q的大小
如果要小根堆咋办 qwq~ ~~~~~~~~~~
先搞一道水题
合并果子
法一:
julao教的入门方法(网上好像没怎么看到?),把数取相反数压到优先队列里,取出来用的时候再取一次相反数。
不过负数比较容易出错 qwq
#include<bits/stdc++.h>
using namespace std;
int a[20010],n,i,x,y,tot=0;
priority_queue <int> q;
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
a[i]=-a[i];
q.push (a[i]);
}
while(!q.empty()){
x=q.top();
q.pop();
if(q.empty())break;
y=q.top();
q.pop();
q.push(x+y);
tot+=x+y;
}
tot=-tot;
cout<<tot;
return 0;
}
法二:
定义的时候用 priority_queue<int,vector,greater > q; 就可以了呀 qwq
(如果将greater改成less就变成大根堆了——可是priority_queue本来就是大根堆啊 QAQ)
#include<bits/stdc++.h>
using namespace std;
int a[20010],n,i,x,y,tot=0;
priority_queue<int,vector<int>,greater<int> > q;
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
q.push (a[i]);
}
while(!q.empty()){
x=q.top();
q.pop();
if(q.empty())break;
y=q.top();
q.pop();
q.push(x+y);
tot+=x+y;
}
cout<<tot;
return 0;
}
法三:
简单,粗暴,好处多多(可以处理结构体咩),直接重载运算符(可是我不会写呀,qwq)
#include<bits/stdc++.h>
using namespace std;
int a[20010],n,i,x,y,tot=0;
struct node{
bool operator () (int &a,int &b){
return a>b;
}
};//重载运算符
priority_queue<int,vector<int>,node> q;
int main(){
cin>>n;
for(i=1;i<=n;i++){
cin>>a[i];
q.push (a[i]);
}
while(!q.empty()){
x=q.top();
q.pop();
if(q.empty())break;
y=q.top();
q.pop();
q.push(x+y);
tot+=x+y;
}
cout<<tot;
return 0;
}
bitset
同上,先来一波基础操作总结:
a.size() //返回大小(位数)
a.count() //返回1的个数
a.any() //返回是否有1
a.none() //返回是否没有1
a.set() //将每一位都变成1
a.set(x) //将第x+1位变成1
a.set(x,y) //将第x+1位变成y
a.reset() //将每一位都变成0
a.reset(x) //将第x+1位变成0
a.flip() //全部取反
a.flip(x) //将x+1位取反
a.to_ulong() //返回它转换为unsigned long的结果,如果超出范围则报错
a.to_ullong()// 返回它转换为unsigned long long的结果,如果超出范围则报错
a.to_string() //返回它转换为string的结果
所以为什么不搞个例题呢
#include<bits/stdc++.h>
using namespace std;
int n,m,q,x,y,l,lg;
bitset <110> ans,t,f[110][31];
int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1; ch=getchar();}
while(ch<='9'&&ch>='0') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main(){
n=read();m=read();
for(int i=1;i<=m;i++) x=read(),y=read(),f[x][0][y]=1;
for(int j=0;j<=29;j++)
for(int i=1;i<=n;i++)
for(int k=1;k<=n;k++)
if(f[i][j][k]) f[i][j+1]|=f[k][j];
q=read();
while(q--){
l=read(),x=read(),y=read();
lg=0;
while(1<<(lg+1)<=l) lg++;
ans.reset();
ans[x]=1;
for(int i=0;i<=lg;i++){
if((l>>i)&1){
t=ans;ans.reset();
for(int j=1;j<=n;j++)
if(t[j]) ans=ans|f[j][i];
}
}
ans[y]?printf("YES\n"):printf("NO\n");
}
return 0;
}
既然已经搞了一题了,为什么不再搞一题呢
#include<bits/stdc++.h>
using namespace std;
int n,m,f[205][205],u,v;
bool sig,yon[205];
bitset<205> p[205][205];
//p[i][j]即现有状态下k是不是i到j最短路上的关键城市;
//若找到了一条更短的最短路,关键城市是两段最短路上的关键城市的交集;
//若找的路径和现有最短路一样长,则取并集
int read(){
int x=0,f=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-') f=-1; ch=getchar();}
while(ch<='9'&&ch>='0') {x=x*10+ch-'0'; ch=getchar();}
return x*f;
}
int main(){
n=read(); m=read();
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++) f[i][i]=0;
for(int i=1;i<=m;i++){
u=read(),v=read(),f[u][v]=read();
f[v][u]=f[u][v];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
p[i][j][i]=1,p[i][j][j]=1;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(f[i][j]>f[i][k]+f[j][k]){
f[i][j]=f[i][k]+f[k][j];
p[i][j]=p[i][k]|p[k][j];
}
else if(f[i][j]==f[i][k]+f[j][k]) p[i][j]=p[i][j]&(p[i][k]|p[k][j]);
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(i!=k&&j!=k)
if(p[i][j][k])
yon[k]=1;
for(int i=1;i<=n;i++){
if(yon[i]){
sig=1;
printf("%d ",i);
}
}
if(sig==0) printf("No important cities.");
return 0;
}
vector(留坑拒填)
map(我不会!!!!!)
RT