170902模拟赛


题目名称


“与”


小象涂色


行动!行动!


输入文件


and.in


elephant.in


move.in


输出文件


and.out


elephant.in


move.in


时间限制


1s


1s


1s


空间限制


64MB


128MB


128MB

测评环境:windows XP

比赛时间:3小时

得分情况

蒟蒻我才得了180分,其他大佬肯定都AK了;

T1,20min正解思路10min写完,A掉了;

T2,一眼概率DP,然而根本看不懂题目什么意思;

T3,思路纠结了近1h,然后30min写代码,然后数组开小了,这样80,其实开够的话也还会T一个点;

“与”

(and.pas/.c/.cpp)

时间限制:1s;空间限制64MB

题目描述:

给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i<j<=n)使Ai“与”Aj最大。

Ps:“与”表示位运算and,在c++中表示为&。

输入描述:

第一行为n。接下来n行,一行一个数字表示Ai。

输出描述:

输出最大的Ai“与”Aj的结果。

样例输入:

3

8

10

2

样例输出:

8

样例解释:

8 and 10 = 8

8 and 2 = 0

10 and 2 = 2

数据范围:

20%的数据保证n<=5000

100%的数据保证 n<=3*10^5,0<=Ai<=10^9

思路

从高位开始筛选;

如果有至少两个数该位(f)存在,则ans+=f并且筛去&f==0的数;

因为某位后所有位的数的和不可能大于本位的数,所以可以这样做;

代码实现

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=3e5+10;
 5 inline int max_(int x,int y){return x>y?x:y;}
 6 int n,f,big,now,ans;
 7 int s[maxn];
 8 bool comp(int a,int b){return (a&f)>(b&f);}
 9 int main(){
10     freopen("and.in","r",stdin);
11     freopen("and.out","w",stdout);
12     scanf("%d",&n);
13     for(int i=1;i<=n;i++){
14         scanf("%d",&s[i]);
15         big=max_(big,s[i]);
16     }
17     for(f=1;f<=big;f<<=1);
18     for(f>>=1;f;f>>=1){
19         sort(s+1,s+n+1,comp);
20         for(now=1;s[now]&f&&now<=n;now++);
21         if(now>2){ans+=f,n=now-1;}
22     }
23     printf("%d\n",ans);
24     return 0;
25 }

小象涂色

(elephant.pas/.c/.cpp)

时间限制:1s,空间限制128MB

题目描述:

小象喜欢为箱子涂色。小象现在有c种颜色,编号为0~c-1;还有n个箱子,编号为1~n,最开始每个箱子的颜色为1。小象涂色时喜欢遵循灵感:它将箱子按编号排成一排,每次涂色时,它随机选择[L,R]这个区间里的一些箱子(不选看做选0个),为之涂上随机一种颜色。若一个颜色为a的箱子被涂上b色,那么这个箱子的颜色会变成(a*b)mod c。请问在k次涂色后,所有箱子颜色的编号和期望为多少?

输入描述:

第一行为T,表示有T组测试数据。

对于每组数据,第一行为三个整数n,c,k。

接下来k行,每行两个整数Li,Ri,表示第i个操作的L和R。

输出描述:

对于每组测试数据,输出所有箱子颜色编号和的期望值,结果保留9位小数。

样例输入:

3

3 2 2

2 2

1 3

1 3 1

1 1

5 2 2

3 4

2 4

样例输出:

2.062500000

1.000000000

3.875000000

数据范围:

40%的数据1 <= T <= 5,1 <= n, k <= 15,2 <= c <= 20

100%的数据满足1 <= T <= 10,1 <= n, k <= 50,2 <= c <= 100,1 <= Li <= Ri <= n

思路

代码实现

行动!行动!

(move.pas/.c/.cpp)

时间限制:1s;空间限制:128MB

题目描述:

大CX国的大兵Jack接到一项任务:敌方占领了n座城市(编号0~n-1),有些城市之间有双向道路相连。Jack需要空降在一个城市S,并徒步沿那些道路移动到T城市。虽然Jack每从一个城市到另一个城市都会受伤流血,但大CX国毕竟有着“过硬”的军事实力,它不仅已经算出Jack在每条道路上会损失的血量,还给Jack提供了k个“简易急救包”,一个包可以让Jack在一条路上的流血量为0。Jack想知道自己最少会流多少血,不过他毕竟是无脑的大兵,需要你的帮助。

输入描述:

第一行有三个整数n,m,k,分别表示城市数,道路数和急救包个数。

第二行有两个整数,S,T。分别表示Jack空降到的城市编号和最终要到的城市。

接下来有m行,每行三个整数a,b,c,表示城市a与城市b之间有一条双向道路。

输出描述:

