「csp-s模拟测试(9.18)」Set·Read·Race
昨天考试考得有点迷???
一看内存限制,T1 64MB T2 16MB 当场懵比.........
T1 set
考场打的背包问题和随机化,其实能randA掉,但不小心数组开小了????(长记性!!!!!)
正解的话因为每个前缀只需mod%n,所以有n+1个数,其中一定有重复的
所以就可以O(n)扫了
其实正解不难就是没有细想
1 #include<bits/stdc++.h>
2 #define MAXN 1100
3 using namespace std;
4 int read(){
5 int x=0;char c=getchar();
6 while(c<'0'||c>'9')c=getchar();
7 while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
8 return x;
9 }
10 int n;
11 int a[MAXN*MAXN];
12 struct node{int id,w;}e[1000001];
13 int ans[MAXN];
14 int pre[MAXN][1001];
15 bool biao[2][MAXN];
16 void work(){
17 for(int i=1;i<=n;++i){
18 e[i].id=i;e[i].w=a[i];
19 }
20 for(int i=1;i<=20000;++i){
21 if(clock()>990000){
22 printf("-1\n");
23 return ;
24 }
25 random_shuffle(e+1,e+n+1);
26 int ok=0;int me=0;
27 for(int j=1;j<=n;++j){
28 me=(me+(e[j].w%n))%n;
29 if(me==0){
30 ok=j;break;
31 }
32 }
33 if(ok==0)continue;
34 printf("%d\n",ok);
35 for(int j=1;j<=ok;++j)printf("%d ",e[j].id);
36 return ;
37 }
38 }
39 signed main(){
40 n=read();
41 for(int i=1;i<=n;++i){
42 a[i]=read();a[i]%=n;
43 }
44 if(n>1000){
45 work();
46 return 0;
47 }
48 int now=1;int last=0;
49 biao[last][0]=1;
50 for(int i=1;i<=n;++i){
51 for(int j=0;j<n;++j){
52 if(biao[last][j]){
53 biao[now][j]=1;
54 pre[i][j]=0;
55 }
56 if(biao[last][j]){
57 biao[now][(j+a[i])%n]=1;
58 pre[i][(j+a[i])%n]=i;
59 }
60 }
61 swap(now,last);
62 memset(biao[now],0,sizeof(biao[now]));
63 }
64 swap(now,last);
65 if(biao[now][0]==0){printf("-1\n");return 0;}
66 now=0;
67 for(int i=n;i>=1;--i){
68 if(pre[i][now]!=0)ans[++ans[0]]=pre[i][now];
69 now=(now-a[pre[i][now]]%n+n)%n;
70 }
71 if(ans[0]==0){printf("-1\n");return 0;}
72 printf("%d\n",ans[0]);
73 for(int i=1;i<=ans[0];++i){
74 printf("%d ",ans[i]);
75 }
76 cout<<endl;
77 }
78 /*
79 g++ pai.cpp -o pai
80 ./pai
81 g++ a.cpp -o a
82 ./a
83 */
考场随机化暴力
1 #include<bits/stdc++.h>
2 #define MAXN 1100000
3 #define int long long
4 using namespace std;
5 int vis[MAXN];int n,a[MAXN];
6 signed main(){
7 scanf("%lld",&n);
8 vis[0]=0;
9 for(int i=1;i<=n;++i){
10 scanf("%lld",&a[i]);
11 }int sum=0;
12 for(int i=1;i<=n;++i){
13 sum=(a[i]+sum)%n;
14 if(vis[sum]!=0){
15 printf("%lld\n",i-vis[sum]);
16 for(int j=vis[sum]+1;j<=i;++j){
17 printf("%lld ",j);
18 }
19 return 0;
20 }
21 vis[sum]=i;
22 }
23 }
T2 read
考场时看出了答案其实就是2*maxn_sum-N-1,至于证明,除非最后时只剩一种类型的书了,不然肯定能接着放
那么我们就可以直接判断了
考场没算清内存其实1e6的数据是可以开数组的
对于正解,定义一个id,cnt
我们对于每个新出现的数,当cnt=0时id=当前数,不然id=当前数cnt++;否则cnt--;
可以发现如果存在解的话,id一定为最大出现次数的值,但是因为可能中间存在非最大值之间互相抵消的情况
所以还要再扫一边,判断当前值出现次数
1 #include<bits/stdc++.h>
2 #define MAXN 1100
3 #define int long long
4 using namespace std;
5 int M,N,K;
6 int co[MAXN],x[MAXN],y[MAXN],z[MAXN];int a[MAXN];
7 int maxn_sum=0;int maxn;int S;
8 signed main(){
9 scanf("%lld%lld",&M,&K);
10 S=(1<<K)-1;
11 for(int i=1;i<=M;++i)scanf("%lld",&co[i]);
12 for(int i=1;i<=M;++i)scanf("%lld",&x[i]);
13 for(int i=1;i<=M;++i)scanf("%lld",&y[i]);
14 for(int i=1;i<=M;++i)scanf("%lld",&z[i]);
15 N=0;int cnt=0;int id=0;
16 for(int i=1;i<=M;++i){
17 long long last=x[i];
18 N++;
19 if(cnt==0){cnt=1;id=last;}
20 else if(id==last){cnt++;}
21 else if(id!=last){cnt--;}
22 for(int j=1;j<co[i];++j) {
23 last=(last*y[i]+z[i])&S;
24 N=N+1;
25 if(cnt==0){cnt=1;id=last;}
26 else if(id==last){cnt++;}
27 else if(id!=last){cnt--;}
28 }
29 }
30 if(cnt<1){printf("0\n");return 0;}
31 cnt=0;N=0;
32 for(int i=1;i<=M;++i){
33 long long last=x[i];
34 N++;
35 if(id==last){cnt++;}
36 for(int j=1;j<co[i];++j) {
37 last=(last*y[i]+z[i])&S;
38 N=N+1;
39 if(id==last){cnt++;}
40 }
41 }
42 if(2*cnt-N-1>0){printf("%lld\n",2*cnt-N-1);}
43 else printf("0\n");
44 /*scanf("%lld",&N);
45 int cnt=0;int id=0;
46 for(int i=1;i<=N;++i){scanf("%lld",&a[i]);}
47 for(int i=1;i<=N;++i){
48 long long last=a[i];
49 if(cnt==0){cnt=1;id=last;}
50 else if(id==last){cnt++;}
51 else if(id!=last){cnt--;} printf("i=%lld\n",i);
52 }
53 if(cnt-1>0)printf("%lld\n",cnt-1);
54 else printf("%lld\n",cnt);
55 */
56 }
57 /*
58 22
59 1 3 3 3 3 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
60 */
T3 race
咕了.............
不咕。
一道trie树好题,想了两节课,(在语文课上想题效率很高QAQ)
首先对于x^2的转化:
既然是排名,我们可以考虑成x^2,是每个大于他的数的集合相乘,即(x1+x2+x3+x4.....)*(x1+x2.......)
(其中每个xi都为1),那么结果可以看成任意一个点对的贡献为一,答案就是点对的个数
既然结果是求异或和,我们联想到trie树(这样说有些牵强.......)
无论如何我们先建棵trie树
那么从1-n的每个i,我们统计这个节点时单独考虑每一位的贡献,我们枚举一个j,一个k
j(k)上的数表示在M-1位到j+1位的数与a[i]的这些位的数相等,那么如果使j,k同时大于a[i],我们只需
确定好异或的第j,k位上的数,其他数随意,这样这两位上的数对他的贡献就是两个位的指针上的size*(1<<M-2)
当j==k时乘的变成(1<<M-1),因为只需确定一位
1 #include<bits/stdc++.h>
2 #define int long long
3 #define MAXN 210000
4 using namespace std;
5 int fa[MAXN][31];
6 struct node{
7 int ch[2];
8 int size;
9 }t[MAXN*20];int n,M;
10 const int mod=1e9+7;
11 int tot=1;int a[MAXN];
12 void insert(int x){
13 int p=1;t[p].size++;fa[x][M]=1;
14 for(int i=M-1;i>=0;--i){
15 int me=(a[x]>>i)&1;
16 if(t[p].ch[me]==0)t[p].ch[me]=++tot;
17 p=t[p].ch[me];
18 t[p].size++;
19 fa[x][i]=p;
20 }
21 }
22 int ans[MAXN];
23 void work(int x){
24 for(int i=0;i<=M-1;++i){
25 int me1=0,find1=0;int me2=0,find2=0;
26 for(int j=0;j<i;++j){
27 me1=(a[x]>>i)&1;me2=(a[x]>>j)&1;
28 me1^=1;me2^=1;
29 find1=fa[x][i+1];find2=fa[x][j+1];
30 ans[x]=(ans[x]+2*t[t[find1].ch[me1]].size*t[t[find2].ch[me2]].size%mod*(1ll<<(M-2ll)))%mod;
31 }
32 me1=(a[x]>>i)&1;me1^=1;
33 find1=fa[x][i+1];
34 ans[x]=(ans[x]+t[t[find1].ch[me1]].size*t[t[find1].ch[me1]].size%mod*(1<<(M-1)))%mod;
35 }
36 }
37 int sum=0;
38 signed main(){
39 scanf("%lld%lld",&n,&M);
40 for(int i=1;i<=n;++i){
41 scanf("%lld",&a[i]);
42 }
43 for(int i=1;i<=n;++i){insert(i);}
44 for(int i=1;i<=n;++i){work(i);}
45 for(int i=1;i<=n;++i){
46 sum^=ans[i];
47 }
48 printf("%lld\n",sum);
49 }
******************************
思路积累:
x^2的转化,
trie树的应用,
比较大小只需考虑每一位的贡献
「csp-s模拟测试(9.18)」Set·Read·Race的更多相关文章
- NOIP模拟测试17&18
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
- 「题解」NOIP模拟测试题解乱写II(36)
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
- NOIP模拟测试19「count·dinner·chess」
反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...
- 「CSP」第一届提高组考后总结
「CSP」第一届提高组考后总结 问题分析+反思 成绩 心态 考前心态 考时心态 考后心态 方法 心灵鸡汤... 在学习了三年之后,我们信竞迎来了初中最后一次大考,也是第一次 CSPCSPCSP 考试. ...
- #10471. 「2020-10-02 提高模拟赛」灌溉 (water)
题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...
- #10470. 「2020-10-02 提高模拟赛」流水线 (line)
题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...
- 「newbee-mall新蜂商城开源啦」GitHub 上最热门的 Spring Boot 项目,我也要做一次靓仔!
没有一个冬天不可逾越,也没有一个春天不会到来. 介绍一下新蜂商城的近况,同时,新蜂商城 Vue 版本目前也在开发中,在这篇文章里我也向大家公布一下新蜂商城 Vue 版本的开发进度,和大家同步一下,在不 ...
- Mock 模拟测试简介及 Mockito 使用入门
Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...
- 【转】利用Python中的mock库对Python代码进行模拟测试
出处 https://www.toptal.com/python/an-introduction-to-mocking-in-python http://www.oschina.net/transla ...
- csp-s模拟测试60
csp-s模拟测试60 2019-10-05 RT. 又颓又垃圾. 状态低迷,题都交不上去. 交了也是爆零,垃圾玩家没有什么可说的,就是垃圾. A. 嘟嘟噜 $mlogn$的毒瘤做法. 贴 ...
随机推荐
- 微信小程序中的加载更多(即列表分页)
1.app.json中: "window": { "enablePullDownRefresh": true //是否开启当前页面下拉刷新 } 2.wxml中: ...
- IOS Widget(5):小组件刷新机制
引言 前面的章节学完已经让我们可以顺利实现一个小组件了,但是小组件里面的数据如何刷新的呢,本节内容将讲解IOS的刷新机制. 大纲 系统如何管理小组件刷新 Timeline刷新机制 Timeline ...
- Codeforces Beta Round #73(Div2)
A - Chord 题意:就是环中有12个字符,给你三个字符,判断他们之间的间隔,如果第一个和第二个间隔是3并且第二个和第三个间隔是4,那么就输出minor,如果第一个和第二个间隔是4并且第二个和第三 ...
- 如何安装Eigen库和Sophus库
* { font-family: "Tibetan Machine Uni", "sans-serif", STFangSong; outline: none ...
- ES 6 中的箭头函数及用法
ES6标准新增了一种新的函数:Arrow Function(箭头函数). 主要的几种写法如下: 组成: 参数 => 语句, 参数不是1个: (参数,参数2)=>语句 语句不止一条: 参数 ...
- nano 按Ctrl+X 输入Y 回车
如何退出nano 1.nano 按Ctrl+X 如果你修改了文件,下面会询问你是否需要保存修改. 2.输入Y确认保存,输入N不保存,按Ctrl+C取消返回.如果输入了Y,下一步会让你输入想要保存的文件 ...
- 运维实战案例之“Too many open files”错误与解决方法
运维实战案例之"Too many open files"错误与解决方法 技术小甜 2017-11-16 15:02:00 浏览869 服务器 shell tomcat 脚本 o ...
- Ubuntu20 修改网卡名称
Ubuntu 修改网卡名称 Ubuntu修改网卡名称 Ubuntu 版本: Ubuntu 20.04 查看当前网卡名称 root@it:~# ip add 1: lo: <LOOPBACK,UP ...
- 008.Ansible文件管理模块
一 stat模块 检查文件状态使用,模块获取文件的状态等信息,类似与linux中的STAT命令可以用来获取文件的属主.可读/写.文件状态等信息 [root@node1 ansible]# stat ...
- IT菜鸟之网线制作
网线是属于OSI七层模型中的物理层:网络中的数据传输媒介 备注:OSI七层模型后面会记录 网线制作所需要的资源素材: 1.网线 2.水晶头(类型:电话线RJ11,宽带线RJ45) 3.网线钳(非必需) ...