CSPS模拟86-87

模拟86

T1,烧水,按位统计贡献,利用某种sao操作避免数位dp

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 const int mod=1000000007;
 6 using namespace std;
 7 int n,m;
 8 int dp1[40],sum[40];
 9 int bin[40];
10 inline void get1(int x)
11 {
12     memset(dp1,0,sizeof(dp1));
13     if(x<0)return;
14     for(int i=29;~i;--i)
15     {
16         dp1[i]=(x>>(i+1))+1;
17         if(x&bin[i])dp1[i]=1ll*bin[i]*dp1[i]%mod;
18         else{
19             dp1[i]=1ll*(x>>(i+1))*bin[i]%mod;
20             dp1[i]+=(x&(bin[i]-1));++dp1[i];
21             if(dp1[i]>=mod)dp1[i]-=mod;
22         }
23     }
24 }
25 int main()
26 {
27     for(int i=0;i<=30;++i)bin[i]=1<<i;
28     int T;scanf("%d",&T);
29     while(T--)
30     {
31         scanf("%d%d",&m,&n);
32         memset(sum,0,sizeof(sum));
33         get1(n);
34         for(int i=0;i<=30;++i)sum[i]+=dp1[i];
35         get1(m-1);
36         for(int i=0;i<=30;++i)sum[i]-=dp1[i];
37         int ans=0;const int num=n-m+1;
38         for(int i=0;i<=30;++i)
39         {
40             ans+=2ll*sum[i]%mod*(num-sum[i])%mod*bin[i]%mod;
41             if(ans>=mod)ans-=mod;
42         }
43         ans=((ans%mod)+mod)%mod;
44         cout<<ans<<endl;
45
46     }
47 }

T2,博弈,考场上推出了最小为0时的答案,以为能找出规律,连暴力都没打,kuku

正解为用必败状态筛必胜状态来保证复杂度。%%%脸哥压表,处理出不合法状态hash掉,最后在数组里lower_bound即可。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define re register
 6 using namespace std;
 7 int n,m;
 8 int a[5];
 9 char dp[301][301][301];
10 int main()
11 {
12     for(re short i=0;i<=300;++i)
13     {
14         for(re short j=0;j<=300;++j)
15         {
16             for(re short k=0;k<=300;++k)
17             {
18                 if(dp[i][j][k])continue;
19                 for(re short o=1;o+i<=300;++o)dp[i+o][j][k]=1;
20                 for(re short o=1;o+j<=300;++o)dp[i][j+o][k]=1;
21                 for(re short o=1;o+k<=300;++o)dp[i][j][k+o]=1;
22                 for(re short o=1;o+i<=300&&o+j<=300;++o)dp[i+o][j+o][k]=1;
23                 for(re short o=1;o+i<=300&&o+k<=300;++o)dp[i+o][j][k+o]=1;
24                 for(re short o=1;o+k<=300&&o+j<=300;++o)dp[i][j+o][k+o]=1;
25                 for(re short o=1;o+i<=300&&o+k<=300&&o+j<=300;++o)dp[i+o][j+o][k+o]=1;
26             }
27         }
28     }
29     int T;scanf("%d",&T);
30     while(T--)
31     {
32         scanf("%d%d%d",&a[1],&a[2],&a[3]);
33         if(dp[a[1]][a[2]][a[3]])puts("Yes");
34         else puts("No");
35     }
36 }

T3,dp,对前缀和取max优化。考场上想出了第三维表示四个状态(顶峰,底端,上升,下降),然而没想到转移。

在最外层枚举区间数,对四种状态用4个变量分别维护最优点转移即可。%%%WWB_star,rnb,milk_feng让我认识到自己的错误

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 30040
 6 using namespace std;
 7 int n,K,ans;
 8 int a[N],sum[N],dp[205][N][5];
 9 const int inf=0x3f3f3f3f;
