csp-s模拟9697题解

题面:https://www.cnblogs.com/Juve/articles/11790223.html

96:

刚一看以为是水题,直接等差数列求和就好了,然后发现模数不是质数,还要1e18*1e18,就弃了,看T3,然后看错题了,打了个dij的40分暴力

然后看T1发现我好像会一个叫做慢速乘的东西(颓AlpaCa博客颓到的,现在应该是我的模板的第二个),然后就不用打高精了,

至于模数不是质数,因为答案一定是整数,而我的式子最终要除以4,所以就在乘之前先让它除,然后乘,然后T1就A了,

T2打了个n方暴力,骗到75,rk6还是近几次最好?可能是我太垃圾了。。。

T1:

上面都说过了,不再细说

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 using namespace std;
 7 int x,y,xx,yy,tot=0;
 8 int ans=0,mod;
 9 int mul(int a,int b,int p){
10     int res=0;
11     while(b){
12         if(b&1) res=(res+a)%p;
13         a=(a+a)%p;
14         b>>=1;
15     }
16     return res;
17 }
18 signed main(){
19     freopen("sum.in","r",stdin);
20     freopen("sum.out","w",stdout);
21     scanf("%lld%lld%lld%lld%lld",&x,&y,&xx,&yy,&mod);
22     int p=(x+y-1),q=(x+yy-1),pp=(xx+y-1),qq=(xx+yy-1);
23     int xkl1=(p+q+pp+qq),xkl2=(yy-y+1),xkl3=(xx-x+1);
24     while(tot<2&&xkl1%2==0){
25         xkl1/=2;
26         ++tot;
27     }
28     while(tot<2&&xkl2%2==0){
29         xkl2/=2;
30         ++tot;
31     }
32     while(tot<2&&xkl3%2==0){
33         xkl3/=2;
34         ++tot;
35     }
36     ans=mul(mul(xkl2,xkl3,mod)%mod,xkl1,mod)%mod;
37     printf("%lld\n",ans);
38     return 0;
39 }

T2:

就贪心地扫,二分最大不可行的位置,然而n2logn2复杂度不够优秀,我们倍增缩小二分的区间

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<vector>
 6 #define int long long
 7 #define re register
 8 using namespace std;
 9 inline int read(){
10     re int x=0;re char ch=getchar();
11     while(ch<‘0‘||ch>‘9‘) ch=getchar();
12     while(ch>=‘0‘&&ch<=‘9‘){
13         x=(x<<3)+(x<<1)+ch-‘0‘;
14         ch=getchar();
15     }
16     return x;
17 }
18 const int MAXN=1e6+5;
19 int n,m,a[MAXN],b[MAXN],ans=0;
20 int staa[MAXN],stab[MAXN],topa,topb;
21 bool check(int l,int r){
22     topa=topb=0;
23     for(int i=l;i<=r;++i) staa[++topa]=a[i],stab[++topb]=b[i];
24     sort(staa+1,staa+topa+1),sort(stab+1,stab+topb+1);
25     int tot=0;
26     for(int i=1;i<=topa;++i){
27         tot+=staa[i]*stab[i];
28         if(tot>m) return 0;
29     }
30     return 1;
31 }
32 int get(int pos){
33     int poss=1;
34     for(int i=1;;++i){
35         poss=i;
36         if(pos+(1<<i)-1>n) break;
37         if(!check(pos,pos+(1<<i)-1)){
38             poss=i;
39             break;
40         }
41     }
42     int l=pos+(1<<(poss-1))-1,r=pos+(1<<poss)-1;
43     int res=l;
44     while(l<=r){
45         int mid=(l+r)>>1;
46         if(check(pos,mid)) res=max(res,mid),l=mid+1;
47         else r=mid-1;
48     }
49     return res+1;
50 }
51 signed main(){
52     freopen("pair.in","r",stdin);
53     freopen("pair.out","w",stdout);
54     n=read(),m=read();
55     for(re int i=1;i<=n;++i) a[i]=read();
56     for(re int i=1;i<=n;++i) b[i]=read();
57     for(re int i=1;i<=n;){
58         i=get(i);
59         ++ans;
60     }
61     printf("%lld\n",ans);
62     return 0;
63 }

