NOIP模拟赛10 题解

t3:

题意

给你一棵树,然后每次两种操作:1.给一个节点染色 ; 2. 查询一个节点与任意已染色节点 lca 的权值的最大值

 

 

分析

考虑一个节点被染色后的影响:令它的所有祖先节点(包括自身)的所有除去更新节点上来的整棵子树的所有节点更新。

 

那么考虑dfs序会使某节点的子树节点连成一片,所以不更新某棵子树就可以轻易做到

 

然后考虑用线段树维护,复杂度就是 n log n 

code

 1 //by Judge
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 const int M=2e5+3;
 6 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1,*p2;
 8 inline int Max(int a,int b){return a>b?a:b;}
 9 inline void cmax(int& a,int b){if(a<b)a=b;}
10 inline int read(){ int x=0,f=1; char c=getchar();
11     for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
12     for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
13 } inline int cread(){ char c=getchar();
14     while(!isupper(c)) c=getchar(); return c=='M';
15 } char sr[1<<21],z[21]; int Z,C=-1;
16 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
17 inline void print(int x,char ch='\n'){
18     if(C>1<<20) Ot();if(x<0)sr[++C]='-',x=-x;
19     for(;z[++Z]=x%10+48,x/=10;);
20     for(;sr[++C]=z[Z],--Z;);sr[++C]=ch;
21 } int n,m,pat,cnt,v[M];
22 int f[M],head[M],dfn[M],siz[M];
23 struct Edge{ int to,next; }e[M<<1];
24 inline void add(int u,int v){
25     e[++pat]=(Edge){v,head[u]},head[u]=pat;
26     e[++pat]=(Edge){u,head[v]},head[v]=pat;
27 }
28 #define v e[i].to
29 void dfs(int u){ dfn[u]=++cnt,siz[u]=1;
30     for(int i=head[u];i;i=e[i].next)
31         if(v^f[u]) f[v]=u,dfs(v),siz[u]+=siz[v];
32 }
33 #undef v
34 struct segT{ int mx[M<<2];
35     #define ls k<<1
36     #define rs k<<1|1
37     #define mid (l+r>>1)
38     #define lson ls,l,mid
39     #define rson rs,mid+1,r
40     inline void clear(){memset(mx,-1,sizeof(mx));}
41     void modify(int k,int l,int r,int L,int R,int v){
42         if(v<mx[k]||L>r||l>R) return ;
43         if(L<=l&&r<=R) return mx[k]=v,void();
44         modify(lson,L,R,v),modify(rson,L,R,v);
45     }
46     int query(int k,int l,int r,int x){ if(l==r) return mx[k];
47         if(x<=mid) return Max(mx[k],query(lson,x));
48         else return Max(mx[k],query(rson,x));
49     }
50     inline void modify(int x,int y,int v){ if(!y) modify(1,1,n,dfn[x],dfn[x]+siz[x]-1,v);
51         else modify(1,1,n,dfn[x],dfn[y]-1,v),modify(1,1,n,dfn[y]+siz[y],dfn[x]+siz[x]-1,v);
52     }
53     inline int query(int x){ return query(1,1,n,dfn[x]); }
54 }t;
55 bool B[M];
56 inline void modify(int x){
57     for(int las=0;x;las=x,x=f[x]){
58         t.modify(x,las,v[x]);
59         if(B[x]) return ; B[x]=1;
60     }
61 }
62 int main(){
63     freopen("lca.in","r",stdin);
64     freopen("lca.out","w",stdout);
65     n=read(),m=read();
66     for(int i=1;i<=n;++i) v[i]=read();
67     for(int i=1,a,b;i<n;++i)
68         a=read(),b=read(),add(a,b);
69     dfs(1),t.clear();
70     for(int op,x;m;--m){
71         op=cread(),x=read();
72         if(op) modify(x);
73         else print(t.query(x));
74     } return Ot(),0;
75 }

 