10 int main()
11 {
12     memset(dp,-0x3f,sizeof(dp));
13     scanf("%d%d",&n,&K);
14     for(int i=1;i<=n;++i)
15         scanf("%d",&a[i]),sum[i]=sum[i-1]+a[i];
16     int mi=0,ma=0,mi2=0,ma2=0;
17     for(int i=1;i<=n;++i){
18         dp[1][i][2]=sum[i]-mi;
19         dp[1][i][1]=ma-sum[i];
20         dp[1][i][0]=dp[1][i][2];
21         dp[1][i][3]=dp[1][i][1];
22         mi=min(mi,sum[i]);ma=max(ma,sum[i]);
23     }
24     for(int j=2;j<K;++j){
25         mi=ma=mi2=ma2=-inf;
26         for(int i=j-1;i<=n;++i)
27         {
28             dp[j][i][2]=max(dp[j][i][2],ma+2*sum[i]);
29             dp[j][i][1]=max(dp[j][i][1],mi-2*sum[i]);
30
31             dp[j][i][0]=max(dp[j][i][0],mi2);
32             dp[j][i][3]=max(dp[j][i][3],ma2);
33             mi=max(mi,dp[j-1][i][2]+sum[i]*2);
34             mi=max(mi,dp[j-1][i][0]+sum[i]*2);
35
36             ma=max(ma,dp[j-1][i][1]-sum[i]*2);
37             ma=max(ma,dp[j-1][i][3]-sum[i]*2);
38
39             ma2=max(ma2,dp[j-1][i][1]);
40             ma2=max(ma2,dp[j-1][i][3]);
41
42             mi2=max(mi2,dp[j-1][i][2]);
43             mi2=max(mi2,dp[j-1][i][0]);
44         }
45     }
46     mi=ma=mi2=ma2=-inf;
47     for(int i=K-1;i<=n;++i)
48     {
49         dp[K][i][2]=max(dp[K][i][2],ma+sum[i]);
50         dp[K][i][1]=max(dp[K][i][1],mi-sum[i]);
51
52         dp[K][i][0]=max(dp[K][i][0],mi2);
53         dp[K][i][3]=max(dp[K][i][3],ma2);
54
55         mi=max(mi,dp[K-1][i][2]+sum[i]);
56         mi=max(mi,dp[K-1][i][0]+sum[i]);
57
58         ma=max(ma,dp[K-1][i][1]-sum[i]);
59         ma=max(ma,dp[K-1][i][3]-sum[i]);
60
61         ma2=max(ma2,dp[K-1][i][1]);
62         ma2=max(ma2,dp[K-1][i][3]);
63
64         mi2=max(mi2,dp[K-1][i][2]);
65         mi2=max(mi2,dp[K-1][i][0]);
66
67         ans=max(ans,dp[K][i][2]);
68         ans=max(ans,dp[K][i][1]);
69     }
70     printf("%d\n",ans);
71 }

300 145 120 50 110 220 122 160 130

这个故事告诉我们:rp是个好东西(别败光了)

模拟87,新的开始,勉强苟住位置(抢到Dybala的第八)

T1,(妹子)maze

考场上想了半天才想到是二分答案。然后就疯狂码码码,打了个代码测时长,发现极限数据甚至会达到十几秒,然后疯狂卡常

最后当我手打堆打到一半,发现我的结构体重载运算符重载反了,赶紧改过来,发现还剩1分钟,慌的一比。。。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<bitset>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #define N 105
 10 using namespace std;
 11 const double eps=1e-5;
 12 const int dx[]={1,-1,0,0};
 13 const int dy[]={0,0,1,-1};
 14 int n,m,sx,sy,tx,ty;
 15 bool vst[N][N];
 16 double dis[N][N],s;
 17 int a[N][N];
 18 struct node{
 19     int x;
 20     int y;
 21     double z;
 22     friend bool operator <(const node &a,const node &b)
 23     {return a.z>b.z;}
 24 };
 25 /*
 26 struct QAQ{
 27     node a[100500];
 28     int tot;
 29     inline int size(){return tot;}
 30     inline void clear(){tot=0;}
 31     inline node top(){return a[1];}
 32     inline void pop()
 33     {
 34         a[1]=a[tot++];int i=1,j;
 35         while(1)
 36         {
 37             j=i<<1;
 38             if(j>tot)return;
 39             if(a[j+1]<a[j])
 40         }
 41     }
 42
 43 }
 44 */
 45 priority_queue<node>q;
 46 inline void init()
 47 {
 48     for(register int i=1;i<=n;++i)
 49         for(register int j=1;j<=m;++j)
 50             dis[i][j]=1000000.0;
 51 }
 52 inline node mknd(int x,int y,double z)
 53 {
 54     node a;a.x=x,a.y=y,a.z=z;return a;
 55 }
 56 inline void dijk(double val)
 57 {
 58     while(q.size())q.pop();init();
 59     dis[sx][sy]=0.0;
 60     q.push(mknd(sx,sy,0.0));
 61     int xx,yy,x,y;double z;
 62     while(q.size())
 63     {
 64         x=q.top().x;y=q.top().y;z=q.top().z;q.pop();
 65         if(z!=dis[x][y])continue;if(x==tx&&y==ty)return;
 66         for(register int i=3;~i;--i)
 67         {
 68             xx=x+dx[i];yy=y+dy[i];
 69             if(a[xx][yy])continue;
 70             if(dx[i])
 71             {
 72                 if(dis[xx][yy]>z+val)
 73                 {
 74                     dis[xx][yy]=z+val;
 75                     q.push(mknd(xx,yy,dis[xx][yy]));
 76                 }
 77             }
 78             else
 79             {
 80                 if(dis[xx][yy]>z+1.0)
 81                 {
 82                     dis[xx][yy]=z+1.0;
 83                     q.push(mknd(xx,yy,dis[xx][yy]));
 84                 }
 85             }
 86         }
 87     }
 88 }
 89 inline void work()
 90 {
 91     double l=0.0,r=s,mid;
 92     while(r-l>3e-4){
 93         mid=(l+r)*0.5;dijk(mid);
 94         if(dis[tx][ty]-s>0.0)r=mid;
 95         else l=mid;
 96         if(fabs(dis[tx][ty]-s)<5e-4){l=mid;break;}
 97 //        printf("%.10lf %.10lf\n",l,r);
 98     }
 99     printf("%.3lf\n",l);
100 }
101 int main()
102 {
103 //    freopen("da.in","r",stdin);//freopen("my.out","w",stdout);
104     scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&tx,&ty);
105     for(int i=1;i<=n;++i)
106         for(int j=1,x;j<=m;++j)
107             scanf("%d",&x),a[i][j]=x;
108
109     a[sx][sy]=a[tx][ty]=0;
110     dijk(1.0);if(dis[tx][ty]>100000.0)return 0;
111     for(int i=1;i<=n;++i)a[i][0]=a[i][m+1]=1;
112     for(int i=1;i<=m;++i)a[0][i]=a[n+1][i]=1;
113     scanf("%lf",&s);work();return 0;
114 }
115 /*
116 4 4
117 1 1 4 4
118 0 0 1 1
119 1 0 0 0
120 0 0 1 0
121 0 0 0 0
122 5
123 */

