T1T_1T1​——theorem(3926)

Description:

有一个长度为nnn的序列AAA。现在定义一个好连续子序列为子序列元素的按位或之和不小于KKK。求好的连续子序列数量。
n≤105,Ai,K≤109n\le10^5,A_i,K\le10^9n≤105,Ai​,K≤109

Solution:

  • 首先说一下Θ(n)\Theta(n)Θ(n)的想法考试时看错题然后莫名其妙想到了…
  • 因为它是按位或的,那么不难发现,
  • 对于以iii为起点的子序列,当它到达最小的jjj时,恰好不小于KKK时,那么之后n−jn-jn−j都是可以连续下去的。
  • 然后模拟小数据,发现这个就有一个单调性,也就是找到上述的iii,jjj,在统计一下贡献即可。
  • 然而正解是Θ(nlog⁡n)\Theta(n\log n)Θ(nlogn)的…也有许多写法(线段树,ST表)。
  • 这里也有一种类似Θ(n)\Theta(n)Θ(n)的想法。
  • 对于所有以rrr为右端点的区间,其按位或的值最多只有303030种,那么可以记录对于每一个以rrr为右端点的区间,在左端点为哪些值时会使得按位或的值改变。然后对于每个右端点,只用计算出最后一个满足条件的左端点的位置即可。

Code:

#include<bits/stdc++.h>
using namespace std;
#define REP(i,f,t)for(int i=(f),i##_end_=(t);i<=i##_end_;++i)
#define SREP(i,f,t)for(int i=(f),i##_end_=(t);i<i##_end_;++i)
#define DREP(i,f,t)for(int i=(f),i##_end_=(t);i>=i##_end_;--i)
#define db double
#define ll long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f
#define MINF 0xc0c0c0c0
#define Sz(a) sizeof(a)
#define mcl(a,b) memset(a,b,Sz(a))
#define mcp(a,b) memcpy(a,b,Sz(b))
#define pb push_back
#define fi first
#define se second
template<class T>inline bool chkmin(T &x,T y){return y<x?x=y,1:0;}
template<class T>inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
typedef pair<int,int>pii;
template<class T>inline void Rd(T &x){x=0;char c;int f=1;while((c=getchar())<48)if(c=='-')f=-1;do x=(x<<1)+(x<<3)+(c^48);while((c=getchar())>47);x*=f;
}#define N 100002int n,m;
int A[N];struct p60{vector<pii>V[N];void solve(){REP(i,1,n)Rd(A[i]);REP(i,1,n){V[i].pb((pii){A[i],i});int S=A[i];SREP(j,0,V[i-1].size()){if((S|V[i-1][j].fi)>S){S|=V[i-1][j].fi;V[i].pb((pii){S,V[i-1][j].se});}}}ll ans=0;REP(i,1,n) SREP(j,0,V[i].size()){if(V[i][j].fi>=m){ans+=V[i][j].se;break;}}printf("%lld\n",ans);}
}p1;struct p100{void solve(){SREP(i,0,n)Rd(A[i]);int S=0,l=0;ll ans=0;SREP(i,0,n){S|=A[i];if(S>=m){int tmp=0,r=i;while(r>=l){if((tmp|A[r])>=m) break;else tmp|=A[r];--r;}ans+=1ll*(n-i)*(r-l+1);l=r+1;S=tmp;}}printf("%lld\n",ans);  }
}p2;int main(){
//  freopen("theorem.in","r",stdin);
//  freopen("theorem.out","w",stdout);Rd(n),Rd(m);srand(time(NULL));int op=rand()%2;if(op)p1.solve();//O(nlogn)else p2.solve();//O(n)return 0;
}

T2T_2T2​——same(3927)

Description:

有一个长度为nnn的颜色序列,其中颜色有mmm种,有qqq个询问,求区间[li,ri][l_i,r_i][li​,ri​]中,相同颜色的最远距离。
对于不要求强制在线的范围:m≤n,q≤60000m\le n,q\le 60000m≤n,q≤60000
对于强制在线的范围:m≤n,q≤200000m\le n,q \le 200000m≤n,q≤200000

Solution:

  • 一眼看题,就是数据结构维护无脑维护题,想想线段树,想想ST表,最后还是分块合适。(而且由于时限比较卡)
  • 对于离线的做法,我也不知道为什么,我还是用分块的…
  • 离线,离线,那么就要将询问根据右端点排个序,对于每个询问,先找到与之符合的极限右端点,然后进行传统的分块了。
  • 对于强制在线的做法,依旧是分块。
  • 其实两种做法的分块预处理以及查询是差不多的。
  • 预处理:记录以块为单位的区间的答案,而对于区间[L,R][L,R][L,R],若已经可以知道[L+1,R][L+1,R][L+1,R]和[L,R−1][L,R-1][L,R−1]即可转移,易知,转移复杂度是Θ(n2S)\Theta(\frac{n^2}{S})Θ(Sn2​)的。
  • 查询即是传统的分块查询了,对于块内信息,直接查询已预处理的答案,对于边界,直接二分查找,复杂度为Θ(mSlog⁡n)\Theta(mS\log n)Θ(mSlogn)。
  • 那么总复杂度为Θ(n2S+mSlog⁡n)\Theta(\frac{n^2}{S}+mS\log n)Θ(Sn2​+mSlogn),至于SSS,在测了许多数据(面向评测数据)下,还是S=n5S=\frac{\sqrt n}{5}S=5n​​最优。

Code:

#include<bits/stdc++.h>
using namespace std;
#define REP(i,f,t)for(int i=(f),i##_end_=(t);i<=i##_end_;++i)
#define SREP(i,f,t)for(int i=(f),i##_end_=(t);i<i##_end_;++i)
#define DREP(i,f,t)for(int i=(f),i##_end_=(t);i>=i##_end_;--i)
#define db double
#define ll long long
#define INF 0x3f3f3f3f
#define inf 0x3f3f3f3f3f3f3f
#define MINF 0xc0c0c0c0
#define Sz(a) sizeof(a)
#define mcl(a,b) memset(a,b,Sz(a))
#define mcp(a,b) memcpy(a,b,Sz(b))
#define pb push_back
#define fi first
#define se second
template<class T>inline bool chkmin(T &x,T y){return y<x?x=y,1:0;}
template<class T>inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
typedef pair<int,int>pii;
template<class T>inline void Rd(T &x){x=0;char c;int f=1;while((c=getchar())<48)if(c=='-')f=-1;do x=(x<<1)+(x<<3)+(c^48);while((c=getchar())>47);x*=f;
}#define N 200002int n,m,q,p;int A[N];
int pre[N];struct p0{#define M 60002struct ask{int l,r,id;bool operator<(const ask &_)const{return r<_.r; }}Q[M];int S;int res[250][M],ans[M];void Init(){for(int i=0;i*S<n;i++){ REP(j,1,m) pre[j]=-1;int now=0;for(int j=i*S;j<n;j++){if (pre[A[j]]==-1) pre[A[j]]=j;else now=max(now,j-pre[A[j]]);res[i][j]=now;}}}void solve(){S=sqrt(n);SREP(i,0,q) {Rd(Q[i].l),Rd(Q[i].r);if(Q[i].l>Q[i].r)swap(Q[i].l,Q[i].r);Q[i].id=i;--Q[i].l,--Q[i].r;}sort(Q,Q+q);Init();REP(i,1,m)pre[i]=-1;int r=0;SREP(i,0,q){while(r<Q[i].r)++r,pre[A[r]]=r;int tmp=res[Q[i].l/S+1][Q[i].r];for(int j=Q[i].l;j<(Q[i].l/S+1)*S && j<=Q[i].r;++j) chkmax(tmp,pre[A[j]]-j);ans[Q[i].id]=tmp;}SREP(i,0,q) printf("%d\n",ans[i]);}
}p0;struct p1{int S,num;int res[2280][2280];int Mx[N],Mn[N],id[N];vector<int>V[N];vector<int>::iterator it;void Init(){S=sqrt(n)/5;num=n/S;SREP(i,0,n){id[i]=V[A[i]].size();V[A[i]].pb(i);}mcl(Mx,192);mcl(Mn,INF);SREP(L,0,num) SREP(Len,0,num-L){int R=L+Len;int l1=Len*S,r1=min((Len+1)*S,n),l2=R*S,r2=min((R+1)*S,n);SREP(j,l1,r1)chkmin(Mn[A[j]],j);SREP(j,l2,r2)chkmax(Mx[A[j]],j);SREP(j,l1,r1)chkmax(res[Len][R],Mx[A[j]]-Mn[A[j]]);SREP(j,l1,r1)Mn[A[j]]=INF;SREP(j,l2,r2)Mx[A[j]]=-INF-1;if(Len)chkmax(res[Len-1][R],res[Len][R]);chkmax(res[Len][R+1],res[Len][R]);}}int find_mx(int x,int pos){int L=0,R=V[x].size()-1,tmp;while(L<=R){int mid=L+R>>1;if(V[x][mid]<=pos)tmp=V[x][mid],L=mid+1;else R=mid-1;}return tmp;}int find_mn(int x,int pos){int L=0,R=V[x].size()-1,tmp;while(L<=R){int mid=L+R>>1;if(V[x][mid]>=pos)tmp=V[x][mid],R=mid-1;else L=mid+1;}return tmp;}void solve(){Init();int l,r,ans=0;while(q--){Rd(l),Rd(r);l=(l+ans-1)%n;r=(r+ans-1)%n;if(l>r)swap(l,r);ans=0;int L=l/S,R=r/S;if(L+1<=R-1)ans=res[L+1][R-1];if(L==R){REP(j,l,r){if(id[j] && V[A[j]][id[j]-1]>=l)continue;SREP(k,id[j],V[A[j]].size()){if(V[A[j]][k]>r)break;chkmax(ans,V[A[j]][k]-j);}}}else {REP(j,l,L*S+S-1) chkmax(ans,find_mx(A[j],r)-j);REP(j,R*S,r) chkmax(ans,j-find_mn(A[j],l));}printf("%d\n",ans);}}
}p1;struct p60{void solve(){int ans=0,l,r;while(q--){Rd(l),Rd(r);l=(l+ans*p-1)%n,r=(r+ans*p-1)%n;if(l>r)swap(l,r);ans=0;REP(i,1,m)pre[i]=-1;REP(i,l,r){if(pre[A[i]]==-1)pre[A[i]]=i;else chkmax(ans,i-pre[A[i]]);}printf("%d\n",ans);}}
}p60;int main(){
//  freopen("same.in","r",stdin);
//  freopen("same.out","w",stdout);Rd(n),Rd(m),Rd(q),Rd(p);SREP(i,0,n) Rd(A[i]);if(n<=1000 && m<=1000 && q<=1000)p60.solve();else if(!p)p0.solve();else p1.solve();return 0;
}

T3T_3T3​——ioi(3928)

Description:

总共有nnn个人站成一排给这nn个人投票,可以投给自己,但是不能和相邻的人投同一个人,问得到票数最多的人的人数期望为多少。

n≤50n\le 50n≤50

Solution:

  • 这里还是想喷一下出题人将交互题出成noip题,十分dt…
  • 那么对于打表的方法,可能有多种毕竟是打表题
  • 而正解是dpdpdp,也是因为这里的nnn比较小。
  • 定义dp[i][j][s]dp[i][j][s]dp[i][j][s]表示前iii个人,目前第iii个人有jjj的投票状态为sss。

