T1 interval

亏得昨天晚上改掉了T3并且理解了单调栈,今天一扫这题目就知道要用啥了。

先预处理出以a[i]为最大值的最大左右区间。然后再将a[i]取%!!!是的,要不然会影响单调栈的使用。。。

注意一下,这个题的前缀和与a[i]数组都要取%优化,类似入阵曲》。

可以知道,一个合法的区间应满足

然后就是昨天T3的类似启发式优化,找到距离较小的区间

然后枚举那个区间里的每一个位置,都可以算出一个数(以下拿枚举左区间举例):

等价右面的柿子就是我们枚举要求的。我们相当于求出一个sum[r]然后通过之前处理出的vector数组去右区间寻找等于sum[r]的数的个数(vector记录每个数(取%以后的)出现的位置)。运用便捷的——即可实现。

最后是有一个小容斥,就是在计算区间时没有讨论l==r的情况,这种情况共n个,ans-n即可。

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define write(X) printf("%lld\n",X)
4 #define Min(A,B) ((A)<(B)?(A):(B))
5 #define Max(A,B) ((A)>(B)?(A):(B))
6 using namespace std;
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13
14 const int NN=3e6+5000;
15 int n,K,a[NN],sum[NN],ll[NN],rr[NN],ans;
16 stack<int> s,t;
17 vector<int> g[NN];
18 void work(int k,int l,int r){
19 if(k-l<r-k){
20 for(int i=l;i<=k;i++){
21 int tmp=(sum[i-1]+a[k])%K;
22 int ans1=lower_bound(g[tmp].begin(),g[tmp].end(),k)-g[tmp].begin();
23 int ans2=upper_bound(g[tmp].begin(),g[tmp].end(),r)-g[tmp].begin();
24 ans+=ans2-ans1;
25 }
26 }
27 else{
28 for(int i=k;i<=r;i++){
29 int tmp=(sum[i]-a[k]+K)%K;
30 int ans1=lower_bound(g[tmp].begin(),g[tmp].end(),l-1)-g[tmp].begin();
31 int ans2=upper_bound(g[tmp].begin(),g[tmp].end(),k-1)-g[tmp].begin();
32 ans+=ans2-ans1;
33 }
34 }
35 }
36 namespace WSN{
37 inline int main(){
38 n=read(); K=read();
39 g[0].push_back(0);
40 for(int i=1;i<=n;i++){
41 a[i]=read();
42 sum[i]=(a[i]+sum[i-1])%K;
43 g[sum[i]].push_back(i);
44 }
45 for(int i=1;i<=n;i++){
46 while(!s.empty() && a[i]>a[s.top()]) s.pop();
47 if(s.empty()) ll[i]=1;
48 else ll[i]=s.top()+1;
49 s.push(i);
50 }
51 for(int i=n;i;i--){
52 while(!t.empty() && a[i]>=a[t.top()]) t.pop();
53 if(t.empty()) rr[i]=n;
54 else rr[i]=t.top()-1;
55 t.push(i);
56 }
57 for(int i=1;i<=n;i++) a[i]%=K;
58 for(int i=1;i<=n;i++) work(i,ll[i],rr[i]);
59 write(ans-n);
60 return 0;
61 }
62 }
63 signed main(){return WSN::main();}

T2 random

可以推出一个柿子:

将其化简可以得到:

然后我们只需要先用快速幂处理出$$2^n 2^{nm}$$表示分母,然后我们可以发现每1000003个数就有一个1000003的倍数,则如果分子上面累乘的个数大于1000003,那么在累乘过程中应定会出现0,则所有数都是0,分子为0。如果m<1000003就直接暴力求解

然后我们求的是分子和分母的最简形式,考虑约分。

我们发现分母的质因数全是2,那么我们只要找到分子里面质因数分解后有几个2就行。那么怎么找?我们可以将每个2^n减去的那一个数改写为形式这样的话如果x中有y个2,其最终结果分式那边一定是个奇数,那么从2^n中提取一个2^y剩下一个偶数减去刚才的奇数得一个奇数,则可以按这种方法一直找到所有2的个数。记得不要忘记用乘法逆元!!

 1 #include<bits/stdc++.h>