T2,bird

线段树稍显然,考虑去除重复贡献,用到了一些差分的思想,在左端点加入区间,右点存左点,dp值单点插入时暂且不加当前贡献,扫到右端点再加,保证不重复

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<bitset>
 6 #include<vector>
 7 #include<queue>
 8 #define N 500050
 9 using namespace std;
10 int n,m;
11 vector<int>v[N];
12 int sum[N],dp[N];
13 struct node{
14     int l,r;
15 }q[100050];
16 int A,ans;
17 int ma[N<<2],tag[N<<2];
18 inline void upd(int g){ma[g]=max(ma[g<<1],ma[g<<1|1]);}
19 inline void down(int g)
20 {
21     tag[g<<1]+=tag[g];
22     ma[g<<1]+=tag[g];
23     tag[g<<1|1]+=tag[g];
24     ma[g<<1|1]+=tag[g];
25     tag[g]=0;
26 }
27 inline void add(int g,int l,int r,int x,int y,int v)
28 {
29     if(l>y||r<x)return;
30     if(l>=x&&r<=y){ma[g]+=v;tag[g]+=v;return;}
31     if(tag[g])down(g);
32     const int m=l+r>>1;
33     add(g<<1,l,m,x,y,v);add(g<<1|1,m+1,r,x,y,v);
34     upd(g);
35 }
36 inline int ask(int g,int l,int r,int x,int y)
37 {
38     if(l>y||r<x)return 0;
39     if(l>=x&&r<=y)return ma[g];
40     if(tag[g])down(g);
41     const int m=l+r>>1;
42     const int a1=ask(g<<1,l,m,x,y),a2=ask(g<<1|1,m+1,r,x,y);
43     if(a1>a2)return a1;return a2;
44 }
45 int main()
46 {
47     scanf("%d%d",&n,&m);
48     for(int i=1,l,r;i<=n;++i)
49     {
50         scanf("%d%d",&l,&r);
51         if(r<0)continue;
52         if(l<0)l=0;
53         v[r+1].push_back(l);
54         if(r>A)A=r;
55         ++sum[l];
56     }
57     ++A;int al=0;
58     for(int i=0;i<=A;++i)
59     {
60         al+=sum[i];
61         for(int j=0;j<v[i].size();++j)
62             add(1,0,A,v[i][j],i-1,1),--al;
63         dp[i]=ask(1,0,A,0,i-m);
64         ans=max(ans,dp[i]+al);
65         add(1,0,A,i,i,dp[i]);
66     }
67     cout<<ans<<endl;
68     return 0;
69 }

T3,%%%脸哥

话说脸哥是不是把推荐和反对放反了啊?

原文地址:https://www.cnblogs.com/loadingkkk/p/11740988.html

时间: 2024-10-20 06:59:02

CSPS模拟86-87的相关文章

CSPS模拟 86