t1:

题意

给你一个序列 a ,长度为 n ,首项为 t0,后面每一项 $a[i] = (A*a[i-1]*a[i-1]+B*a[i-1]+C)%D$  , A、 B、 C、 D 均给出,求这个序列的最长不下降子序列

 

分析

一眼看出这玩意儿有循环节。

 

但是这个序列前面的一部分与最后的一部分要特殊考虑,后面一部分倒还好说,前面一部分根本就与循环节是无关的。

 

所以我们考虑前后两部分特殊处理,然后中间的部分利用循环节做掉。

 

做法有两种:

 

  1. 一个是列出转移式然后矩阵加速解,复杂度  $D^3 \log n$
  2. 一个是考虑贪心构造,观察出每个数字必然至少出现一次的特点(当然是 n 足够大的时候),将中间的每个循环中的数字能利用就利用上,然后对于 n 小一点的直接 n log n 跑一遍暴力解(n^3 也可以随你开心啦) 复杂度 $D^2 \log D$

  

 

code

 

$D^3 \log n$

 1 //by Judge
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 const int M=1e6+3;
 6 const int N=163;
 7 int A,B,C,D,a[M],f[M];
 8 int b[M<<1],c[M],pos[M];
 9 ll n,m,st,ed,top,ans=1,MX[M];
10 template<class T>inline void cmax(T& a,T b){if(a<b)a=b;}
11 inline int get(int x){return (A*x*x+B*x+C)%D;}
12 inline void solv_pre(){
13     for(int i=2;i<=n;++i) a[i]=get(a[i-1]);
14     for(int i=1,k;i<=n;++i){
15         k=upper_bound(f+1,f+1+top,a[i])-f;
16         if(k>top) ++top; f[k]=a[i],MX[a[i]]=k;
17     }
18     for(int i=0;i<=D;++i) cmax(ans,MX[i]);
19     printf("%lld\n",ans);
20 }
21 struct Matrix{ ll a[N][N];
22     inline void mem(){ memset(a,-1,sizeof(a)); }
23     ll* operator [](const int x){return a[x];}
24     Matrix operator *(Matrix& b){ static Matrix c;
25         for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) c[i][j]=-1;
26         for(int i=1;i<=m;++i) for(int k=1;k<=m;++k)
27             for(int j=1;j<=m;++j) if(a[i][k]!=-1&&b[k][j]!=-1)
28                 cmax(c[i][j],a[i][k]+b[k][j]); return c;
29     }
30 }I,G;
31 Matrix qpow(Matrix x,ll p){ Matrix s=I;
32     for(ll i=p;i;i>>=1,x=x*x)
33         if(i&1) s=s*x; return s;
34 }
35 int lf[N],rf[N];
36 int main(){
37     freopen("lis.in","r",stdin);
38     freopen("lis.out","w",stdout);
39     cin>>n>>a[1]>>A>>B>>C>>D,pos[a[1]]=1;
40     if(n<=1e6) return solv_pre(),0;
41     for(int i=2;;pos[a[i]]=i,++i){ a[i]=get(a[i-1]);
42         if(pos[a[i]]){st=i,m=i-pos[a[i]];break;}
43     } ed=n-(n-st+1)%m,b[1]=c[1]=a[st];
44     for(int i=2;i<=m<<1;++i) b[i]=get(b[i-1]);
45     for(int i=2;i<=n-ed;++i) c[i]=get(c[i-1]);
46     I.mem(),G.mem(); for(int i=1;i<=m;++i) I[i][i]=0;
47     for(int i=1;i<st;cmax(lf[a[i]],++f[i]),++i)
48         for(int j=1;j<i;++j) if(a[j]<=a[i]) cmax(f[i],f[j]);
49     for(int i=1;i<=D;++i) cmax(lf[i],lf[i-1]);
50     memset(f,0,sizeof(f));
51     for(int i=n-ed;i>=1;cmax(rf[c[i]],++f[i]),--i)
52         for(int j=n-ed;j>i;--j) if(c[j]>=c[i]) cmax(f[i],f[j]);
53     for(int i=D-1;i>=0;--i) cmax(rf[i],rf[i+1]);
54     for(int i=1;i<=m;++i){ memset(f,-1,sizeof(f)),f[i]=0;
55         for(int j=i+1;j<=m<<1;++j) if(b[j]>=b[i])
56             for(int k=i;k<j;++k) if(b[k]<=b[j]) cmax(f[j],f[k]+1);
57         for(int j=m+1;j<=m<<1;++j) G[i][j-m]=f[j];
58     } G=qpow(G,(ed-st+1)/m-1);
59     for(int i=1;i<=m;++i) for(int j=1;j<=m;++j)
60         cmax(ans,G[i][j]+lf[b[i]]+rf[b[j]]+1);
61     return printf("%lld\n",ans),0;
62 }

 

