T1 小L的疑惑

对于\(P_i\),如果所有比\(P_i\)小的数加起来也达不到\(P_i-1\),那么值域肯定不连续。否则设原来值域最大值为\(mx\),则\(P_i\)会让值域最大值增致\(mx+P_i\)。

排序后扫一遍。

\(code:\)

T1

#include<bits/stdc++.h>
#define int long long
using namespace std; namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO; const int NN=100010;
int n,p[NN],f[NN]; signed main(){
freopen("math.in","r",stdin);
freopen("math.out","w",stdout);
n=read();
for(int i=1;i<=n;i++) p[i]=read();
sort(p+1,p+n+1);
for(int i=1;i<=n;i++){
if(f[i-1]<p[i]-1) return write(f[i-1]+1,'\n'),0;
f[i]=f[i-1]+p[i];
}
return write(f[n]+1,'\n'),0;
}


T2 小L的数列

把乘法化为指数加法,就是挺裸的矩阵快速幂优化了。

注意指数上应模\(998244352\)。由费马小定理不难得出\(x^{p-1}\equiv 1(\mod p)\)。(也许是欧拉定理?我太菜了

\(code:\)

T2

#include<bits/stdc++.h>
using namespace std; namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO; const int NN=210,p=998244353,mod=p-1;
int n,k,ans,b[NN],f[NN];
int qpow(int a,int x){
int res=1;
for(;x;x>>=1){
if(x&1) res=1ll*res*a%p;
a=1ll*a*a%p;
}
return res;
} namespace Matrix{
struct mat{
int s[NN][NN];
mat(){}
mat(int x){ memset(s,0,sizeof(s)); for(int i=1;i<=k;i++) s[i][i]=x; }
mat operator*(const mat& a)const{
mat res=mat(0);
for(int i=1;i<=k;i++)
for(int l=1;l<=k;l++)
for(int j=1;j<=k;j++)
(res.s[i][j]+=1ll*s[i][l]*a.s[l][j]%mod)%=mod;
return res;
}
}t;
mat operator^(mat a,int x){
mat res=mat(1);
for(;x;x>>=1){
if(x&1) res=res*a;
a=a*a;
}
return res;
}
void prework(){
for(int i=1;i<k;i++) t.s[i+1][i]=1;
for(int i=1;i<=k;i++) t.s[i][k]=b[k-i+1];
}
} using namespace Matrix; signed main(){
freopen("seq.in","r",stdin);
freopen("seq.out","w",stdout);
n=read(); k=read(); ans=1;
for(int i=1;i<=k;i++) b[i]=read();
for(int i=1;i<=k;i++) f[i]=read();
if(n<=k) return write(f[n],'\n'),0;
prework(); t=t^(n-k);
for(int i=1;i<=k;i++)
ans=1ll*ans*qpow(f[i],t.s[i][k])%p;
return write(ans,'\n'),0;
}
/*
5 4
1 2 3 4
4 3 2 1 100000 4
1 2 3 4
12 23 34 45 */


T3 连边

以黑点为源点做多源最短路。

考虑多加一个白点的贡献,其实就是白点向前驱连了一条边。因此做最短路时记录每个点在最短路中与它连边最短的前驱,最后累加答案即可。

\(code:\)

T3

#include<bits/stdc++.h>
#define int long long
using namespace std; namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO; const int NN=100010;
int n,m,ans;
bool col[NN]; namespace graph{
#define x first
#define y second
#define mp make_pair
#define pb push_back
typedef pair<int,int> PII;
const int MM=NN<<2;
priority_queue<PII,vector<PII>,greater<PII>>q;
int idx,to[MM],nex[MM],w[MM],head[NN],dis[NN],mn[NN];
bool vis[NN];
void add(int a,int b,int c){
to[++idx]=b; nex[idx]=head[a]; head[a]=idx; w[idx]=c;
to[++idx]=a; nex[idx]=head[b]; head[b]=idx; w[idx]=c;
}
void dijstra(){
memset(dis,0x3f,sizeof(dis));
memset(mn,0x3f,sizeof(mn));
for(int i=1;i<=n;i++) if(col[i])
dis[i]=0, q.push(mp(0,i));
while(!q.empty()){
int x=q.top().y,y=q.top().x; q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=head[x];i;i=nex[i]){
int v=to[i];
if(dis[v]==y+w[i]) ckmin(mn[v],w[i]);
else if(dis[v]>y+w[i]){
dis[v]=y+w[i];
mn[v]=w[i];
q.push(mp(dis[v],v));
}
}
}
}
} using namespace graph; void getans(){
for(int i=1;i<=n;i++) if(!col[i]){
if(mn[i]>1e17) puts("impossible"),exit(0);
ans+=mn[i];
}
} signed main(){
freopen("minimum.in","r",stdin);
freopen("minimum.out","w",stdout);
n=read(); m=read();
for(int i=1;i<=n;i++) col[i]=read();
for(int a,b,c,i=1;i<=m;i++)
a=read(),b=read(),c=read(),add(a,b,c);
dijstra(); getans();
return write(ans,'\n'),0;
}
/*
5 7
0 1 0 1 0
1 2 2
1 3 1
1 5 17
2 3 1
3 5 18
4 5 3
2 4 5 */