看见异或两个字就孩怕 T1 按位? T2 这道异或稍水啊233 貌似可以打表找找规律 emm七种转移,有重复刷表 优化一下? T3 skyh已经接了2杯水了(实际情况他已经ak了) cbx开始抬头傻笑了 完了戏了T3还没思路(什么类似的题我都白做了 平凡优化,平凡优化.. 拆abs,前缀max,挺平凡的 复杂度也是对的? 考试体验较佳,如果skyh没去接水还能更佳 CSPS让考试接水么? 希望下次发(sk)挥(yh)得(rp)更(--)充(C)分(K)吧 原文地址:https://www.cnb

csps模拟测试50反思

又考崩了,T1一眼秒掉错误思路,然后迅速码完,并码完错误暴力,对拍拍上,以为AC.T2想到了二维莫队,发现是子任务就没去打,一直在想别的,T3最后想到60分打法,没有打完,也没时间暴力,挂掉.T2还有一个读错题的锅,T了一个子任务. 考试一定要合理分配时间,确定自己算法的正确性,想到一个类似的算法要敢于去实现. T1 施工 单调栈优化dp 改变dp定义是优化dp的重要方式 dp[i]表示第i个位置不变的最优答案.枚举j转移,O(n^2),期望得分53 考虑优化,dp[i]只会由最多一个h比它大的

csp-s模拟测试60

csp-s模拟测试60       2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴一个不一样的毒瘤做法. 1 //ans=(ans+m)%i 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #define re re

csp-s模拟测试83(集训过半)

csp-s模拟测试83(集训过半) 一场信心赛.起初$OJ$爆了我就看见全场$A$了$T1$并且夹杂着$A$掉$T2$我就很难受. 这场比赛没有深入思考,很失败,一个多小时后就结束了我罪恶的一生. 100 00:44:43 50 02:51:09 20 02:50:48 170 02:51:09 没什么水平暴力都没打满. A. 最大异或和 打表可知异或$sum$为$0$则平局反之先手必胜. B. 简单的括号序列 $B$组的一道垃圾题.记得考虑柿子的实际含义就好了. C. 旅行计划 分块处理,考场

csp-s模拟测试92

csp-s模拟测试92 关于$T1$:最短路这一定建边最短路. 关于$T2$:傻逼$Dp$这一定线段树优化$Dp$. 关于$T3$:最小生成树+树P+换跟一定是这样. 深入(?)思考$T1$:我是傻逼. 深入(?)思考$T2$:我是天才! 深入(?)思考$T3$:我是天才! 100 01:14:19 10 02:36:26 15 03:19:48 125 03:19:48 事实证明我是傻逼. A. 数列 故意删掉负数读入$Rp--$ $Exgcd$,对绝对值大力分类讨论,一次函数求最值. 考场死

csp-s模拟测试93

csp-s模拟测试93 自闭场. $T1$想到$CDQ$,因为复杂度少看见一个$0$打了半年还用了$sort$直接废掉,$T2$,$T3$直接自闭暴力分都没有.考场太慌了,心态不好. 80 02:07:34 0 03:12:11 0 03:11:53 80 03:12:11 没有前途就是垃圾趁早滚回实验二安度晚年吧. A. 序列 $CDQ$不接受反驳. B. 二叉搜索树 最简单的$Dp$都没认真想,太垃圾了,积累一个决策单调性优化$Dp$.一些看似是$n^3$的题可以通过特殊性质优化,还比如以前

csp-s模拟测试94

csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间,$T3$写完暴力准备划水,突然发现特殊性质可写,$10$分钟拯救了$25$分. 80 03:24:46 70 03:24:58 65 03:25:10 215 03:25:10 没办法就是菜,退役也不暝目. A. 凉宫春日的忧郁 转成对数轻松过. B. 漫无止境的八月 取模到$K$大小的区间,$ha

csp-s模拟测试96

csp-s模拟测试96 $T1$一眼慢速乘,$T2$稍证一手最优性尝试用神奇数据结构优化,无果,弃.$T3$暴力+信仰. 100 03:16:38 95 03:16:56 35 03:17:10 230 03:17:10 比较意外. 和天皇$Skyh$同分祭. 起码可以伪证退役前我努力过. A. 求和 等差数列慢速乘,$/2$特判. B. 分组配对 二分右端点倍增优化. 考场把两个性能各异的暴力拼在一起,设一个参数,拿了$95$. C. 城市游戏 调不出来,咕. 神様(かみさま)ありがとう 运命

csp-s模拟测试97

csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 100 00:31:38 10 02:49:26 150 02:49:26 $T1$特判错了希望人品可以++. A. 小盆友的游戏 像题解一样构造一个函数那么这个题就是水题了. B. 花 随手$Dp$. C. 表格 $Dee$树帅但是我咕了. 酷(ひど)いよ 酷(ひど)いよ.もういっそ仆(ぼく)の体(か