2 #define int long long
3 #define write(X) printf("%lld ",X)
4 using namespace std;
5 inline int read(){
6 int x=0,f=1; char ch=getchar();
7 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
8 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
9 return x*f;
10 }
11
12 const int mod=1e6+3;
13 int n,m,a,b,c,d,ans1,ans2;
14 inline int qmo(int a,int b){
15 int ans=1,c=mod; a%=c;
16 while(b){
17 if(b&1) ans=(ans*a)%c;
18 a=(a*a)%c;
19 b>>=1;
20 } return ans;
21 }
22 namespace WSN{
23 inline int main(){
24 n=read();m=read();
25 d=a=qmo(2,n%(mod-1));
26 b=qmo(a,m%(mod-1));
27 int inv2=500002,num2=n;
28 for(int i=1;i<m;i++){
29 d=d*(a-i)%mod;
30 if(!d) break;
31 }
32 for(int i=1;(1ll<<i)<=m-1;i++){
33 num2+=(m-1)/(1ll<<i);
34 }
35 c=qmo(inv2,num2);
36 d=d*c%mod;
37 b=b*c%mod;
38 ans1=(b-d+mod)%mod;
39 ans2=b%mod;
40 write(ans1); write(ans2);
41 return 0;
42 }
43 }
44 signed main(){return WSN::main();}

T3 seq

这题上来一看,我去,根本想不到用什么方面的知识。结果,还真不用什么知识,就是个模拟(但就是不会。。。)。

记录一个up,down分别表示最优及最劣情况,每个开一个pair(x,y)表示那一位数的值,以及使用那个数的个数。

然后正向预处理出本应得到的最优,及最劣情况。

具体为如果连续使用了两个同一个数,up就换成新的大数;同理如果大于5个,down的数就更新。

如果遇到有数的空格就进行比较,保证up最优,down最劣即可。

经过小小的思考就可以加上判断不成立的条件。

然后建造一个bin[]桶函数,按照最劣情况填数,如果桶的一个较大值满,则换成小一号的数继续装。

 1 #include<bits/stdc++.h>
2 #define val first
3 #define num second
4 #define int long long
5 #define write(X) printf("%lld\n",X)
6 using namespace std;
7 inline int read(){
8 int x=0,f=1; char ch=getchar();
9 while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
10 while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
11 return x*f;
12 }
13 const int NN=2e5+500,mod=1e6+3;
14 int n,a[NN],bin[NN];
15 pair<int,int> up[NN],down[NN];
16 namespace WSN{
17 inline int main(){
18 n=read();
19 for(int i=1;i<=n;i++) a[i]=read();
20 if(a[1]!=1 && a[1]!=0) {printf("-1\n\n");return 0;}
21 up[1]=make_pair(1,1); down[1]=make_pair(1,1);
22 for(int i=2;i<=n;i++){
23 up[i]=up[i-1]; down[i]=down[i-1];
24 up[i].num++; down[i].num++;
25 if(up[i].num>2) up[i].val++,up[i].num=1;
26 if(down[i].num>5) down[i].val++,down[i].num=1;
27 if(!a[i]) continue;
28 if(up[i].val>a[i]) up[i]=make_pair(a[i],2ll);
29 if(down[i].val<a[i]) down[i]=make_pair(a[i],1);
30 if(down[i].val>a[i] || up[i].val<a[i]) {printf("-1\n\n");return 0;}
31 }
32 for(int i=1;i<=n;i++){
33 }
34 if(up[n].num==1) up[n].val--,up[n].num=up[n-1].num+1;
35 if(up[n].val<down[n].val) {printf("-1\n\n");return 0;}
36 a[n]=up[n].val; write(a[n]);
37 bin[a[n]]=1;
38 for(int i=n-1;i>=1;i--){
39 if(!a[i]){
40 int v=min(a[i+1],up[i].val);
41 if(bin[v]==5) v--;
42 a[i]=v;
43 }
44 bin[a[i]]++;
45 }
46 for(int i=1;i<=n;i++)
47 printf("%lld ",a[i]);
48 return 0;
49 }
50 }
51 signed main(){return WSN::main();}

END


这次考试并未得到自己想要的分数,T1非常可惜,自己想的复杂度是n^2或者nlogn结果出来跟打线段数暴力分一样,哭死好吧,早知道二十分钟线段树把这题干掉直接去打T3了。。。。结果T2,T3都比较蒙敲了暴力水了20分就结束了,可恶。。。。

