2016.10.30 NOIP模拟赛 day2 PM 整理

满分:300分

直接全部爆零,真的是很坑啊!

10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784

T1:

题目中的难点就是每次折叠的点可能应经被覆盖了,我的做法是递归去推出它现在在哪个位置,不仅超时,而且答案错误。

也曾想过用数组去存下它当前的位置,但是被10^18的数据吓到了。

正解:并不是所有的坐标都有用,仅仅是那m个将要用到的点有用,所以每次折叠,就只对之后的有用的k个点进行更新,这样就行了。

时间复杂度O(m^2) 不会超时的。

 1 #include<iostream>
 2 using namespace std;
 3 #include<cstdio>
 4 #define M 3004
 5 typedef long long ll;
 6 ll pos[M];
 7 ll n,m;
 8 int main()
 9 {
10     freopen("he.in","r",stdin);
11     freopen("he.out","w",stdout);
12     cin>>n>>m;
13     for(int i=1;i<=m;++i)
14       cin>>pos[i];
15     ll l=0,r=n;
16     for(int i=1;i<=m;++i)
17     {
18         ll x=pos[i];
19         if(2*x>=(l+r))
20         {
21             r=x;
22             for(int j=i+1;j<=m;++j)
23               if(pos[j]>x) pos[j]=x+x-pos[j];
24         }
25         else
26         {
27             l=x;
28             for(int j=i+1;j<=m;++j)
29               if(pos[j]<x) pos[j]=x+x-pos[j];
30         }
31     }
32     cout<<r-l;
33     fclose(stdin);
34     fclose(stdout);
35     return 0;
36 }

T2:相信大牛们一眼就看出了这道题目用BSGS算法。注明:该算法我不会。

只会50分。

 1 /*
 2 扩展欧几里得模板打错了。
 3
 4 */
 5 #include<iostream>
 6 #include<cstdio>
 7 using namespace std;
 8 typedef long long ll;
 9 void exgcd(ll a,ll b,ll &x,ll &y,ll &gc)
10 {
11     if(!b)
12     {
13         x=1;y=0;
14         gc=a;
15         return;
16     }
17     exgcd(b,a%b,y,x,gc);
18     y-=(a/b)*x;
19 }
20 ll read()
21 {
22     ll ret=0,ff=1;
23     char s1=getchar();
24     while(s1<‘0‘||s1>‘9‘)
25     {
26         if(s1==‘-‘) ff=-1;
27         s1=getchar();
28     }
29     while(s1>=‘0‘&&s1<=‘9‘)
30     {
31         ret=ret*10+s1-‘0‘;
32         s1=getchar();
33     }
34     return ret*ff;
35
36 }
37 int main()
38 {
39     freopen("she.in","r",stdin);
40     freopen("she.out","w",stdout);
41     ll l,r,s,m;
42     int T;
43     scanf("%d",&T);
44     while(T--)
45     {
46         //cin>>m>>s>>l>>r;
47         m=read();s=read();l=read();
48         r=read();
49         if(l>=m)
50         {
51             printf("-1\n");
52             continue;
53         }
54         if(l==r)
55         {
56             ll x,y,gc;
57             exgcd(s,m,x,y,gc);
58             if(l%gc)
59             {
60                 cout<<-1<<endl;
61             }
62             else
63             {
64                 x=x*l/gc;
65                 ll m1=m/gc;
66                 x=(x%m1+m1)%m1;
67                 if(x==0) x+=m1;
68                 cout<<x<<endl;
69              }
70             continue;
71         }
72         bool flag=false;
73         for(int x=1;x<=1000000;++x)
74         {
75             ll res=(s%m*x%m)%m;
76             if(res>=l&&res<=r)
77             {
78                 printf("%d\n",x);
79                 flag=true;
80                 break;
81             }
82         }
83         if(flag) continue;
84         printf("-1\n");
85     }
86     fclose(stdin);
87     fclose(stdout);
88     return 0;
89 }

标程:

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6
 7 using namespace std;
 8
 9 const int maxn=100010;
10
11 int L,R,s,m;
12
13 struct rec
14 {
15     int v,p;
16     bool operator<(const rec &a)const
17     {
18         return v<a.v;
19     }
20 }z[maxn];
21
22 void solve(int l,int r,int &res,int delta,int p)
23 {
24     if (l>r) return;
25     int left=l-1,right=r;
26     while (left+1!=right)
27     {
28         int mid=(left+right)>>1;
29         if ((z[mid].v+delta)%m>=L) right=mid;
30         else left=mid;
31     }
32     int v=z[right].v+delta;
33     v%=m;
34     if (v>=L && v<=R)
35     {
36         for (int a=l;a<=r;a++)
37             if ((z[a].v+delta)%m>=L && (z[a].v+delta)%m<=R)
38             {
39                 if (res) res=min(res,z[a].p+p-1);
40                 else res=z[a].p+p-1;
41             }
42     }
43 }
44
45 int main()
46 {
47     freopen("she.in","r",stdin);
48     freopen("she.out","w",stdout);
49
50     int test;
51     scanf("%d",&test);
52     for (int p=1;p<=test;p++)
53     {
54         scanf("%d%d%d%d",&m,&s,&L,&R);
55         if (R>=m) R=m-1;
56         s%=m;
57         int size=(int)sqrt(m);
58         int res=0;
59         for (int a=1;a<=size && !res;a++)
60         {
61             z[a].v=(z[a-1].v+s)%m;
62             if (z[a].v>=L && z[a].v<=R) res=a;
63             z[a].p=a;
64         }
65         sort(z+1,z+size+1);
66         for (int a=size+1;a<=m && !res;a+=size)
67         {
68             int delta=(long long)size*s%m*((a-1)/size)%m;
69             int l=0,r=size;
70             while (l+1!=r)
71             {
72                 int mid=(l+r)>>1;
73                 if (z[mid].v+delta>=m) r=mid;
74                 else l=mid;
75             }
76             if (z[r].v+delta<m) r++;
77             solve(1,r-1,res,delta,a);
78             solve(r,size,res,delta,a);
79         }
80         if (res) printf("%d\n",res);
81         else printf("-1\n");
82     }
83
84     return 0;
85 }