T3:

不太会

97:

T1发现了50分性质就跑了,T2感觉是个sb的dp,但是由于我设的状态,导致他有8个转移,复杂度也只能过70分,T3玄学原因10分暴力都挂了

dp要再复习,dp渣有什么好说的?

发下题解发现我不懂T1的解释,T2又太水了,导致没什么可讲的

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 using namespace std;
 7 const int MAXN=1e5+5,mod=1e9+7;
 8 int n,a[MAXN],cnt=0,ans=0,tong[MAXN];
 9 int q_pow(int a,int b,int p){
10     int res=1;
11     while(b){
12         if(b&1) res=res*a%p;
13         a=a*a%p;
14         b>>=1;
15     }
16     return res;
17 }
18 signed main(){
19     freopen("game.in","r",stdin);
20     freopen("game.out","w",stdout);
21     scanf("%lld",&n);
22     for(int i=1;i<=n;++i){
23         scanf("%lld",&a[i]);
24         ++tong[a[i]];
25         cnt+=(a[i]==-1);
26     }
27     ans=(q_pow(2,n-1,mod)-1+mod)%mod;
28     for(int i=1;i<=n;++i){
29         ans=(ans-q_pow(2,tong[i],mod)+1+mod)%mod;
30     }
31     printf("%lld\n",ans);
32     return 0;
33 }

T2:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define int long long
 6 #define re register
 7 using namespace std;
 8 const int mod=1e9+7;
 9 int t,n,s,f[100005][2];
10 signed main(){
11     freopen("flower.in","r",stdin);
12     freopen("flower.out","w",stdout);
13     scanf("%lld",&t);
14     while(t--){
15         scanf("%lld%lld",&n,&s);
16         f[1][0]=f[3][1]=s;
17         f[2][0]=s*s%mod;
18         f[3][0]=(s*s%mod*s%mod-s+mod)%mod;
19         for(int i=4;i<=n;++i){
20             f[i][0]=(f[i-1][0]*(s-1)%mod+f[i-2][0]*(s-1)%mod)%mod;
21             f[i][1]=(f[i-1][1]*(s-1)%mod+f[i-2][1]*(s-1)%mod+f[i-3][0]*(s-1)%mod)%mod;
22         }
23         printf("%lld\n",f[n][1]%mod);
24     }
25     return 0;
26 }

T3:

不会,DEE树钛锯蜡

98:

全程划水,然后T130分暴力又挂了,因为限制的循环层数太小,导致没跑出来

T2一个错误的状压dp水了35分

好吧我现在只会T2

设定01状态,预处理出每个点i,点亮它j秒后那些灯状态会取反,然后倒着转移

话说Yu-shi给我讲的时候我一直理解成正序还说服了自己,我真是太bang了

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 int n,fa[20],zt[20],s,dp[17][17],ans=0x3f3f3f3f;
 7 bool f[17][(1<<16)+5];
 8 int calc(int state){
 9     int res=0;
10     for(int i=2;i<=n;++i){
11         if(state&(1<<(i-1))){
12             res^=(1<<(fa[i]-1));
13         }
14     }
15     return res;
16 }
17 void print(int sta){
18     for(int i=1;i<=n;++i){
19         if(sta&(1<<(i-1))) cout<<1;
20         else cout<<0;
21     }
22     cout<<‘ ‘;
23     for(int i=n;i>=1;--i){
24         if(sta&(1<<(i-1))) cout<<1;
25         else cout<<0;
26     }
27     cout<<‘ ‘;
28 }
29 int main(){
30     freopen("decoration.in","r",stdin);
31     freopen("decoration.out","w",stdout);
32     scanf("%d",&n);
33     for(int i=2;i<=n;++i) scanf("%d",&fa[i]);
34     for(int i=1;i<=n;++i){
35         scanf("%d",&zt[i]);
36         s|=(zt[i]<<(i-1));
37         int p=i;
38         dp[i][1]=1<<(i-1);
39         p=fa[p];
40         for(int j=2;j<=n;++j,p=fa[p]){
41             if(p!=0) dp[i][j]=dp[i][j-1]|(1<<(p-1));
42             else dp[i][j]=dp[i][j-1];
43         }
44     }
45     f[0][0]=1;
46     for(int i=1;i<=n;++i){
47         for(int s=0;s<(1<<n);++s){
48             f[i][s]|=f[i-1][s];
49             for(int j=1;j<=n;++j){
50                 f[i][s^dp[j][i]]|=f[i-1][s];
51             }
52         }
53     }
54     for(int i=0;i<=n;++i){
55         if(f[i][s]){
56             ans=i;
57             break;
58         }
59     }
60     printf("%d\n",ans);
61     return 0;
62 } 