Noip模拟12 2021.7.12的更多相关文章

  1. Noip模拟51 2021.9.12

    T1 茅山道术 考场上卡在了一个恶心的地方, 当时以为每次施法都会产生新的可以施法的区间,然后想都没细想, 认为不可做,甚至$dfs$也无法打,考后一问发现是自己想多了.. 新产生的区间对答案根本没有 ...

  2. Noip模拟75 2021.10.12

    T1 如何优雅的送分 他说是送分题,我就刚,没刚出来,想到莫比乌斯容斥后就都没推出来 好吧还是不能被恶心的题目,挑衅的语言打乱做题节奏 于是这一场也就没了.... $F(i)$表示$i$的不同质因子集 ...

  3. Noip模拟37 2021.8.12

    T1 数列 真是考场上不是数学的乱推柿子,想定理,是数学的没想出来.. 比较悲伤... 列柿子不用动脑子,就是没有想出来$EXgcd$解不定方程,淦.. 解处一组解后利用比较显然的性质: $x+\fr ...

  4. Noip模拟70 2021.10.6

    T1 暴雨 放在第一道的神仙题,不同的做法,吊人有的都在用线段树维护$set$预处理 我是直接$dp$的,可能代码的复杂度比那种的稍微小一点 设$f[i][j][p][0/1]$表示考虑了前$i$列, ...

  5. Noip模拟76 2021.10.14

    T1 洛希极限 上来一道大数据结构或者单调队列优化$dp$ 真就没分析出来正解复杂度 正解复杂度$O(q+nm)$,但是据说我的复杂度是假的 考虑一个点转移最优情况是从它上面的一个反$L$形转移过来 ...

  6. Noip模拟69 2021.10.5

    考场拼命$yy$高精度结果没学好$for$循环痛失$50pts$,当场枯死 以后一定打对拍,要不考后会... T1 石子游戏 首先要知道典型的$NIM$博弈,就是说如果所有堆石子个数的异或和为$0$则 ...

  7. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...

  8. Noip模拟61 2021.9.25

    T1 交通 考场上想了一个$NPC$.应该吧,是要求出图里面的所有可行的不重复欧拉路 无数种做法都无法解出,时间也都耗在这个上面的,于是就考的挺惨的 以后要是觉得当前思路不可做,就试着换一换思路,千万 ...

  9. Noip模拟59 2021.9.22

    新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...

随机推荐

  1. weblogic漏洞分析之CVE-2017-10271

    weblogic漏洞分析之CVE-2017-10271 一.环境搭建 1)配置docker 这里使用vulhub的环境:CVE-2017-10271 编辑docker-compose.yml文件,加入 ...

  2. HDU2647Reward (拓扑排序)

    Reward Description Dandelion's uncle is a boss of a factory. As the spring festival is coming , he w ...

  3. P7295-[USACO21JAN]Paint by Letters P【平面图欧拉公式】

    正题 题目链接:https://www.luogu.com.cn/problem/P7295 题目大意 给出\(n*m\)的网格,每个格子上有字母,相同字母的四联通相邻格子为连通,每次询问一个子矩阵求 ...

  4. P4357-[CQOI2016]K远点对【K-Dtree】

    正题 题目链接:https://www.luogu.com.cn/problem/P4357 题目大意 平面上给出\(n\)个点,求第\(k\)远的点对距离. 解题思路 \(\text{K-Dtree ...

  5. P3793-由乃救爷爷【分块,ST表】

    正题 题目链接:https://www.luogu.com.cn/problem/P3793 题目大意 给出\(n\)个数字的一个序列\(m\)次询问区间最大值 保证数据随机 \(1\leq n,m\ ...

  6. oracle常见命令

    1.权限 (1)系统权限 系统权限是指对数据库系统的权限和对象结构控制的权限. 如grant create session to 用户名 -赋予用户登录的权限 (2)对象权限 访问其它用户对象的权利 ...

  7. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  8. C++学习笔记:09 函数模板与类模板

    课程<C++语言程序设计进阶>清华大学 郑莉老师) 引入 考虑一个求绝对值函数myabs,对于int,double,float等数据类型需要重载多次,编写多个函数体.函数体逻辑代码完全一致 ...

  9. T-SQL——透视PIVOT动态获取待扩展元素集

    目录 0.背景说明 1.准备测试数据 2.示例1--利用SELECT循环赋值 3.示例2--使用游标 4.示例3--使用FOR XML PATH() 5. 参考 志铭-2021年10月8日 00:57 ...

  10. 数值分析:幂迭代和PageRank算法

    1. 幂迭代算法(简称幂法) (1) 占优特征值和占优特征向量 已知方阵\(\bm{A} \in \R^{n \times n}\), \(\bm{A}\)的占优特征值是量级比\(\bm{A}\)所有 ...