模拟赛 ——“与” 小象涂色 行动!行动!
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);
}