T3:听说很难,我不会,只有标程

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6
 7 using namespace std;
 8
 9 const int maxn=1010;
10
11 int n,k,pre[maxn],next[maxn];
12
13 long double p[maxn],q[maxn];
14
15 void del(int b)
16 {
17     int a=pre[b],c=next[b];
18     long double pa=p[a],pb=p[b],pc=p[c];
19     p[a]=pa*pb/(1-pa*(1-pb));q[a]=1-p[a];
20     q[c]=(1-pc)*(1-pb)/(1-pb*(1-pc));p[c]=1-q[c];
21     next[a]=c;pre[c]=a;
22 }
23
24 long double solve()
25 {
26     if (n<=2) return 1;
27     if (n<=3) return k==1 ? p[1] : q[2];
28     for (int a=1;a<=n;a++)
29         pre[a]=a-1,next[a]=a+1;
30     pre[1]=n;next[n]=1;
31     if (k==1)
32     {
33         for (int a=2;a<n-1;a++)
34             del(a);
35         return p[1];
36     }
37     if (k==n-1)
38     {
39         for (int a=2;a<n-1;a++)
40             del(a);
41         return q[n-1];
42     }
43     for (int a=2;a<k;a++)
44         del(a);
45     for (int a=k+1;a<n-1;a++)
46         del(a);
47     del(k);
48     return q[k]*p[1]+p[k]*q[n-1];
49 }
50
51 int main()
52 {
53     freopen("it.in","r",stdin);
54     freopen("it.out","w",stdout);
55
56     int test;
57     scanf("%d",&test);
58     for (int px=1;px<=test;px++)
59     {
60         scanf("%d%d",&n,&k);
61         for (int a=1;a<=n;a++)
62         {
63             double v;
64             scanf("%lf",&v);
65             p[a]=v;
66             q[a]=1-p[a];
67         }
68         printf("%.9lf\n",(double)solve());
69     }
70
71     return 0;
72 }
时间: 2024-08-23 21:05:16

2016.10.30 NOIP模拟赛 day2 PM 整理的相关文章

2016.10.30 NOIP模拟赛 day2 AM 整理

题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高,但是比较满意,因为把自己会的分数都拿到了. T1:100分 1 /* 2 T1明显是个数论题. 3 正确的思路:把n!质因数分解,把所有质因数的指数都取到最大的偶数,它们的乘积便是最终的结果. 4 有一种很快的方法在Eular筛中可以n!的质因数分解. 5 if(!is_prim[i]) 6 { 7

2016.10.29 NOIP模拟赛 PM 考试整理

300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题真的是跪在游戏玩少了. 我忽视了游戏中的两个常识:1.开始的序列是无法消除的(这与题目描述明显不符啊),即使有很多可以连消的,而我的程序每次只在插入的位置向两侧寻找可以消除的,自然就错了. 2.开始时的序列居然可以为空,真是让人措手不及! 正确做法:用指针链表,而且不可以用数组模拟.

10.30 NFLS-NOIP模拟赛 解题报告

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

CH Round #55 - Streaming #6 (NOIP模拟赛day2)解题报告

T1九九归一 描述 萌蛋在练习模n意义下的乘法时发现,总有一些数,在自乘若干次以后,会变成1.例如n=7,那么5×5 mod 7=4,4×5 mod 7=6,6×5 mod 7=2,2×5 mod 7=3,3×5 mod 7=1.如果继续乘下去,就会陷入循环当中.萌蛋还发现,这个循环的长度经常会是φ(n),即小于n且与n互质的正整数的个数.例如,φ(7)=6,而上述循环的长度也是6,因为5,4,6,2,3,1共有6个数.再如n=6,那么5×5 mod 6=1.这个循环的长度很短,只有2,而恰好φ

2017.9.24 noip模拟赛 day2—组合数

简化版题意: 给定n,m(n<=m),求C(n,m)的末尾有几个0 输入格式: 第一行一个整数t,代表数据组数. 接下来t行,每行两个整数n,m 输出格式: t行,每行一个整数,代表C(n,m)的末尾0的个数. 样例输入: 310 111 720 4 样例输出: 110 数据范围: 1<=m<=n<=1000000,t<=1000 首先这道题需要知道一个公式:C(n,m)=n!/(n-m)!*m! 然后10=2*5,也就是说,对于一个数,我们将其因数分解,2和5中较少的数的个

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

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

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

【noip模拟赛】 射击

这题似乎是什么安阳一中的模拟题,不管了,反正是学长出的noip模拟赛里面的题目.... 射击(shoot.pas/.c/.cpp) 时间限制:1s,内存限制128MB 题目描述: 据史书记载,对越反击战时期,有位中国侦察兵,他的代号叫814.一天他执行狙击任务,他的任务地区是n座恰巧在一条直线上的山.这些山所在直线恰巧为东西走向,山从东到西依次编号为1~n.一天814隐藏在编号为k的山上,每座山上都有1个目标. 814也非常的厉害,任务结束时杀了很多人,可是史书中只记载了两点: 1:814一定攻