Jack最少要流的血量。

样例输入:

5 6 1

0 3

3 4 5

0 1 5

0 2 100

1 2 5

2 4 5

2 4 3

样例输出:

8

数据范围:

对于30%的数据,2<=n<=50,1<=m<=300,k=0;

对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;

对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.

思路

d[i][j]表示使用j个医疗包的情况下,跑到i城市的流血量;

然后跑一边SPFA,求的最短路即可;

最重要的是,这个题需要优化,,,使用SLF方案优化SPFA;

代码实现

 1 #include<cstdio>
 2 #include<cstring>
 3 const int maxn=1e4+10;
 4 const int maxm=1e5+10;
 5 inline int min_(int x,int y){return x<y?x:y;}
 6 int n,m,k,s,t;
 7 int h[maxn],hs;
 8 int et[maxm],en[maxm],ew[maxm];
 9 int d[maxn][12];
10 void add(){
11     int a,b,c;
12     scanf("%d%d%d",&a,&b,&c);
13     hs++,et[hs]=b,ew[hs]=c,en[hs]=h[a],h[a]=hs;
14     hs++,et[hs]=a,ew[hs]=c,en[hs]=h[b],h[b]=hs;
15 }
16 int q[maxm][2],head,tail;
17 bool v[maxn][12];
18 void SPFA(){
19     memset(d,0x7f,sizeof(d));
20     d[s][0]=0,v[s][0]=1;
21     q[tail][0]=s,q[tail][1]=0,tail++;
22     int a,b;
23     while(head!=tail){
24         a=q[head][0];
25         b=q[head][1];
26         v[a][b]=0;
27         head=(head+1)%maxm;
28         for(int i=h[a];i;i=en[i]){
29             if(0ll+ew[i]+d[a][b]<0ll+d[et[i]][b]){
30                 d[et[i]][b]=ew[i]+d[a][b];
31                 if(!v[et[i]][b]){
32                     v[et[i]][b]=1;
33                     if(d[et[i]][b]<d[q[head][0]][q[head][1]]){
34                         head=(head+maxm-1)%maxm;
35                         q[head][0]=et[i];
36                         q[head][1]=b;
37                     }
38                     else{
39                         q[tail][0]=et[i];
40                         q[tail][1]=b;
41                         tail=(tail+1)%maxm;
42                     }
43                 }
44             }
45             if(b<k&&d[a][b]<d[et[i]][b+1]){
46                 d[et[i]][b+1]=d[a][b];
47                 if(!v[et[i]][b+1]){
48                     v[et[i]][b+1]=1;
49                     if(d[et[i]][b+1]<d[q[head][0]][q[head][1]]){
50                         head=(head+maxm-1)%maxm;
51                         q[head][0]=et[i];
52                         q[head][1]=b+1;
53                     }
54                     else{
55                         q[tail][0]=et[i];
56                         q[tail][1]=b+1;
57                         tail=(tail+1)%maxm;
58                     }
59                 }
60             }
61         }
62     }
63 }
64 int main(){
65     freopen("move.in","r",stdin);
66     freopen("move.out","w",stdout);
67     scanf("%d%d%d",&n,&m,&k);
68     scanf("%d%d",&s,&t);
69     for(int i=1;i<=m;i++) add();
70     SPFA();
71     printf("%d\n",d[t][k]);
72     return 0;
73 }
时间: 2024-10-03 00:48:30

170902模拟赛的相关文章

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y):

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

2014-9-9 NOIP模拟赛

东方幻想乡系列模拟赛Stage 1命题 Nettle审题 Barty ccy1991911 FlanS39 Wagner T2 高精除高精,从来没写过,不知道怎么写,我就用大数减小数ans次,果断超时. T4 Tarjan的板子题,好久没写,中间出现了一些小错误 ①是尽管有双向边,Tarjan函数中也不必排除双向边 ②Tarjan算法有时候不能一步完成,需要做最多n次,用循环解决 ③问题是关于这个题目的虽然输入n代表有n个点,但是下面的连边中有些点根本没出现过,所以设一个数组记录有效点. Pro

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long

20161027模拟赛解题报告

20161027模拟赛解题报告 By shenben T1 数学题 模拟即可. 注意开long long T2 技巧题 图片为本题第一张图.(无奈,图传不上来) 首先第一问图中的“Y 字形”的数量,这么简单,在此不细讲. 详见代码 O(n)累加一下就好了 主要说说第二问怎么搞 预处理 每个点分别与其他那些点相连 权值为第1,2,3大(若没有2,3大,就忽略).记录一下权值与对应的点的标号.目的是方便下面的判断. 枚举入度>=3的点,即点B(有多个) 再枚举点B相连的D点(不是点A,C). Ste

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况