$D^2 \log D$

本来我用的是贪心,然后挂了,就用矩阵了,这里就放 std 的代码好了 Q.T

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long int64;
 4 const int maxn=50010,maxd=160;
 5 int a[maxn],b[maxn],pos[maxd];
 6 int A,B,C,D,m; int64 st,ed,n;
 7 
 8 struct Tbinary_index_tree{
 9     int t[maxd];
10     void clear(){ memset(t,0,sizeof(t)); }
11     void insert(int x,int v){
12         for(int i=++x;i<maxd;i+=i&-i)
13             t[i]=max(t[i],v);
14     }
15     int query(int x){
16         int res=0; ++x;
17         for(int i=x;i;i-=i&-i)
18             res=max(res,t[i]);
19         return res;
20     }
21 }bit;
22 void brute_force(){
23     scanf("%d%d%d%d%d",a+1,&A,&B,&C,&D);
24     bit.clear(),bit.insert(a[1],1); int ans=1;
25     for(int i=2;i<=n;++i){
26         a[i]=(A*a[i-1]*a[i-1]+B*a[i-1]+C)%D;
27         int f=bit.query(a[i])+1;
28         bit.insert(a[i],f),ans=max(ans,f);
29     }
30     printf("%d\n",ans);
31 }
32 
33 void init(){
34     scanf("%d%d%d%d%d",a+1,&A,&B,&C,&D);
35     memset(pos,-1,sizeof(pos)),pos[a[1]]=1;
36     for(int i=2;;++i){
37         a[i]=(A*a[i-1]*a[i-1]+B*a[i-1]+C)%D;
38         if(pos[a[i]]!=-1){ st=i,m=i-pos[a[i]]; break; }
39         pos[a[i]]=i;
40     }
41     ed=n-(n-st+1)%m;
42     for(int i=st;i<=st+m*m-1;++i)
43         a[i]=(A*a[i-1]*a[i-1]+B*a[i-1]+C)%D;
44     b[1]=a[st];
45     for(int i=2;i<=n-ed+m*m;++i)
46         b[i]=(A*b[i-1]*b[i-1]+B*b[i-1]+C)%D;
47     st+=m*m,ed-=m*m; assert(st<ed);
48 }
49 
50 int lf[maxd],rf[maxd],f[maxn];
51 void solve(){
52     memset(lf,0,sizeof(lf));
53     memset(f,0,sizeof(f)),bit.clear();
54     for(int i=1;i<st;++i){
55         f[i]=bit.query(a[i])+1;
56         bit.insert(a[i],f[i]);
57         lf[a[i]]=max(lf[a[i]],f[i]);
58     }
59     for(int i=1;i<maxd;++i)
60         lf[i]=max(lf[i],lf[i-1]);
61     memset(f,0,sizeof(f)),bit.clear();
62     for(int i=n-ed;i>=1;--i){
63         f[i]=bit.query(maxd-b[i]-2)+1;
64         bit.insert(maxd-b[i]-2,f[i]);
65         rf[b[i]]=max(rf[b[i]],f[i]);
66     }
67     for(int i=maxd-2;i>=0;--i)
68         rf[i]=max(rf[i],rf[i+1]);
69     int64 ans=0;
70     for(int i=1;i<=m;++i){
71         int v=a[st-m*m+i-1];
72         ans=max(ans,lf[v]+(ed-st+1)/m+rf[v]);
73     }
74     printf("%lld\n",ans);
75 }
76 
77 int main(){
78     freopen("lis.in","r",stdin);
79     freopen("lis.out","w",stdout);
80     scanf("%lld",&n);
81     if(n<=50000)
82         brute_force();
83     else init(),solve();
84     return 0;
85 }

 

 

