146. 序列 - AcWing题库(二叉堆+归纳--重点学习)
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,a[1005][2005],now[2005],ans[2005],i;
struct node{
int x,y;
bool last;
};
bool operator < (node as,node bs)
{
return a[i][as.y]+now[as.x]>a[i][bs.y]+now[bs.x];
}//理解
priority_queue<node>q,ti;
void init(){
cin>>m>>n;
for(i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
sort(a[i],a[i]+n);
if(i==0){
for(int j=0;j<n;j++){
now[j]=a[i][j];
}
}
}
}
int main(){
int t;
cin>>t;
while(t--){
init();
for(i=1;i<m;i++){
q=ti;
q.push(node{0,0,true});
for(int j=0;j<n;j++){
node k=q.top();
q.pop();
ans[j]=now[k.x]+a[i][k.y];
int w=k.x;
int e=k.y;
q.push(node{w,e+1,false});
if(k.last==true){
q.push(node{w+1,e,true});
}
}
for(int j=0;j<n;j++){
now[j]=ans[j];
}
}
for(int i=0;i<n;i++){
cout<<now[i]<<' ';
}
cout<<endl;
}
}
148. 合并果子 - AcWing题库(二叉堆+哈夫曼树--签到)
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define ll long long
priority_queue<ll,vector<ll>,greater<> >q;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
ll x;
cin>>x;
q.push(x);
}
ll ans=0;
while(q.size()>=2){
ll a=q.top();
q.pop();
ll b=q.top();
q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans<<endl;
}
164. 可达性统计 - AcWing题库(拓扑排序+bitset(待系统学习))
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<map>
#include<bitset>
using namespace std;
const int N=30004;
const int M=60004;
int idx,e[M],ne[M],h[N];
bitset<N> d[N];
int vis[N];
map<pair<int,int>,int>ma;
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
bitset<N> dfs(int x){
if(vis[x])return d[x];
vis[x]=true;
d[x][x]=1;
for(int i=h[x];i!=-1;i=ne[i]){
int j=e[i];
d[x]|=dfs(j);
}
return d[x];
}
int main(){
int n,m;
cin>>n>>m;
memset(h,-1,sizeof(h));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
if(ma[{a,b}]==0)add(a,b);
ma[{a,b}]=1;
}
for(int i=1;i<=n;i++){
cout<<dfs(i).count()<<endl;
}
}
4633. 学生和导师 - AcWing题库(排序+二分)
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<map>
#include<bitset>
#include<cstdio>
using namespace std;
const int N=100005;
int a[N];
int b[N];
int main(){
int t;
cin>>t;
for(int q=1;q<=t;q++){
printf("Case #%d: ",q);
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b,b+n);
for(int i=0;i<n;i++){
int l=0,r=n-1;
while(r>l){
int mid=(r+l)/2;
if(b[mid]>2*a[i]){
r=mid;
}
else l=mid+1;
}
if(b[l]>2*a[i])l--;
if(a[i]==b[l])l--;
if(l>=0&&a[i]*2>=b[l])printf("%d ",b[l]);
else printf("-1 ");
}
printf("\n");
}
}