胡乱bb STL

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值