t2:

题意

给你 n 件物品来放完全背包,体积小于 L 的无限放, 大于等于 L 的物品总共最多放 C 件,然后给出多组询问,你需要判断是否能用这些物品在满足条件的情况下放满 W 大小的背包

 

分析

回到了被跳楼机支配的恐惧...

 

首先令最小的物品体积为 V ,那么这个物品是可以无限放的,所以我们只需要记录要达到在模 V 下的体积会放到的最小体积,然后判断的时候看 询问值模 V 后是否大于等于这个值就好了(因为多出来的体积可以用 V 补)

 

设计状态 $f[i][j][k]$ 为前 i 个物品中加入了 j 次体积不小于 L 的物品,且总体积模 V 为 k 的最小总体积 (我就觉得是跳楼机了) 

 

然后刚刚我说的显然有错啊,最小物品的体积不见得就可以无限放,那么如果最小体积物品也 ≥ L ,那么最多放 C 件,直接暴力跑就能出解了,状态也比较简单,就是考虑放不超过 c 件物品能达到的体积,加上 vi 本来就小,随便套套 bitset (不套也行)就解决了

 

code

 1 //by Judge
 2 #include<bits/stdc++.h>
 3 #define ll long long
 4 using namespace std;
 5 const int MV=10011,M=53;
 6 #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
 7 char buf[1<<21],*p1,*p2;
 8 inline void cmin(ll& a,ll b){if(a>b)a=b;}
 9 inline ll read(){ ll x=0,f=1; char c=getchar();
10     for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
11     for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x*f;
12 } char sr[1<<21],z[21]; int Z,C=-1;
13 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
14 int n,m,v[M],V,V0,c;
15 ll f[33][MV*33],g[MV];
16 inline void preset(){
17     for(int j=0;j<=c;++j) for(int k=0;k<V;++k) f[j][k]=1e18; f[0][0]=0;
18     for(int i=1,t;i<=n;++i) if(v[i]>=V0){ t=v[i]%V;
19         for(int j=1;j<=c;++j) for(int k=0;k<V;++k)
20             cmin(f[j][k],f[j-1][(k+V-t)%V]+v[i]);
21     } else{ int len=V/__gcd(v[i],V);
22         for(int j=0;j<=c;++j) for(int N=V/len,d=0;d<N;++d)
23             for(int T=1;T<=2;++T) for(int k=0,las=d,now;k<=len;++k)
24                 now=(las+v[i])%V,cmin(f[j][now],f[j][las]+v[i]),las=now;
25     } for(int i=0;i<V;++i) g[i]=1e18;
26     for(int j=0;j<=c;++j) for(int k=0;k<V;++k) cmin(g[k],f[j][k]);
27     for(ll x;m;--m)
28         if(x=read(),g[x%V]>x) sr[++C]='N',sr[++C]='o',sr[++C]='\n';
29         else sr[++C]='Y',sr[++C]='e',sr[++C]='s',sr[++C]='\n';
30     return Ot();
31 }
32 int main(){
33     freopen("bag.in","r",stdin);
34     freopen("bag.out","w",stdout);
35     n=read(),m=read();
36     for(int i=1;i<=n;++i) v[i]=read(); sort(v+1,v+1+n);
37     return V=v[1],V0=read(),c=read(),preset(),0;
38 }

 