T4 小L的有向图

状压\(DP\),状态记已考虑的点集。

每次考虑在枚举到的点集\(S\)的拓扑序后加入一个点\(i\),那么\(S\)内连向\(i\)的边可删可不删,其它边必须删。

找到这个边数\(x\),将方案数乘上\(2^x\)转移刷表。

\(code:\)

T4

#include<bits/stdc++.h>
#define int long long
using namespace std; namespace IO{
auto read=[]()->int{
char ch=getchar(); int x=0,f=1;
while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); }
while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
return x*f;
};
auto write=[](int x,int sp)->void{
char ch[20]; int len=0;
if(x<0){ x=~x+1; putchar('-'); }
do{ ch[len++]=(1<<4)+(1<<5)+x%10; x/=10; }while(x);
for(int i=len-1;~i;--i) putchar(ch[i]); putchar(sp);
};
auto ckmax=[](int& x,int y)->void{ x=x<y?y:x; };
auto ckmin=[](int& x,int y)->void{ x=x<y?x:y; };
} using namespace IO; const int NN=23,MM=470,p=998244353;
int n,m,ans,in[NN],pw[MM],f[1<<22]; signed main(){
freopen("topology.in","r",stdin);
freopen("topology.out","w",stdout);
n=read(); m=read(); pw[0]=f[0]=1;
for(int a,b,i=1;i<=m;i++)
a=read(),b=read(),in[b]|=1<<a-1,pw[i]=(pw[i-1]<<1)%p;
for(int u=0;u<(1<<n);u++)
for(int i=1;i<=n;i++) if(!(u&(1<<i-1))){
int tmp=__builtin_popcount(u&in[i]);
(f[u|(1<<i-1)]+=f[u]*pw[tmp])%=p;
}
return write(f[(1<<n)-1],'\n'),0;
}
/*
3 3
1 2
2 3
3 1 */


