模拟赛 ——“与” 小象涂色 行动!行动!

屠龙宝刀点击就送

T1 “与”

挂分记录

  • 这题为什么看了半天才有思路啊

  • 文件名and->add(据统计,我机房OIer普遍打错此题文件,要么没打,要么ans,要么abs(

  • 最小是(1<<0),不是(1<<1)呀 —— 20pts爽吧

AC现场

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;

int n,ans,qvq,a[300005],able[300005];

vector<int> buc[31];

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		for(int j=0;j<=30;j++)
			if(a[i]&(1<<j))
				buc[j].push_back(i);
	}
	for(int i=30;i>=0;i--){
		int fuck=0;
		for(int j=0;j<buc[i].size();j++){
			if(able[buc[i][j]]!=qvq)continue;
			fuck++;
		}
		if(fuck>=2){
			ans+=(1<<i);
			qvq++;
			for(int j=0;j<buc[i].size();j++)able[buc[i][j]]++;
		}
	}
	printf("%d\n",ans);
}

T2 小象涂色

其实

算是这辈子第一次写期望题吧

挂分记录

不知道要用概率推,直接用上次染色的期望颜色转移的,还瞎推了柿子,蜜汁抱灵

过了样例的抱灵代码

#include<cstdio>
#include<cstring>
#include<iostream>
using std::cout;
using std::endl;

int T,n,c,k,tot[105],add;

double ans,fuck,f[105];

int main(){
	scanf("%d",&T);
	while(T--){
		memset(tot,0,sizeof(tot));
		scanf("%d%d%d",&n,&c,&k);
		ans=0;fuck=1.0/c;add=0;
		for(int i=1;i<=c;i++)add+=i%c;
		for(int i=1;i<=k;i++){
			int l,r;
		//	cout<<"qvq"<<i<<' '<<c<<' '<<add<<endl;
			scanf("%d%d",&l,&r);
			for(int j=l;j<=r;j++)tot[j]++;
		}
		for(int i=1;i<=n;i++){
			memset(f,0,sizeof(f));
			f[tot[i]]=1;
			for(int j=tot[i]-1;j>=0;j--){
				f[j]=0.5*f[j+1]+0.5*fuck*f[j+1]*add;
			//	cout<<"emm"<<i<<' '<<j<<' '<<f[j]<<endl;
			//	cout<<"a"<<fuck<<' '<<f[j+1]<<' '<<add<<endl;
			}
			ans+=f[0];
		}
		printf("%.9lf\n",ans);
	}
}

AC现场

#include<cstdio>
#include<cstring>
#include<iostream>
using std::cout;
using std::endl;

int T,n,c,k,tot[105],add;

double ans,fuck,f[105][105];

int main(){
	scanf("%d",&T);
	while(T--){
		memset(tot,0,sizeof(tot));
		memset(f,0,sizeof(f));
		scanf("%d%d%d",&n,&c,&k);
		f[0][1]=1;ans=0;fuck=1.0/c;
		for(int i=1;i<=c;i++)add+=i%c;
		for(int i=1;i<=k;i++){
			int l,r;
		//	cout<<"qvq"<<i<<' '<<c<<' '<<add<<endl;
			scanf("%d%d",&l,&r);
			for(int j=l;j<=r;j++)tot[j]++;
		}
		for(int i=1;i<=k;i++){
			for(int j=0;j<c;j++){
				f[i][j]+=0.5*f[i-1][j];
				for(int k=0;k<c;k++)
					f[i][j*k%c]+=0.5*fuck*f[i-1][j];
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=0;j<c;j++)
				ans+=j*f[tot[i]][j];
		}
		printf("%.9lf\n",ans);
	}
}

T3 行动!行动!

吐槽

  • 尼玛的,卡spfa?

  • 正解是spfa优化?不存在的!Dijkstra盘他

  • 飞行路线原题?连样例都一样?

  • 尼玛的?laoj评测姬有毒?

long long ans=21474836477777777——CE(@Pride205 +1

long long ans=21474836477777777ll——AC

你ll尼玛呢?

收获

这辈子第一次会写飞行路线的二维dijkstra写法

Spfa现场

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define int long long
using namespace std;

int n,m,k,s,t,ans=21474836477777777,cnt,head[10005];

int dis[10005][15],vis[10005][15];

struct edge{
	int v,w,next;
}e[100005];

inline void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}

struct node{
	int u,t;
};

inline void spfa(){
	queue<node> q;
	dis[s][0]=0;
	q.push((node){s,0});
	while(!q.empty()){
		node u=q.front();
		q.pop();
		vis[u.u][u.t]=0;
		for(int i=head[u.u];i!=-1;i=e[i].next){
			int v=e[i].v;
			if(dis[v][u.t]>dis[u.u][u.t]+e[i].w){
				dis[v][u.t]=dis[u.u][u.t]+e[i].w;
				q.push((node){v,u.t});
			}
			if(u.t==k)continue;
			if(dis[v][u.t+1]>dis[u.u][u.t]){
				dis[v][u.t+1]=dis[u.u][u.t];
				q.push((node){v,u.t+1});
			}
		}
	}
}

signed main(){
	memset(head,-1,sizeof(head));
	memset(dis,0x3f,sizeof(dis));
	scanf("%I64d%I64d%I64d%I64d%I64d",&n,&m,&k,&s,&t);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%I64d%I64d%I64d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	spfa();
	for(int i=0;i<=k;i++)
		ans=min(ans,dis[t][i]);
	printf("%I64d\n",ans);
}

AC现场

#include<cstdio>
#include<cstring>
#include<queue>
#include<iostream>
#define int long long
using namespace std;

int n,m,k,s,t,ans=21474836477777777ll,cnt,head[10005];

int dis[10005][15],vis[10005][15];

struct edge{
	int v,w,next;
}e[100005];

inline void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].next=head[u];
	head[u]=cnt;
}

struct node{
	int u,t,dis;
	bool operator<(const node &x)const{return x.dis<dis;}		
};

inline void dijkstra(){
	priority_queue<node> q;
	dis[s][0]=0;
	q.push((node){s,0,0});
	while(!q.empty()){
		node u=q.top();
		q.pop();
		if(vis[u.u][u.t])continue;
		vis[u.u][u.t]=1;
		for(int i=head[u.u];i!=-1;i=e[i].next){
			int v=e[i].v;
			if(dis[v][u.t]>dis[u.u][u.t]+e[i].w){
				dis[v][u.t]=dis[u.u][u.t]+e[i].w;
				q.push((node){v,u.t,dis[v][u.t]});
			}
			if(u.t==k)continue;
			if(dis[v][u.t+1]>dis[u.u][u.t]){
				dis[v][u.t+1]=dis[u.u][u.t];
				q.push((node){v,u.t+1,dis[v][u.t+1]});
			}	
		}		
	}		
}

signed main(){
	memset(head,-1,sizeof(head));
	memset(dis,0x3f,sizeof(dis));
	scanf("%I64d%I64d%I64d%I64d%I64d",&n,&m,&k,&s,&t);
	for(int i=1;i<=m;i++){
		int a,b,c;
		scanf("%I64d%I64d%I64d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	dijkstra();
	for(int i=0;i<=k;i++)
		ans=min(ans,dis[t][i]);
	printf("%I64d\n",ans);
}
posted @ 2019-11-13 20:39  Y15BeTa  阅读(155)  评论(0编辑  收藏  举报