转载于:https://www.cnblogs.com/Judge/p/10433133.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/249570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P1136 迎接仪式 解题报告

P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了。为了迎接教主&#xff0c;在一条道路旁&#xff0c;一群Orz教主er穿着文化衫站在道路两旁迎接教主&#xff0c;每件文化衫上都印着大字。一旁的Orzer依次摆出“欢迎欢迎欢迎欢迎……”的大字&#xff0c;但是领队突然…

spring源码分析-core.io包里面的类

前些日子看《深入理解javaweb开发》时&#xff0c;看到第一章java的io流&#xff0c;发觉自己对io流真的不是很熟悉。然后看了下JDK1.7中io包的一点点代码&#xff0c;又看了org.springframework.core.io包的一些类和组织方式&#xff0c;当作是学习吧。总结一下。 先挂下spri…

对类Vue的MVVM前端库的实现

关于实现MVVM&#xff0c;网上实在是太多了&#xff0c;本文为个人总结&#xff0c;结合源码以及一些别人的实现 关于双向绑定 vue 数据劫持 订阅 - 发布ng 脏值检查backbone.js 订阅-发布(这个没有使用过&#xff0c;并不是主流的用法)双向绑定&#xff0c;从最基本的实现来说…

java.util.prefs.Preferences

我们经常需要将我们的程序中的设定&#xff0c;如窗口位置&#xff0c;开启过的文件&#xff0c;用户的选项设定等数据记录下来&#xff0c;以做便用户下一次开启程序能继续使用这些数据。 以前我们通常的做法是使用Properties类&#xff0c;它提供以下方法: void load(InputS…

django的母板系统

一.母板渲染语法 1.变量 {{ 变量 }} 2.逻辑 {% 逻辑语 %} 二.变量 在母板中有变量时,母板引擎会去反向解析找到这个传来的变量,然后替换掉. .(点),在母板中是深度查询据点符,它的查询顺序: 字典 > 属性或方法 > 数字索引 三.过滤器 1.语法 {{ value|filter_name:参数}} 2…

python学习总结----时间模块 and 虚拟环境(了解)

python学习总结----时间模块 and 虚拟环境&#xff08;了解&#xff09; time- sleep&#xff1a;休眠指定的秒数(可以是小数) - time&#xff1a;获取时间戳# 获取时间戳(从1970-01-01 00:00:00到此刻的秒数)t time.time()print(t) - localtime&#xff1a;将时间戳转换为对象…

【CSS】flex的常用布局

1、垂直居中&#xff0c;写在父级上div{display: flex;justify-content: center;align-items: center; } 2、flex-左右两端&#xff0c;垂直居中该布局在移动端较为常见<style> .wrap{display: flex;justify-content: space-between;align-items: center;width: 200px;he…

java.util.Properties

ava.util.Properties是对properties这类配置文件的映射。支持key-value类型和xml类型两种 首先&#xff0c;新建一个文件&#xff0c;如图&#xff1a; 然后再Java代码段输入如下代码&#xff1a; import java.io.FileInputStream; import java.io.InputStream; import java…

Xpath使用方法

Xpath使用方法 注&#xff1a;默认死格式 先写 //* 代表定位页面下所有元素 1、Xpath支持ID、Class、Name定位功能 通过ID定位 //*[idkw]通过Class定位//*[classclass_name]通过Name定位//*[namename]-----------------------------------------------------------------------…

为什么这么多烂代码?

在国内&#xff0c;有经验的程序员都当领导了&#xff0c;领导又不写代码&#xff0c;那代码只能让刚入行的新手写了&#xff0c;然后就是随意堆砌&#xff0c;完成功能就行&#xff0c;所以目前我尽量不写烂代码&#xff0c;并尽量坚持改造已有的烂代码&#xff0c;在我眼中&a…

