21.7.24 test
\(NOIP\) 模拟赛
考差了。
T1签到题。注意存在字符串长度为0,不能直接模。\(100\rightarrow0\)
代码:
#include<bits/stdc++.h>
using namespace std;
int k1,k2,k3,len;
string s,t;
int s1[85],s2[85],s3[85];
char c1[85],c2[85],c3[85];
signed main(){
freopen("a.in","r",stdin);
freopen("a.in","w",stdout);
cin>>k1>>k2>>k3>>s;
t=s;len=s.length();
for(int i=0;i<len;i++){
if(s[i]>='a'&&s[i]<='i')s1[++s1[0]]=i,c1[s1[0]]=s[i];
else if(s[i]>='j'&&s[i]<='r')s2[++s2[0]]=i,c2[s2[0]]=s[i];
else s3[++s3[0]]=i,c3[s3[0]]=s[i];
}
k1%=s1[0],k2%=s2[0],k3%=s3[0];
for(int i=1;i<=s1[0];i++){
int v=i+k1;if(v>s1[0])v%=s1[0];
t[s1[v]]=c1[i];
}
for(int i=1;i<=s2[0];i++){
int v=i+k2;if(v>s2[0])v%=s2[0];
t[s2[v]]=c2[i];
}
for(int i=1;i<=s3[0];i++){
int v=i+k3;if(v>s3[0])v%=s3[0];
t[s3[v]]=c3[i];
}
cout<<t;
return 0;
}
T2
可以看出是平面最近点对,之前看到过但没做。。。\(100\rightarrow40\)
经典\(O(n\log n)\) 分治做法。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=100005;
struct node{
int x,y;
}t[N],A[N],B[N];
int n;
inline bool cmp1(node a,node b){return a.x<b.x;}
inline bool cmp2(node a,node b){return a.y<b.y;}
inline int dis(node a,node b){
int tx=a.x-b.x,ty=a.y-b.y;
return tx*tx+ty*ty;
}
inline int binl(int key,int bn){
int l=1,r=bn,mid;
while(l<r){
mid=(l+r)>>1;
if(A[mid].y>key)r=mid;
else l=mid+1;
}
return l;
}
inline int binr(int key,int bn){
int l=1,r=bn,mid;
while(l<r){
mid=(l+r+1)>>1;
if(A[mid].y<key)l=mid;
else r=mid-1;
}
return l;
}
inline int solve(int l,int r){
if(l==r)return 0x7fffffffffffffff;
int mid=(l+r)>>1;
int d1=solve(l,mid),d2=solve(mid+1,r),d=min(d1,d2),an=0,bn=0;
for(int i=mid;t[mid].x-t[i].x<d&&i>=l;i--)
A[++an]=t[i];
for(int i=mid+1;t[i].x-t[mid].x<d&&i<=r;i++)
B[++bn]=t[i];
sort(B+1,B+1+bn,cmp2);
sort(A+1,A+1+an,cmp2);
int tl=binl(B[1].y-d,an),tr=binr(B[1].y+d,an);
for(int i=1;i<=bn;i++){
while(A[tl].y<=B[i].y-sqrt(d)&&tl<an)tl++;
while(A[tr+1].y<B[i].y+sqrt(d)&&tr<bn)tr++;
for(int j=tl;j<=tr;j++)
d=min(d,dis(B[i],A[j]));
}
return d;
}
signed main(){
n=in;
for(int i=1;i<=n;i++){
t[i].y=t[i-1].y+in;
t[i].x=i;
}
sort(t+1,t+1+n,cmp1);
printf("%lld",solve(1,n));
return 0;
}
T3
需要对两个函数进行分析。正解链剖线段树。但暴力dfs加小优化也能A。我有想过优化但认为其能被卡,所以\(100\rightarrow40\)
代码:
#include<bits/stdc++.h>
using namespace std;
#define in read()
inline int read(){
int p=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){p=p*10+c-'0';c=getchar();}
return p*f;
}
const int N=200005;
struct edge{
int v,next;
}e[N*2];
int head[N],en;
void insert(int u,int v){
e[++en].v=v;
e[en].next=head[u];
head[u]=en;
}
int n,q,a[N],fa[N],f1[N],f2[N];
void dfs(int u){
int t1=f1[u],t2=f2[u];
if(f1[fa[u]]+1<a[u])f1[u]=a[u],f2[u]=1;
else if(f1[fa[u]]+1>a[u])f1[u]=f1[fa[u]]+1,f2[u]=f2[fa[u]];
else f1[u]=f1[fa[u]]+1,f2[u]=f2[fa[u]]+1;
if(t1==f1[u]&&t2==f2[u])return ;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(v==fa[u])continue;
fa[v]=u;
dfs(v);
}
}
signed main(){
//freopen("c.in","r",stdin);
//freopen("c.out","w",stdout);
n=in;
for(int i=1;i<=n;i++)
a[i]=in;
for(int i=1;i<n;i++){
int u=in,v=in;
insert(u,v);
insert(v,u);
}
f1[1]=a[1],f2[1]=1;
for(int i=head[1];i;i=e[i].next){
int v=e[i].v;
fa[v]=1;
dfs(v);
}
q=in;
for(int i=1;i<=q;i++){
int opt=in;
if(opt==0){
int u=in,val=in;
a[u]=val;
dfs(u);
}
if(opt==1){
int u=in;
cout<<f1[u]<<" "<<f2[u]<<'\n';
}
}
return 0;
}
T4
在用权值线段树求LIS时做些修改即可,但我写挂了。\(100\rightarrow0\)
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=50005;
const int mod=1000000007;
int n;
int a[N];
int qn,q[N];
int bin(int key){
int l=1,r=qn;
int mid;
while(l<r){
mid=(l+r)>>1;
if(q[mid]>key)r=mid-1;
else if(q[mid]<key)l=mid+1;
else{l=mid;break;}
}
return l;
}
int len[N],fro[N];
//seg_tree----------------
#define m(x) tree[x].m
#define sum(x) tree[x].sum
struct node{
int sum,m;
}tree[4*N];
void built(int l,int r,int p){
m(p)=sum(p)=0;
if(l==r)return ;
int mid=(l+r)>>1;
built(l,mid,p<<1);
built(mid+1,r,p<<1|1);
return ;
}
struct temp{int maxn,many;};
temp query(int l,int r,int p,int ql,int qr){
temp ans;
ans.many=ans.maxn=0;
if(ql>qr)return ans;
if(l>=ql&&r<=qr){
ans.maxn=m(p);
ans.many=sum(p);
return ans;
}
int mid=(l+r)>>1;
if(ql<=mid)ans=query(l,mid,p<<1,ql,qr);
if(qr>mid){
if(!ans.maxn)ans=query(mid+1,r,p<<1|1,ql,qr);
else{
temp ans1=query(mid+1,r,p<<1|1,ql,qr);
if(ans.maxn==ans1.maxn) ans.many+=ans1.many;
else if(ans.maxn<ans1.maxn)ans.maxn=ans1.maxn,ans.many=ans1.many;
}
}
return ans;
}
void update(int l,int r,int p,int u,int d){
if(l==r){
if(d==m(p))sum(p)++;
if(d>m(p)){m(p)=d;sum(p)=1;}
return ;
}
int mid=(l+r)>>1;
if(u<=mid)update(l,mid,p<<1,u,d);
else update(mid+1,r,p<<1|1,u,d);
if(m(p<<1)==m(p<<1|1)){
m(p)=m(p<<1);
sum(p)=sum(p<<1)+sum(p<<1|1);
}
else if(m(p<<1)>m(p<<1|1)){
m(p)=m(p<<1);
sum(p)=sum(p<<1);
}
else{
m(p)=m(p<<1|1);
sum(p)=sum(p<<1|1);
}
return ;
}
//------------------------
signed main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
q[i]=a[i];
}
sort(q+1,q+1+n);
qn=unique(q+1,q+1+n)-(q+1);
for(int i=1;i<=n;i++)
a[i]=bin(a[i]);
built(1,qn,1);
int maxlen=0,tans=0;
for(int i=1;i<=n;i++){
temp t=query(1,qn,1,1,a[i]-1);
len[i]=1+t.maxn;
fro[i]=t.many;
update(1,qn,1,a[i],len[i]);
if(len[i]>maxlen){
maxlen=len[i];
tans=fro[i]%mod;
}
else if(len[i]==maxlen)
tans=(tans+fro[i])%mod;
}
//for(int i=1;i<=n;i++)
// cout<<len[i]<<" ";
//cout<<endl;
//for(int i=1;i<=n;i++)
// cout<<fro[i]<<" ";
//cout<<maxlen<<" "<<tans;
cout<<tans;
return 0;
}
考的不理想.
21.7.24 test的更多相关文章
- ffmpeg-20160908[09,10,13,15,19,21,22,24]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- 记录21.07.24 —— Vue的组件与路由
VUE组件 作用:复用性 创建组件的三种方式 第一种:使用extends搭配component方法 第二种:直接使用component方法 只有用vue声明且命名的才称之为创建组件 注意:templa ...
- FF D8 FF FE 00 24 47 00转图片
String[] img = "FF D8 FF FE 00 24 47 00 9D 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 0 ...
- 【DFS】算24点
[tyvj2802/RQNOJ74]算24点 描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”.您作为游戏者将得到4个1~9之间的自然数作为操作数,而您 ...
- java处理中国气象数据,提取汇总陕西地区24小时各观测点的数据(csv格式)
1.先贴一下气象数据的csv源格式,由于数据内容较多,就放一部分(china_sites_20150102.csv) date,hour,type,1001A,1002A,1003A,1004A,10 ...
- 洛谷P1236 算24点
题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”.您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算, ...
- 洛谷 P1236 算24点
题目描述 几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为"算24点".您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数 ...
- 【a501】算24点
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 几十年前全世界就浒一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为"算24点&quo ...
- 用python代替人脑运算24点游戏
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:老方玩编程 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...
随机推荐
- elasticsearch入门到放弃之elasticsearch-head
elasticsearch-head可理解为跟DBeaver一样是一个数据可视化工具,但是这个工具并没有理想中那么好用坑也是很多,我已经在我的github上fork了一份修改后的版本:https:// ...
- EXCEL中给包含某个字段的单元格所在行标注颜色
条件格式->新建规则->使用公式确定要设置格式的单元格 公式: =COUNTIF($A1,"*字符串*") 注意:通配符的使用.
- Spring Cloud Eureka 之开发笔记
Eureka客户端 -- 接口 com.netflix.discovery public interface EurekaClient /*常用方法*/ // 获取某个应用 Application g ...
- springboot整合jsp报错
今天在学springboot整合jsp时遇到了一个问题,虽然jsp不被spring官方推荐使用,但抱着学习的心态还是想解决一下这个问题.在写好了需要pom文件之后,访问网站得到了500的错误提示,后台 ...
- Linux系列(1) - 使用Hyper-V安装Linux系统
前言 使用工具:Hyper-V,补充:hyper-v是一项技术,而vmware是一款软件.具体区别自行百度 LINUX版本:CentOS-8.4.2105-x86_64-dvd1.iso Window ...
- Linux系列(31) - rpm命令管理之升级与卸载命令(3)
升级命令 rpm -Uvh 包全名(要升级到的软件版本),如果没有安装这个软件的任何版本,这个命令可以代替rpm -ivh. rpm -Uvh 包全名 选项: - -U(upgrade):升级 卸载命 ...
- linux 上添加多个jdk
1. 首先将你需要上传的jdk 上传并解压 2.你可以自定义解压的路径 3. alternatives --install /usr/bin/java java /usr/java/jdk1.7.0_ ...
- 『Python』面向对象(二)
继承 继承的语法 class Animal(object): def __init__(self,name): self.__name = name class Dog(Animal): kind = ...
- P4173-残缺的字符串【FFT】
正题 题目链接:https://www.luogu.com.cn/problem/P4173 题目大意 给出两个字符串\(S,T\),其中包含小写字母和一些\(?\),\(?\)可以匹配任何字符. 求 ...
- Incorrect datetime value: 时间添加失败原因
在进行单元测试中通过 new Date() 方式添加时间时,报了 Data truncation: Incorrect datetime value:这样的错误(我数据库表的时间类型是 datetim ...