2021.10.10考试总结[NOIP模拟73]的更多相关文章

  1. 2021.9.17考试总结[NOIP模拟55]

    有的考试表面上自称NOIP模拟,背地里却是绍兴一中NOI模拟 吓得我直接文件打错 T1 Skip 设状态$f_i$为最后一次选$i$在$i$时的最优解.有$f_i=max_{j<i}[f_j+a ...

  2. 2021.8.6考试总结[NOIP模拟32]

    T1 smooth 考场上水个了优先队列多带个$log$,前$80$分的点跑的飞快,后面直接萎了. 其实只需开$B$个队列,每次向对应队列中插入新的光滑数,就能保证队列中的数是单调的. 为了保证不重, ...

  3. 2021.10.15考试总结[NOIP模拟77]

    \(n=40\)考虑\(meet \;in \;the \;middle\) 某个元素有关的量只有一个时考虑转化为树上问题 对暴力有自信,相信数据有梯度 没了 UPD:写了个略说人话的. T1 最大或 ...

  4. 2021.10.18考试总结[NOIP模拟76]

    T1 洛希极限 不难发现每个点肯定是被它上一行或上一列的点转移.可以预处理出每个点上一行,上一列最远的能转移到它的点,然后单调队列优化. 预处理稍显ex.可以用并查集维护一个链表,记录当前点之后第一个 ...

  5. 2021.10.12考试总结[NOIP模拟75]

    T1 如何优雅的送分 考虑式子的实际意义.\(2^{f_n}\)实际上就是枚举\(n\)质因子的子集.令\(k\)为这个子集中数的乘积,就可以将式子转化为枚举\(k\),计算\(k\)的贡献. 不难得 ...

  6. 2021.10.11考试总结[NOIP模拟74]

    T1 自然数 发现\(mex\)是单调不降的,很自然地想到用线段树维护区间端点的贡献. 枚举左端点,用线段树维护每个右端点形成区间的\(mex\)值.每次左端点右移相当于删去一个数. 记\(a_i\) ...

  7. 2021.10.9考试总结[NOIP模拟72]

    T1出了个大阴间题 状压\(DP\),记当前状态的代价和与方案数.状态\(\Theta(2^nn)\),转移\(\Theta(n)\). 发现每个状态的最大值只会是所选集合的\(max\)或加一.于是 ...

  8. 2021.10.7考试总结[NOIP模拟71]

    信心赛,但炸了.T3SB错直接炸飞,T4可以硬算的组合数非要分段打表求阶乘..T2也因为一个细节浪费了大量时间.. 会做难题很好,但首先还是要先把能拿的分都拿到. T1 签到题 结论:总可以做到对每个 ...

  9. 2021.6.29考试总结[NOIP模拟10]

    T1 入阵曲 二位前缀和暴力n4可以拿60. 观察到维护前缀和时模k意义下余数一样的前缀和相减后一定被k整除,前缀和维护模数,n2枚举行数,n枚举列, 开一个桶记录模数出现个数,每枚举到该模数就加上它 ...

随机推荐

  1. JAVA安全基础之反射

    JAVA安全基础之反射 在JAVA安全中,反射是一个经常使用的技术,所以熟悉使用反射是非常必要的.下面就简单的讲下JAVA的反射的用法 什么是反射 每个类都有对应的Class类对象,该Class类对象 ...

  2. java.net.NoRouteToHostException: Cannot assign requested address

    今天压力测试时, 刚开始出现了很多异常, 都是 java.net.NoRouteToHostException: Cannot assign requested address.  经网上查资料, 是 ...

  3. 获取发布版SHA1和调试版SHA1

    总结 调试版: 常见问题 | 高德地图API (amap.com) 发布版: 首先需要生成签名 Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值_donkor_的博客-C ...

  4. Java统计文件中字母个数

    import java.text.DecimalFormat; import java.io.File; import java.io.FileReader; import java.io.Buffe ...

  5. Java基础系列(24)- 增强for循环

    增强for循环 这里我们先只是见一面,做个了解,之后数组部分会重点使用 Java5引入了一种主要用于数组或集合的增强型for循环 Java增强for循环语法格式如下 for(声明语句:表达式){ // ...

  6. jmeter 脚本录制方式详解

    关于jmeter脚本录制方式,主要分为第三方工具录制.jmeter本身代理方式录制以及人为手写脚本的三种方式.其中第三方工具录制主要有3种主流工具进行录制,badboy   BlazeMeter    ...

  7. 博客主题——element v2

    主题预览 主题下载 gshang.element-v2.rar

  8. CI框架 模糊查询,链表查询

    $data = $this->db->from('flash_news') ->select('xx,xx,xx,xx') ->limit(2) ->like('tags ...

  9. 【月光宝盒get√】用时间置换空间,聊聊稀疏数组的那些事儿

    背景 数据结构是指带有结构特性的数据元素的集合.在数据结构中,数据之间通过一定的组织结构关联在一起,便于计算机存储和使用.从大类划分,数据结构可以分为线性结构和非线性结构,适用于不同的应用场景. 线性 ...

  10. 用SpringBoot实现策略模式

    问题的提出 阅读别人代码的时候最讨厌遇到的就是大段大段的if-else分支语句,一般来说读到下面的时候就忘了上面在判断什么了.很多资料上都会讲到使用策略模式来改进这种代码逻辑. 策略模式的类图如下: ...