Spring-boot 打成jar包后使用外部配置文件

官网说明 第一种是在jar包的同一目录下建一个config文件夹&#xff0c;然后把配置文件放到这个文件夹下&#xff1b; 第二种是直接把配置文件放到jar包的同级目录&#xff1b; 第三种在classpath下建一个config文件夹&#xff0c;然后把配置文件放进去&#xff1b; 第四种是在c…

acm模板生成

为迎接&#xff0c;接下来的区域赛&#xff0c;要做好准备(虽然不是特别有信心&#xff0c;但是还是要鼓励自己&#xff0c;可以取得收获的&#xff0c;加油) acm_latex模板&#xff1a; https://www.cnblogs.com/palayutm/p/6444833.html#e69bb4e696b0_1 windows下安装texlive…

UI自动化之元素定位(xpath、css)

很早之前就已经写过自动化了&#xff0c;不过点着功能久了就会容易忘记元素定位&#xff0c;尤其是xpath和css定位&#xff0c;所以就花点时间做下总结收集。 xpath有两种定位&#xff1a; 一.绝对路径&#xff08;不推荐使用&#xff0c;除非已经使用了所有方式仍然无法定位&a…

属性编辑器PropertyEditor

在Spring配置文件里&#xff0c;我们往往通过字面值为Bean各种类型的属性提供设置值&#xff1a;不管是double类型还是int类型&#xff0c;在配置文件中都对应字符串类型的字面值。BeanWrapper填充Bean属性时如何将这个字面值转换为对应的double或int等内部类型呢&#xff1f;我…

邮箱验证

public class Emailstandard { /* * 以数字或字母开头 * 之前可以含有数字,字母,下划线,点 * 有且只有一个 * 之后只能含有数字,字母 * 必须以.com或者.cn结尾 * */ public static void main(String[] args) { Scanner sca new Scanner(…

python第二十八课——编码小常识

2.内存和硬盘&#xff1a;内存&#xff1a;计算机硬件组成部分之一&#xff0c;它是一个容器&#xff0c;用来存储数据&#xff1b;处理数据速度快&#xff0c;存储数据量小&#xff1b;断电死机数据会丢失&#xff0c;短暂性存储数据硬盘&#xff1a;计算机硬件组成部分之一&a…

Javadoc 使用详解

很多程序对Javadoc都不重视&#xff0c;认识不到Javadoc的作用&#xff0c;很多人都是这样认为的&#xff1a;“我只要写好功能就够了&#xff0c;写Javadoc太浪费时间&#xff0c;也没啥作用&#xff0c;还不如用写Javadoc的时间再多些个功能呢&#xff01;”&#xff0c;我们…

Linux下查看当前文件大小的命令

1、ls -lht 列出每个文件的大小和当前目录所有文件大小总和 2、du -sh * 列出当前文件夹下的所有子文件的大小 看你需要啥样的&#xff0c;自己来吧 转载于:https://www.cnblogs.com/xbxxf/p/9619818.html

(13)UniquePathIII

一、问题描述 给定一个二维数组。 数组只有一个元素是1&#xff0c;是起点数组只有一个元素是2&#xff0c;是终点数组中的0是必须经过的地方数组中的-1是障碍不可通过从起始点到终点一共有多少路径&#xff1f; 二、思路 DFS 三、Code 1 package algorithm;2 3 /**4 * Create…

Spring IOC-BeanFactory的继承体系结构

本文主要介绍BeanFactory以及它的各种继承层级的接口、抽象类及实现类&#xff0c;因为内容很多&#xff0c;所以这里不介绍ApplicationContext继承体系下的类&#xff08;虽然ApplicationContext本质上也是BeanFactory&#xff0c;但是毕竟这这是我们平时接触最多的两种类别&a…