Code:

(待更新)

noip by 20XZH02相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. [OI]Noip 2018 题解总结(普及)

    考砸了,还有原谅我代码十分有限的可读性. 一个人的真正伟大之处就在于他能够认识到自己的渺小.--保罗 从一年前初一九月到现在18年10月接触OI已经有一年了.几次模拟赛也自我感觉良好,都过了一等的线, ...

  3. Noip前的大抱佛脚----字符串

    目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...

  4. NOIp 图论算法专题总结 (1):最短路、最小生成树、最近公共祖先

    系列索引: NOIp 图论算法专题总结 (1) NOIp 图论算法专题总结 (2) NOIp 图论算法专题总结 (3) 最短路 Floyd 基本思路:枚举所有点与点的中点,如果从中点走最短,更新两点间 ...

  5. python能参加奥赛吗-家长们注意了!关于信息学奥赛(NOIP),你需要知道这些...

    原标题:家长们注意了!关于信息学奥赛(NOIP),你需要知道这些 导读:获得全国青少年信息学奥林匹克联赛(NOIP)一等奖的应届高中毕业生,均具有保送进入高校就读的资格.部分地区一等奖获奖选手还享有高 ...

  6. python期末考试题及答案翻译-用 python 解 NOIP 竞赛题

    以下为2017年全国 NOIP 提高组复赛的第1题: image.png image.png --------------------------------------- 问题展示完毕 ------ ...

  7. 过河 2005年NOIP全国联赛提高组(离散化+dp)

    1105 过河 2005年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description 在河上有一 ...

  8. 【游记】NOIP 2017

    时间:2017.11.11~2017.11.12 地点:广东省广州市第六中学 Day1 T1:看到题目,心想这种题目也能放在T1? 这个结论我之前遇到过至少3次,自己也简单证明过.初见是NOIP200 ...

  9. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

最新文章

  1. 关系型数据库到HBase的数据储存方式变迁
  2. flex与flash元件交互
  3. 使用 Windows Sysinternals 工具进行故障排除
  4. ACDU活动回顾:@DBA,前辈指路不迷茫
  5. 明年5G智能手机大爆发!出货量惊人
  6. php中的require(),PHP中include()与require()的区别说明
  7. java 实例域_Java实例域初始化
  8. 【渝粤教育】国家开放大学2018年春季 0032-21T农业经济学 参考试题
  9. 自动驾驶竟然排名倒数第一?苹果甩PDF否认
  10. [转]git使用指南系列
  11. 重SQL开发和重 Java开发比较
  12. eclipse中创建一个server使用tomcat服务
  13. oracle如何判断节假日,oracle function 用于判断是否为节假日
  14. 制作 macOS Mojave U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  15. c# Pdf文件加密和解密
  16. python怎么搜索文献_python论文参考文献有哪些
  17. 无线设置时服务器无响应怎么办,无线路由器怎么设置服务器未响应
  18. WordPress文件下载管理器插件WordPress Download Manager
  19. [ 代码审计篇 ] 代码审计案例详解(二) XXE代码审计案例
  20. 学计算机去华科还是哈工大,我想学工科,哈工大、武汉大学、东南大学、华科,到底选哪个?...

热门文章

  1. jquery canvas网页画布画图
  2. 差分方程MATLAB求冲激响应,用matlab求解某已知的差分方程的单位冲激响应全过程...
  3. 联通(上海)产互一面
  4. 精心为学弟学妹整理的 C语言/C++ 项目合集
  5. WPF 入门教程(一)
  6. c语言中0x11是多少,C语言中的符号
  7. 敏捷已死:一场程序员们历经20年的失败反叛
  8. 如何防止单元格在Google表格中进行编辑
  9. 2、股权融资 - 打造企业上市系列文章
  10. GIS开发之二维地下管线综合管理系统(Arcgis)第四节 查询(2)