T1 购票方案 \(\color{green}{100}\)

对于每个时间节点维护它作为每种票所能包含的最后一个点时,这种票的起始点位置,由于这个位置是单调的,所以类似双指针维护,\(O(KN)\) 维护出来后再做个简单 dp 就行了。复杂度 \(O(KN)\)。

code:

#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=1e5+5;
const int K=505;
bool ss;
int last[N][K];
int n,k;
int t[N];
int num[K],cost[K];
int one;
int sum[N];
bool tt;
signed main(){
freopen("buy.in","r",stdin);
freopen("buy.out","w",stdout);
n=in,k=in;
for(int i=1;i<=n;i++)
t[i]=in;
for(int i=1;i<=k;i++)
num[i]=in,cost[i]=in,last[0][k]=1;
one=in;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++){
last[i][j]=last[i-1][j];
while(t[last[i][j]]+num[j]-1<t[i])
last[i][j]++;
}
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+one;
for(int j=1;j<=k;j++)
sum[i]=min(sum[i],sum[last[i][j]-1]+cost[j]);
cout<<sum[i]-sum[i-1]<<'\n';
}
return 0;
}

T2 直线相交 \(\color{red}{55}\)

假做法拿到了 \(55\) ,众人的 dfs 拿了 \(80\),良心出题人!

考虑分成 \(k\) 组,每组中的边互相平行。

正常的dp:

设 \(f[i][j]\) 表示前 \(i\) 条边,能否形成 \(j\) 个交点。枚举这一组的大小即可。

\(f[i][j]=f[i-k][j-(i-k)\times k]\)

状态数 \(n^3\),转移的复杂度为 \(O(n)\),所以总复杂度 \(O(n^4)\)

神仙dp:

如果把每两条边都有交点的状态成为全交,有 \(n*(n-1)/2\) 个交点,那么每组中如果有 \(k\) 条边,它就会对全交状态损失 \(k*(k-1)/2\) 个交点。所以我们尝试以损失作为 dp 的状态。

设 \(g[i]\) 表示比全交状态损失 \(i\) 个交点,至少需要的边数。

枚举当前组的大小 \(j\),有

\(g[i]=min(j+g[i-j*(j-1)/2])\)

实现时可以从小到大枚举 \(i\) ,用 \(g[i]+j\) 更新 \(g[i+j*(j-1)/2]\)

状态数 \(n^2\) ,转移复杂度为 \(O(n)\) 所以总复杂度 \(O(n^3)\)

对于 \(N,M\),当且仅当 \(g[n*(n-1)/2-M]\leq N\) 时成立。

对于"当":考虑拿出 \(g[n*(n-1)/2-M]\) 构造出所需的损失,剩下每条作为一组,不会有损失。

code:

#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 M=2e5+5;
int T,g[M],n[M],m[M],maxn;
signed main(){
T=in;
for(int i=1;i<=T;i++)
n[i]=in,m[i]=in,maxn=max(maxn,n[i]);
memset(g,127,sizeof(g));g[0]=0;
for(int i=0;i<=maxn*(maxn-1)/2;i++)
for(int j=1;j<=maxn&&i+j*(j-1)/2<=maxn*(maxn-1)/2;j++)
g[i+j*(j-1)/2]=min(g[i]+j,g[i+j*(j-1)/2]);
for(int i=1;i<=T;i++)
cout<<(m[i]<=n[i]*(n[i]-1)/2&&(g[n[i]*(n[i]-1)/2-m[i]]<=n[i]))<<'\n';
return 0;
}

T3 记录数列 \(\color{red}{50}\)

神秘dp和容斥


T4 随机游走 \(\color{red}{50}\)

每条边期望经过的次数等于端点期望出发的次数除以度数,所以要求出每个端点期望的出发次数,也可以转化为求每个点的经过次数。具体的,如果出发点为 \(s\),每个点期望出发次数为 \(f_i\),度数为 \(d_i\),同时每个点还有出现的概率 \(p_i\),所以我们可以求出没有修改时的初始期望权值,通过:

\[f_u=\sum\dfrac{f_v}{d_v}+p_u,f_n=0
\]

高斯消元即可。那么一条边 \((u,v)\) 的贡献就是 \((\dfrac{f_u}{d_u}+\dfrac{f_v}{d_v})*w_{(u,v)}\)。

这一步是 \(O(n^3)\) 的。但如果出现权值被修改了呢?难道用 \(O(n^4)\) 吗

注意到在高斯消元中的系数矩阵是不会变的,只有最后一列 \(p\) 在修改后会更改。

所以我们令系数矩阵为 \(A\),把高斯消元的这步记为 \(Af=p\)。

又注意到对于 \(p\) 的修改不会超过 \(N\) 次。

