noip模拟11
T1 math
就挺水一小破题目,第一眼看好像不可做,看着看着突然发现假设x和y的最大公约数是gcd,那么kx%y一定是gcd的倍数,
然后想到可以把所有数字与k的gcd求出来,打一个完全背包,可是仔细一算肯定会t掉,然后又仔细想了下,发现既然都是gcd的倍数
那么只要把所有的数求一个gcd就可以满足情况了,最后直接在k的范围内往上加gcd,O(n)直接切了
不过跑大样例的时候,文本比较总是wa,可是看文件字节大小,以及拿肉眼看都一样,有点玄学,开大样例的时候,gedit直接卡爆了,直接白屏了
被迫提交代码重启。。。不过这题确实挺水的,某XIN直接跑rand都切了,可是赛时只有9个人切了,大家的基本功还是不扎实,好好练;
1 #include<bits/stdc++.h>//瞎jb搞就行了
2 using namespace std;
3 inline int read()
4 {
5 int x=0,f=1;
6 char ch=getchar();
7 while(ch<'0'||ch>'9')
8 {
9 if(ch=='-')
10 f=-1;
11 ch=getchar();
12 }
13 while(ch>='0'&&ch<='9')
14 {
15 x=(x<<1)+(x<<3)+(ch^48);
16 ch=getchar();
17 }
18 return x*f;
19 }
20 inline int min(int x,int y){return x<y?x:y;}
21 inline int max(int x,int y){return x>y?x:y;}
22 inline void swap(int &x,int &y){x^=y^=x^=y;}
23 inline int abs(int x){return x<0?-x:x;}
24 const int maxn=5e5+1;
25 int n,k;
26 int a[maxn];
27 int gcd;
28 bool b[2000000];
29 inline int Gcd(int a,int b)
30 {
31 if(!b)
32 return a;
33 return Gcd(b,a%b);
34 }
35 int main()
36 {
37 n=read();
38 k=read();
39 gcd=k;
40 int ans=0;
41 for(int i=1;i<=n;i++)
42 {
43 a[i]=read(),gcd=Gcd(a[i],gcd);
44 }
45 b[0]=1;
46 for(int i=1;i<=k;i++)
47 {
48 b[(i*gcd)%k]=1;
49 }
50 for(int i=0;i<=k;i++)
51 if(b[i])
52 ans++;
53 printf("%d\n",ans);
54 for(int i=0;i<=k;i++)
55 if(b[i])
56 printf("%d ",i);
57 }
t1
T2 biology
这个题第一眼看这个式子觉得可能在考矩阵,可是仔细一看式子就不是了,由于这个题他说a[ xi ][ yi ]要小于a[ x(i+1) ][ y(i+1) ]的,所以考虑对这些进行离散化
将所有点进行分层,一层一层地转移,我们把绝对值拆开,拆成f[ x ][ y ]+x+y,f[ x ][ y ]+x-y,f[ x ][ y ]-x+y和f[ x ][ y ]-x-y,来表示xi,yi与x(i-1)y(i-1)的关系,
我们维护这种情况这个区间范围的最大值,用来进行下层的转移,考试的时候写了4个树状数组来维护最值,复杂度O(nlog( n )mlog( m )),只能拿到80分
考试后发现,其实根本没有必要用树状数组,因为只要满足每层最大的那种情况就好了,所以说直接记录4个变量来维护就好,一个常数稍微大一点的O(mn)
直接切了
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read()
5 {
6 int x=0,f=1;
7 char ch=getchar();
8 while(ch<'0'||ch>'9')
9 {
10 if(ch=='-')
11 f=-1;
12 ch=getchar();
13 }
14 while(ch>='0'&&ch<='9')
15 {
16 x=(x<<1)+(x<<3)+(ch^48);
17 ch=getchar();
18 }
19 return x*f;
20 }
21 inline void swap(int &x,int &y){x^=y^=x^=y;}
22 inline int abs(int x){return x<0?-x:x;}
23 int n,m;
24 int a[2001][2001],b[2001][2001];
25 int dp[2001][2001];
26 struct node{
27 int l,r;
28 };
29 vector<node> q[1000001];
30 bool app[1000001];
31 int num[1000001];
32 int val[1000001],key[1000001],cnt,maxx;
33 struct szsz
34 {
35 int c[2001][2001];
36 inline int lowbit(int x){return x&-x;}
37 void update(int x,int y,int val)
38 {
39 for(int i=x;i<=n;i+=lowbit(i))
40 for(int j=y;j<=m;j+=lowbit(j))
41 c[i][j]=max(c[i][j],val);
42 }
43 inline int query(int x,int y)
44 {
45 int val=0;
46 for(int i=x;i;i-=lowbit(i))
47 for(int j=y;j;j-=lowbit(j))
48 val=max(val,c[i][j]);
49 return val;
50 }
51 }c1,c2,c3,c4;
52 signed main()
53 {
54 n=read();
55 m=read();
56 for(int i=1;i<=n;i++)
57 {
58 for(int j=1;j<=m;j++)
59 {
60 a[i][j]=read();
61 if(!app[a[i][j]]&&a[i][j])
62 {
63 app[a[i][j]]=1;
64 num[++cnt]=a[i][j];
65 }
66 }
67 }
68 for(int i=1;i<=n;i++)
69 {
70 for(int j=1;j<=n;j++)
71 {
72 b[i][j]=read();
73 }
74 }
75 sort(num+1,num+cnt+1);
76 for(int i=1;i<=cnt;i++)
77 {
78 key[num[i]]=i;
79 }
80 for(int i=1;i<=n;i++)
81 {
82 for(int j=1;j<=n;j++)
83 {
84 if(!a[i][j])
85 continue;
86 node x;
87 x.l=i,x.r=j;
88 q[key[a[i][j]]].push_back(x);
89 }
90 }
91 int sz=q[1].size();
92 for(int i=0;i<sz;i++)
93 {
94 int x=q[1][i].l,y=q[1][i].r;
95 c1.update(x,y,b[x][y]-x-y);
96 c2.update(x,m-y+1,b[x][y]-x+y);
97 c3.update(n-x+1,y,b[x][y]+x-y);
98 c4.update(n-x+1,m-y+1,b[x][y]+x+y);
99 }
100 for(int i=2;i<=cnt;i++)
101 {
102 sz=q[i].size();
103 for(int j=0;j<sz;j++)
104 {
105 int maxx=0,x=q[i][j].l,y=q[i][j].r;
106 maxx=c1.query(x,y)+x+y+b[x][y];
107 dp[x][y]=max(maxx,dp[x][y]);
108 maxx=c2.query(x,m-y+1)+x-y+b[x][y];
109 dp[x][y]=max(maxx,dp[x][y]);
110 maxx=c3.query(n-x+1,y)-x+y+b[x][y];
111 dp[x][y]=max(maxx,dp[x][y]);
112 maxx=c4.query(n-x+1,m-y+1)-x-y+b[x][y];
113 dp[x][y]=max(maxx,dp[x][y]);
114 }
115 for(int j=0;j<sz;j++)
116 {
117 int x=q[i][j].l,y=q[i][j].r;
118 c1.update(x,y,dp[x][y]-x-y);
119 c2.update(x,m-y+1,dp[x][y]-x+y);
120 c3.update(n-x+1,y,dp[x][y]+x-y);
121 c4.update(n-x+1,m-y+1,dp[x][y]+x+y);
122 }
123 }
124 int ans=0;
125 for(int i=1;i<=n;i++)
126 {
127 for(int j=1;j<=m;j++)
128 {
129 ans=max(ans,dp[i][j]);
130 }
131 }
132 cout<<ans;
133 }
80分
1 #include<bits/stdc++.h>
2 #define int long long
3 using namespace std;
4 inline int read()
5 {
6 int x=0,f=1;
7 char ch=getchar();
8 while(ch<'0'||ch>'9')
9 {
10 if(ch=='-')
11 f=-1;
12 ch=getchar();
13 }
14 while(ch>='0'&&ch<='9')
15 {
16 x=(x<<1)+(x<<3)+(ch^48);
17 ch=getchar();
18 }
19 return x*f;
20 }
21 struct node{
22 int l,r;
23 };
24 inline int max(int x,int y){return x<y?y:x;}
25 inline int min(int x,int y){return x>y?y:x;}
26 inline int abs(int x,int y){return x<0?-x:x;}
27 inline void swap(int &x,int &y){x^=y^=x^=y;}
28 const int maxn=2001;
29 const int maxm=1e6+5;
30 const int inf=1e15+1;
31 int a[maxn][maxn],b[maxn][maxn];
32 int dp[maxn][maxn];
33 int key[maxm],x,y,rx,ry,mx1,mx2,mx3,mx4,num[maxm],n,m,cnt;
34 bool app[maxm];
35 vector<node> q[maxm];
36 inline int realx(int x,int y){return (x+y)>>1;}//这是真正的x,y坐标
37 inline int realy(int x,int y){return (x-y)>>1;}//突然发现,好像转不转换都一样
38 signed main()
39 {
40 n=read();
41 m=read();
42 for(int i=1;i<=n;i++)
43 {
44 for(int j=1;j<=m;j++)
45 {
46 a[i][j]=read();
47 if(!app[a[i][j]]&&a[i][j])
48 {
49 num[++cnt]=a[i][j];
50 app[a[i][j]]=1;
51 }
52 }
53 }
54 for(int i=1;i<=n;i++)
55 {
56 for(int j=1;j<=m;j++)
57 b[i][j]=read();
58 }
59 sort(num+1,num+1+cnt);
60 for(int i=1;i<=cnt;i++)
61 {
62 key[num[i]]=i;
63 }
64 for(int i=1;i<=n;i++)
65 {
66 for(int j=1;j<=m;j++)
67 {
68 if(!a[i][j])
69 continue;
70 q[key[a[i][j]]].push_back({i+j,i-j});
71 }
72 }
73 mx1=mx2=mx3=mx4=-inf;
74 int sz=q[1].size();
75 for(int i=0;i<sz;i++)
76 {
77 x=q[1][i].l,y=q[1][i].r;
78 rx=realx(x,y),ry=realy(x,y);
79 mx1=max(mx1,b[rx][ry]-x);
80 mx2=max(mx2,b[rx][ry]-y);
81 mx3=max(mx3,b[rx][ry]+y);
82 mx4=max(mx4,b[rx][ry]+x);
83 }
84 int maxx=0;
85 for(int i=2;i<=cnt;i++)
86 {
87 sz=q[i].size();
88 for(int j=0;j<sz;j++)
89 {
90 x=q[i][j].l,y=q[i][j].r;
91 rx=realx(x,y),ry=realy(x,y);
92 maxx=0;
93 maxx=max(maxx,mx1+x);
94 maxx=max(maxx,mx2+y);
95 maxx=max(maxx,mx3-y);
96 maxx=max(maxx,mx4-x);
97 dp[rx][ry]=maxx+b[rx][ry];
98 }
99 for(int j=0;j<sz;j++)
100 {
101 x=q[i][j].l,y=q[i][j].r;
102 rx=realx(x,y),ry=realy(x,y);
103 mx1=max(mx1,dp[rx][ry]-x);
104 mx2=max(mx2,dp[rx][ry]-y);
105 mx3=max(mx3,dp[rx][ry]+y);
106 mx4=max(mx4,dp[rx][ry]+x);
107 }
108 }
109 int ans=0;
110 for(int i=1;i<=n;i++)
111 {
112 for(int j=1;j<=m;j++)
113 ans=max(ans,dp[i][j]);
114 }
115 cout<<ans;
116 }
AC
T3 english
考试的时候一直在调t2,调过了之后,就只剩2分钟了,没来得及写这题,考完之后发现随便打个线段树,然后再利用特殊性质直接输出0,就能骗到30分,10分钟左右吧
挺气的,以后还是先把每个题的暴力打出来再说吧,其实这道题的部分分数是很多的
我们先来看ans1,首先我们统计一下这个在i之前二进制第k位是1的数的个数,然后写一个单调栈,求出以i为最大值的最大区间来,然后枚举这n个区间,我们利用启发式合并的原理,
跑一个比较小的区间,然后用另外一半来匹配,挺好推的,式子就不过多阐述了。
重点是ans2
ans2的话需要用到可持久化trie树,可以用那个来查询出异或a[ r ]>a[ i ]的 l 的个数,那么不会可持久化trie树的话,建议从主席树开始看一下,剩下的就没啥了
1 #include<bits/stdc++.h>
2 #define lid id<<1
3 #define rid id<<1|1
4 #define int long long
5 using namespace std;
6 inline int read()
7 {
8 int x=0,f=1;
9 char ch=getchar();
10 while(ch<'0'||ch>'9')
11 {
12 if(ch=='-') f=-1;
13 ch=getchar();
14 }
15 while(ch>='0'&&ch<='9')
16 {
17 x=(x<<1)+(x<<3)+(ch^48);
18 ch=getchar();
19 }
20 return x*f;
21 }
22 const int maxn=1e5+1;
23 const int mod=1e9+7;
24 int n,m;
25 int a[maxn];
26 int f[maxn][22];
27 int le[maxn];
28 int re[maxn],ans1,ans2,opt;
29 stack<int >s;
30 struct seg_tree{
31 int l,r,maxx;
32 }tr[maxn<<2];
33 struct tire{
34 int cnm,root[maxn],ch[maxn*22][2],size[maxn*22];
35 void insert(int pre,int &now,int i,int x)
36 {
37 now=++cnm;
38 size[now]=size[pre];
39 if(i<0){size[now]++;return ;}
40 int d=(x>>i)&1;
41 ch[now][d^1]=ch[pre][d^1];
42 insert(ch[pre][d],ch[now][d],i-1,x);
43 size[now]=size[ch[now][0]]+size[ch[now][1]];
44 return ;
45 }
46 void ins(int x,int pos){insert(root[pos-1],root[pos],20,x);}
47 int query(int x,int y,int pos)
48 {
49 int p=root[pos],res=0;
50 for(int i=20;i>=0;i--)
51 {
52 int a=(x>>i)&1,b=(y>>i)&1;
53 if(!b)
54 {
55 res+=size[ch[p][a^1]];
56 p=ch[p][a];
57 }
58 else p=ch[p][a^1];
59 if(!p) break;
60 }
61 return res;
62 }
63 }p;
64 void cz(int k,int l,int r)
65 {
66 if(k-l<r-k)
67 {
68 for(int j=l;j<=k;j++)
69 {
70 (ans1+=a[j]*a[k]%mod*(r-k+1)%mod)%=mod;
71 for(int i=20;i>=0;i--)
72 {
73 int now=(a[j]>>i)&1;
74 if(!now)(ans1+=(1<<i)*(f[r][i]-f[k-1][i])%mod*a[k]%mod)%=mod;
75 else (ans1-=(1<<i)*(f[r][i]-f[k-1][i])%mod*a[k]%mod)%=mod,ans1=(ans1+mod)%mod;
76 }
77 ans2=(ans2+(p.query(a[j],a[k],r)-p.query(a[j],a[k],k-1)+mod)%mod*a[k]%mod)%mod;
78 }
79 }
80 else
81 {
82 for(int j=k;j<=r;j++)
83 {
84 (ans1+=a[j]*a[k]%mod*(k-l+1)%mod)%=mod;
85 for(int i=20;i>=0;i--)
86 {
87 int now=(a[j]>>i)&1;
88 if(!now)(ans1+=(1<<i)*(f[k][i]-f[l-1][i])%mod*a[k]%mod)%=mod;
89 else (ans1-=(1<<i)*(f[k][i]-f[l-1][i])%mod*a[k]%mod)%=mod,ans1=(ans1+mod)%mod;
90 }
91 ans2=(ans2+(p.query(a[j],a[k],k)-p.query(a[j],a[k],l-1)+mod)%mod*a[k]%mod)%mod;
92 }
93 }
94 }
95 signed main()
96 {
97 n=read(),opt=read();
98 for(int i=1;i<=n;i++)
99 a[i]=read(),p.ins(a[i],i);
100 for(int i=1;i<=n;i++)
101 {
102 for(int j=0;j<=20;j++)
103 {
104 f[i][j]+=f[i-1][j];
105 if((a[i]>>j)&1)f[i][j]++;
106 }
107 }
108 for(int i=1;i<=n;i++)
109 {
110 while(!s.empty()&&a[i]>a[s.top()])s.pop();
111 le[i]=s.empty()?1:s.top()+1;
112 s.push(i);
113 }
114 while(!s.empty())
115 s.pop();
116 for(int i=n;i;i--)
117 {
118 while(!s.empty()&&a[i]>=a[s.top()])s.pop();
119 re[i]=s.empty()?n:s.top()-1;
120 s.push(i);
121 }
122 for(int i=1;i<=n;i++)
123 cz(i,le[i],re[i]);
124 if(opt==1||opt==3)
125 cout<<ans1<<endl;
126 if(opt==2||opt==3)
127 cout<<ans2<<endl;
128 }
T3
noip模拟11的更多相关文章
- 8.1 NOIP模拟11
8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...
- Noip模拟11 2021.7.11
T1 math 其实看看题面,看看给的那机组数据即可看出规律了(然而当时并没有,只是发现模数的循环节,存了个vector,接下来就暴力了) 有个柿子: 其实就是裴蜀定理. 然后想一想的话就是 那么只要 ...
- NOIP模拟 11
差点迟到没赶上开题 开题后看了T1,好像一道原题,没分析复杂度直接敲了个NC线段树,敲了个暴力,敲了个对拍,就1h了.. 对拍还对出错了,发现标记下传有点问题,改了以后对拍通过,就把T1扔掉看T2 觉 ...
- [考试总结]noip模拟11
菜 这次考试又是骗了一堆分数... 然而其实一个正解都没写... \(T1\) 的方法说实话确实不是很正统.... 然而却 \(A\) 了... 在打完 \(T1\) 后拍了老长时间... 然后就耽搁 ...
- NOIP 模拟 $11\; \rm english$
题解 本题有一定代码难度 对于需要区间最大值,可以反过来考虑,先预处理出每个数所能扩展的最大边界,也就是说,求出一个最大的区间,其最大值为这个数,单调栈 \(\mathcal O(n)\) 求解 那么 ...
- NOIP 模拟 $11\; \rm biology$
题解 首先对 \(a\) 离散化,则可推出转移方程 \[dp_{i,j}=\max\{{dp_{{i^{'}},{j^{'}}}+|i-i^{'}|+|j-j^{'}|}\}+b_{i,j} \;\; ...
- NOIP 模拟 $11\;\rm math$
题解 签到题(然而还是不会) 考虑所有可能的值一定是 \(\in [0,k)\),且一定为 \(gcd(a_1,a_2,...a_n,k)\) 的倍数. 证明: 设 \(tmp=b_1a_1+b_2a ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- 11/1 NOIP 模拟赛
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...
随机推荐
- C# 加载Word的3种方法
本次经验内容分享通过C#程序来加载Word文档的3种不同方法.分别是: 1. 加载本地Word文档 2. 以只读模式加载Word文档 3. 从流加载Word [程序环境] Windows 10 Vis ...
- IP 地址无效化
给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本. 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 ".". 示例 ...
- Vmware 15 安装 win7 虚拟机 (初学者操作与详解教程)
@ 目录 一.镜像下载 1.什么是镜像 2.常见的系统镜像文件格式 3.下载win7旗舰版镜像 二.VMware Workstation 下载 1.什么是虚拟机 2.VMware 主要功能 3.VMw ...
- Jmeter系列(29)- 性能指标(2) | 并发数
并发数 概念 同时承载正常使用系统功能的用户数量:系统能够同时处理请求的数目. 通过问题详解 问题:网站的并发数,究竟指的同时提交请求的用户数目,还是用户同时提交的请求的数目? 答案:根据这句描述&q ...
- Shell系列(20)- 字符截取命令cut
前言 grep是按行提取:cut默认是通过制表符,按列提取,不能识别用空格作为分隔符 语法 cut [选项] [文件] 选项 -f :列号,截取哪几列数据,多个列号用逗号隔开:列与列之间默认用TAB制 ...
- 低差异序列 (low-discrepancy sequences)之Hammerysley在半球中采样点方法的介绍
半球上的Hammersley 源作者:Holger Dammertz 一组关于如何在2D中使用Hammersley点集以在着色器程序中快速实用地生成半球方向的笔记.如果你发现任何错误或有意见,不要犹豫 ...
- Jmeter压测学习1—第一个项目:登录
我用的是我们公司的测试环境练习的 网址:http://****:9000/login.html 账号是admin 密码:123456 一.打开Jmeter 找到安装目录:bin->Jmeter ...
- Java MD5和SHA256等常用加密算法
前言 我们在做java项目开发的时候,在前后端接口分离模式下,接口信息需要加密处理,做签名认证,还有在用户登录信息密码等也都需要数据加密.信息加密是现在几乎所有项目都需要用到的技术,身份认证.单点登陆 ...
- 让前端的下拉框支持单选、多选及全选,后台MyBaits解决方案
目录 一.解决思路 二.请求参数 三.后台相关代码 四.Mybatis注意要点 一.解决思路 让前端的下拉框支持单选.多选及全选,后台让Mybatis使用** trim **标签拼接动态SQL,实 ...
- 计算机网络-4-1-2-分类的IP地址
有关IP最重要的文档就是互联网的正式标准RFC 791 IP地址及其表示方法 整个互联网就是一个单一,抽象的网络,IP地址就是给互联网上的每一台主机(或者路由器)的每一个接口分配一个在全世界范围内都是 ...