原文地址:https://www.cnblogs.com/Juve/p/11790318.html

时间: 2024-10-14 08:04:40

csp-s模拟9697题解的相关文章

HDU 1022 Train Problem I 模拟栈题解

火车进站,模拟一个栈的操作,额外的栈操作,查看是否能按照规定顺序出栈. 数据量很少,故此题目很容易AC. 直接使用数组模拟就好. #include <stdio.h> const int MAX_N = 10; char inOrder[MAX_N], outOrder[MAX_N], stk[MAX_N]; bool rs[MAX_N<<2]; int n; int main() { while (scanf("%d", &n) != EOF) { s

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

2018-10-25 模拟测试题解

目录 问题 A: 魏传之长坂逆袭 题目描述 输入 输出 样例输入 样例输出 题解 问题 B: 蜀传之单刀赴会 题目描述 [问题描述] 输入 输出 样例输入 样例输出 题解 问题 C: 吴传之火烧连营 [题目背景] [问题描述] 输入 输出 样例输入 样例输出 [样例解释] [数据规模和约定] 题解 本篇题解也发表于zwcblog作者是同一个人 问题 A: 魏传之长坂逆袭 题目描述 众所周知,刘备在长坂坡上与他的一众将领各种开挂,硬生生从曹操手中逃了出去,随后与孙权一起火烧赤壁.占有荆益.成就霸业

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环

CPPU程序设计训练营清明天梯模拟赛题解

感谢大家今天来做题 比赛地址:http://202.206.177.79/contest/8 由于博主比较菜,没做完所有题目,这里暂时仅提供前两部分的题解. 为了节约篇幅,题目及数据描述不再赘述,如有需求,请移步OJ查看. 感谢大家的辛苦付出,但是从这次比赛的结果来看,前行之路还非常非常漫长呐. 我寂寞的时候,会害怕踏出第一步.不会想到要去做什么事,所以,可能没有发觉很多很多的东西吧.--<夏目友人帐> 第一阶段 L1-1 天梯赛座位分配 (20分) 通过率:2.56% \(\;\;\) 通过

NOIP模拟 8-21 题解

一份模拟题...水得要命真是没谁了. 减法 (sub.c/.cpp) 题目描述 东东在幼儿园刚刚学会了 20 以内的减法,就迫不及待的跑回家要给爸爸出题了.问“10-1”来考东东爸,东东爸想也没想就说是“1”.东东顿时喜笑颜开,臭爸爸连这都不知道.那你知道为啥么?嘻嘻,当然这不是题目了. 这回换东东爸出题了: 两个整数 A 和 B,问 A-B 的结果是多少. 其中 1<=A<=101000, 0<=B<=A. 东东一脸懵圈,说:“臭爸爸,我不会,你告诉我结果吧.“ 这回轮到东东爸懵

NOIP模拟21题解

Contents Contents 六元组 Description Input Output 数据范围与约定 Solution 牛排序 Description Input Output 样例解释 Solution Step1 Step2 Step3 Step4 打砖块 Description Input Output 数据范围与约定 Solution 1.六元组 (six.c/.cpp/.pas) Description 有n个整数,现在想知道有多少个六元组(a,b,c,d,e,f) 满足:(a