于是有一个 trick :记第 \(i\) 次修改后的 \(p\) 为 \(p^i\),那么我们先把所有 \(p\) 的修改预处理出来,然后拉到一个矩阵 \(B=\{p^0,p^1,p^2,\cdots,p^n\}\),那么高斯消元的一步变成 \(Af=B\) ,对 \(A\) 求逆,于是有 \(f=A^{-1}B\) ,可以在 \(O(n^3)\) 的时间里把 \(f\) 矩阵求出来,每列对应每次修改。

高斯消元 \(O(N^3)\),每次修改时枚举每条边 \(O(NM)\),对于边权的修改发现可以 \(O(1)\) 做,所以算法总复杂度 \(O(N^3+NM+Q)\)。

其实不算很难的题,只是那个矩阵的 trick 没见过。

code:

#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=505;
const int M=1e4+5;
const int Q=1e6+5;
const int mod=998244353;
int n;
inline int qpow(int a,int b){
int ans=1;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
inline int inv(int x){return qpow(x,mod-2);}
struct matrix{
int x,y;
int a[N][N];
}A,B;
matrix operator*(const matrix &a,const matrix &b){
matrix c;
for(int i=1;i<=a.x;i++)
for(int j=1;j<=b.y;j++)
c.a[i][j]=0;
c.x=a.x,c.y=b.y;
for(int i=1;i<=a.x;i++)
for(int j=1;j<=b.y;j++)
for(int k=1;k<=a.y;k++)
c.a[i][j]=(a.a[i][k]*b.a[k][j]%mod+c.a[i][j])%mod;
return c;
}
matrix matinv(matrix &a){
matrix c;c.x=n,c.y=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c.a[i][j]=(i==j);
for(int i=1;i<=n;i++){
int now=i;
for(int j=i+1;j<=n;j++)
if(a.a[j][i]>a.a[now][i])now=j;
swap(a.a[i],a.a[now]);swap(c.a[i],c.a[now]);
int div=inv(a.a[i][i]);
for(int j=1;j<=n;j++)
a.a[i][j]=a.a[i][j]*div%mod;
for(int j=1;j<=n;j++)
c.a[i][j]=c.a[i][j]*div%mod;
for(int j=1;j<=n;j++){
if(j==i)continue;
div=a.a[j][i];
for(int k=i;k<=n;k++)
a.a[j][k]=(a.a[j][k]-div*a.a[i][k]%mod+mod)%mod;
for(int k=1;k<=n;k++)
c.a[j][k]=(c.a[j][k]-div*c.a[i][k]%mod+mod)%mod;
}
}
return c;
}
int m,q;
int mp[N][N];
int a[N],suma,invsuma,d[N],invd[N];
int u[M],v[M],w[M];
struct que{
int opt,x,y,z;
}req[Q];
inline int add(int x,int y){return (x+y)%mod;}
inline int mul(int x,int y){return x*y%mod;}
signed main(){
n=in,m=in,q=in;
for(int i=1;i<n;i++)
a[i]=in,suma+=a[i];
invsuma=inv(suma);
for(int i=1;i<=m;i++)
u[i]=in,v[i]=in,w[i]=in,
mp[u[i]][v[i]]=mp[v[i]][u[i]]=i,
d[u[i]]++,d[v[i]]++;
for(int i=1;i<=n;i++)
invd[i]=inv(d[i]);
for(int i=1;i<=q;i++){
req[i].opt=in;
if(req[i].opt==1) req[i].x=in,req[i].y=in,req[i].z=in;
else req[i].x=in,req[i].y=in;
}
A.x=n,A.y=n;
for(int i=1;i<=m;i++)
A.a[u[i]][v[i]]=-1*invd[v[i]],
A.a[v[i]][u[i]]=-1*invd[u[i]];
for(int i=1;i<=n;i++)
A.a[n][i]=A.a[i][n]=0,A.a[i][i]=1;
int tmp=1;
for(int i=1;i<=n;i++)
B.a[i][tmp]=a[i]*invsuma%mod;
for(int i=1;i<=q;i++)
if(req[i].opt==2){
suma+=req[i].y-a[req[i].x];
invsuma=inv(suma);
a[req[i].x]=req[i].y;
++tmp;
for(int i=1;i<=n;i++)
B.a[i][tmp]=a[i]*invsuma%mod;
}
B.x=n,B.y=tmp;
A=matinv(A);
B=A*B;
int now=1,ans=0;
for(int i=1;i<=m;i++)
ans=add(mul(add(mul(B.a[u[i]][now],invd[u[i]]),mul(B.a[v[i]][now],invd[v[i]])),w[i]),ans);
cout<<ans<<'\n';
for(int i=1;i<=q;i++){
if(req[i].opt==1){
int x=req[i].x,y=req[i].y,z=req[i].z;
ans=add(mul(add(mul(B.a[x][now],invd[x]),mul(B.a[y][now],invd[y])),add(z-w[mp[x][y]],mod)),ans);
w[mp[x][y]]=z;
}
else{
now++;ans=0;
for(int i=1;i<=m;i++)
ans=add(mul(add(mul(B.a[u[i]][now],invd[u[i]]),mul(B.a[v[i]][now],invd[v[i]])),w[i]),ans);
}
cout<<ans<<'\n';
}
return 0;
}

矩阵封装,哪个傻逼


21.10.9 test的更多相关文章

  1. 2016年12月15日 星期四 --出埃及记 Exodus 21:10

    2016年12月15日 星期四 --出埃及记 Exodus 21:10 If he marries another woman, he must not deprive the first one o ...

  2. 慢到不能忍?别忍了,Ubuntu 21.10 APT 源修改为华为云镜像源

    更新记录 2022年4月15日:本文迁移自Panda666原博客,原发布时间:2021年3月29日. 2022年4月15日:将源改为华为云,华为云更方便.Ubuntu从20.04更新到21.10. 切 ...

  3. 21.10.12 test

    题目 **WOJ5110 ** 到 WOJ5113 校内自测没开捆绑,于是输出 -1 和 n! 的程序拿到了高分,我的得分也比期望得分略有提升 T1 problem a \(\color{red}{2 ...

  4. 21.10.18 test

    可可大神出题,四款有趣的游戏推荐,第四个好玩/se T1 loopers \(\color{green}{100}\) 考虑钦定 \(a_1,a_i\) 的位置,固定左边一坨,那么剩下的一坨的 \(\ ...

  5. 21.10.14 test

    题目 WOJ5078 到 WOJ5081 T1 Problem A \(\color{green}{100}\) 由于每轮要选择尽量多的边删除,所以想到无向图的生成树,因为在生成树上再加一条边就会形成 ...

  6. java 21 - 10 文本文件和集合之间互相存储数据

    有时候,我们会遇到单独写入数据到文本文件的情况.比如: 需求:把ArrayList集合中的字符串数据存储到文本文件 分析: A:ArrayList集合中存储的是String类 B:要存储的文件是文本文 ...

  7. 关于“关于C#装箱的疑问”帖子的个人看法 (原发布csdn 2017年10月07日 10:21:10)

    前言 昨天晚上闲着无事,就上csdn逛了一下,突然发现一个帖子很有意思,就点进去看了一下. 问题很精辟 int a = 1; object b=a; object c = b; c = 2; 为什么b ...

  8. 不一样的软件们——GitHub 热点速览 v.21.10

    作者:HelloGitHub-小鱼干 创意,是程序员的一个身份代名词,一样的软件有不一样的玩法.比如,你可以像用 git 一样操作一个 SQL 数据库,dolt 就是这样的数据库.又比如,你可以只写文 ...

  9. [MySQL Reference Manual] 10 全球化

    10.全球化 本章主要介绍全球化,包含国际化和本地化,的一些问题: ·         MySQL在语句中支持的字符集 ·         如何为服务配置不同的字符集 ·         选择错误信息 ...

随机推荐

  1. 在windows中给git修改默认的编辑器为sublime

    首先,需要配置sublime的为环境变量,这是为了让git能通过命令调用sublime.也可以写一个.bat脚本.然后,让git调用bat脚本也可以 配置环境变量path到subl.exe的目录 脚本 ...

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

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

  3. Django学习day15BBS项目开发3.0

    每日测验 """ 今日考题 1.django admin作用及用法 2.media配置如何实现,基于该配置能够做到什么以及需要注意什么 3.阐述博客园为何支持用户自定义个 ...

  4. Django学习day05随堂笔记

    每日测验 """ 今日考题 1.反向解析的本质是什么,无名和有名反向解析如何操作? 2..路由分发能够实现的前提是什么,需要注意什么,名称空间什么时候使用 3..什么是虚 ...

  5. 建立 F103C8T6 HAL库 Makefile FreeRTOS 工程

    F103C8T6 HAL库 Makefile FreeRTOS 工程模板 环境 该工程的开发平台为 ARM-GCC 工具链和 Make > arm-none-eabi-gcc -v gcc ve ...

  6. PHP的HTTP验证

    在日常开发中,我们进行用户登录的时候,大部分情况下都会使用 session 来保存用户登录信息,并以此为依据判断用户是否已登录.但其实 HTTP 也提供了这种登录验证机制,我们今天就来学习关于 HTT ...

  7. 对象赋值在PHP中到底是不是引用?

    之前的文章中,我们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,直接就是引用赋值.那么到底真实情况是怎样呢? 之前变量赋值的文章 PHP的变量赋值 对象引用测试 在继续深入的学习PHP ...

  8. css3 flex的IE8浏览器兼容问题

    我这是进行判断浏览器 css判断ie版本才引用样式或css文件 <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> &l ...

  9. javascript 字符串反转 strip_tags 字符串常用的自定义函数,加载css etc.

    字符串反转 String.prototype.reverse = function() { var a = this.split(''); for (var i = 0, j = a.length-1 ...

  10. 如何使用jemeter进行性能测试

    下载链接:http://jmeter.apache.org/download_jmeter.cgi 一:如何使用jemeter进行压测 1)稳定性测试就需要长时间运行,其运行时间1天.2天.一周等 2 ...