2020EC-final

传送门

文章目录

  • B - Rectangle Flip 2
    • 题意:
    • 思路:
  • A - Namomo Subsequence
    • 题意:
    • 思路:
  • D - City Brain
    • 题意:
    • 思路:

B - Rectangle Flip 2

题意:

给你一个n∗mn*mnm的矩阵,接下来n∗mn*mnm秒每秒都会消失一个格子,问每个时刻矩阵中构成的矩形有多少个。

n,m≤500n,m\le 500n,m500

思路:

先说一下复杂度n4n^4n4但是跑不满的算法,对于每个删去的点,枚举左边以及右边每个位置,维护其能到的上下界,比如上界xxx下界yyy,当前点是(dx,dy)(dx,dy)(dx,dy),那么答案就是(dx−y+1)∗(x−dx+1)(dx-y+1)*(x-dx+1)(dxy+1)(xdx+1),看似n4n^4n4,实际500ms500ms500ms就跑完了。

还有一个稳定n3n^3n3用单调栈跑的并没有看懂代码是怎么写的,就先咕咕了。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=510,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int D[N][N],U[N][N];
int st[N][N];int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) {for(int j=1;j<=m;j++){D[i][j]=n+1;U[i][j]=0;}}LL ans=1ll*n*(n+1)*m*(m+1)/4;for(int i=1;i<=n*m;i++) {int x,y; scanf("%d%d",&x,&y);for(int l=y,u1=0,d1=n+1;l>=1&&!st[x][l];l--) {u1=max(u1,U[x][l]+1);d1=min(d1,D[x][l]-1);for(int r=y,u2=u1,d2=d1;r<=m&&!st[x][r];r++) {u2=max(u2,U[x][r]+1);d2=min(d2,D[x][r]-1);ans-=1ll*(x-u2+1)*(d2-x+1);}}for(int j=x;j<=n;j++) U[j][y]=max(U[j][y],x);for(int j=x;j>=1;j--) D[j][y]=min(D[j][y],x);printf("%lld\n",ans);st[x][y]=1;}return 0;
}
/**/

A - Namomo Subsequence

题意:

给你一个串sss,问你有多少个长度为666且形如ABCDCDABCDCDABCDCD的子序列。

6≤∣s∣≤1e66\le |s|\le 1e66s1e6,字符集大小626262

思路:

考虑到字符集和长度都很长,所以考虑62n62n62n的算法,62∗62n62*62n6262n的肯定过不去了。

直接维护肯定是不好弄的,可以发现能维护出来前两个位置就不错了,所以我们考虑将其切割,分开来看。

将其分成ABABABCDCDCDCDCDCD两个部分来看,枚举CCC的位置,那么答案就是两边的方案数乘起来。

对于CDCDCDCDCDCD,我们比较容易维护出来,定义f[i][j][k]f[i][j][k]f[i][j][k]代表类型为iiiC=j,D=kC=j,D=kC=j,D=k的个数,其中i=2i=2i=2代表ijijijijijiji=1i=1i=1代表jijjijjiji=0i=0i=0代表ijijij,那么转移也比较容易,直接从上一个状态切过来即可,注意每次f[2][j][k]f[2][j][k]f[2][j][k]都要清零。

由于很难将左边的信息也记下来,记下来也需要62∗6262*626262来遍历,所以很不划算。

考虑容斥,将左边的所有方案(不包含相同字符个数相乘)直接于右边相乘,考虑这样多算了什么,显然多算了A=C,A=D,B=D,B=CA=C,A=D,B=D,B=CA=C,A=D,B=D,B=C的情况,这个可以容斥来求。

复杂度O(62n)O(62n)O(62n)

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=998244353,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int a[N];
LL pre[N][64];
LL f[3][64][64],n2;
char s[N];int get(char c) {if(c>='a'&&c<='z') return c-'a'+1;else if(c>='A'&&c<='Z') return c-'A'+27;else return c-'0'+53;
}void add(LL &x,LL y) {x+=y; if(x>=mod) x-=mod;
}void del(LL &x,LL y) {x-=y; if(x<0) x+=mod;
}LL qmi(LL a,LL b) {LL ans=1;while(b) {if(b&1) ans=ans*a%mod;a=a*a%mod;b>>=1;}return ans%mod;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);n2=qmi(2,mod-2);scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++) a[i]=get(s[i]);for(int i=1;i<=n;i++) {for(int j=1;j<=62;j++) {pre[i][j]=pre[i-1][j];}pre[i][a[i]]++;}LL ans=0;for(int i=n;i>=1;i--) {LL sum=0,all=i-1,i2=0;for(int j=1;j<=62;j++) add(i2,1ll*pre[i-1][j]*(all-pre[i-1][j])%mod);(i2*=n2)%=mod;for(int j=1;j<=62;j++) {if(a[i]==j) continue;add(f[2][a[i]][j],f[1][a[i]][j]);add(f[0][a[i]][j],1ll*pre[n][j]-pre[i][j]);add(f[1][j][a[i]],f[0][j][a[i]]);LL mul=((i2-pre[i-1][j]*(all-pre[i-1][j])%mod)%mod-pre[i-1][a[i]]*(all-pre[i-1][a[i]])%mod)%mod+pre[i-1][j]*pre[i-1][a[i]]%mod;mul%=mod; mul+=mod; mul%=mod;add(ans,f[2][a[i]][j]*mul%mod);f[2][a[i]][j]=0;}}printf("%lld\n",ans);return 0;
}
/**/

D - City Brain

题意:

给你一个nnn个点mmm条边的无向图,边权初始为111,你可以对边进行kkk此操作,每次选择任意边,假设某条边操作了xxx次,那么他的权值就变成了1x\frac{1}{x}x1,给你两对起点终点,问对边操作完之后,从两对起点到相应终点的路径和最短是多长。

n,m≤5000,0≤k≤1e9n,m\le 5000,0\le k\le 1e9n,m5000,0k1e9

思路:

考虑如果两个路径有重叠,那么肯定是与在两条路各个路径上走不同的,所以考虑能否将其拿出来,单独考虑。

考虑如果两条路径有两部分是重叠的,那么肯定不优于两个人都从第一个重叠开始走同一路径到下一个重叠优,这样重叠就变成一段连续的区间,所以结论就是两条路径如果有重叠,那么一定是连续的一段。

考虑枚举重叠部分的长度,假设为lll,那么预处理一下重叠部分为lll的时候其他路径的最短和len[l]len[l]len[l],这个n2n^2n2可以处理出来,我们发现我们不好确认分给重叠部分的次数多少,但是这时一个凹函数,所以我们三分给重叠部分的操作次数,让后checkcheckcheck一下,问题又变成了给长度为lenlenlen的路径分配xxx次操作的最小代价,这个还是比较容易考虑的,首先就是均分次数,多余的次数也是均分,算一下就好,注意不要除000

还有细节就是n2n^2n2处理lenlenlen的时候,枚举的公共路径的端点i,ji,ji,j的时候,要分s1−>i,j−>t1s1->i,j->t1s1>i,j>t1还有s1−>j,i−>t1s1->j,i->t1s1>j,i>t1两种情况,对于s2,t2s2,t2s2,t2同理。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=5010,mod=998244353,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m,k;
int s1,s2,t1,t2;
int dis[N][N];
vector<int>v[N];
int len[N];//计算路径长度为x,能分配p个的时候最小值
double get(int p,int x) {if(x==0) return 0;int cnt=p/x,rest=p%x;return 1.0/(cnt+1)*(x-rest)+1.0/(cnt+2)*rest;
}//返回分配给共同路径mid个,非共同路径k-mid个的答案
double check(int mid,int x) {int c1=k-mid,c2=mid;return get(c1,len[x])+get(c2,x)*2;
}int main()
{
//	ios::sync_with_stdio(false);
//	cin.tie(0);scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++) {int a,b; scanf("%d%d",&a,&b);v[a].pb(b); v[b].pb(a);}scanf("%d%d%d%d",&s1,&t1,&s2,&t2);for(int i=1;i<=n;i++) {queue<int>q; q.push(i);for(int j=1;j<=n;j++) dis[i][j]=INF;dis[i][i]=0;while(q.size()) {int u=q.front(); q.pop();for(auto x:v[u]) {if(dis[i][x]>dis[i][u]+1) {dis[i][x]=dis[i][u]+1;q.push(x);}}}}memset(len,0x3f,sizeof(len));len[0]=dis[s1][t1]+dis[s2][t2];for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {int l=dis[i][j];if(l==INF) continue;if(!(dis[s1][i]==INF||dis[j][t1]==INF||dis[s2][i]==INF||dis[j][t2]==INF))len[l]=min(len[l],dis[s1][i]+dis[j][t1]+dis[s2][i]+dis[j][t2]);if(!(dis[s1][j]==INF||dis[i][t1]==INF||dis[s2][i]==INF||dis[j][t2]==INF))len[l]=min(len[l],dis[s1][j]+dis[i][t1]+dis[s2][i]+dis[j][t2]);if(!(dis[s1][i]==INF||dis[j][t1]==INF||dis[s2][j]==INF||dis[i][t2]==INF))len[l]=min(len[l],dis[s1][i]+dis[j][t1]+dis[s2][j]+dis[i][t2]);if(!(dis[s1][j]==INF||dis[i][t1]==INF||dis[s2][j]==INF||dis[i][t2]==INF))len[l]=min(len[l],dis[s1][j]+dis[i][t1]+dis[s2][j]+dis[i][t2]);}}double ans=1e13;for(int x=0;x<=n;x++) {if(len[x]==INF) continue;int l=0,r=k;while(l<=r) {int mid1=l+(r-l)/3,mid2=r-(r-l)/3;if(check(mid1,x)<check(mid2,x)) r=mid2-1;else l=mid1+1;}ans=min(ans,check(r,x));}printf("%.13f\n",ans);return 0;
}
/*
10 9 19
5 2
4 1
2 1
6 5
10 8
8 1
9 3
7 6
1 3
7 7 6 4
*/

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

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

相关文章

统一流控服务开源:基于.Net Core的流控服务

先前有一篇博文&#xff0c;梳理了流控服务的场景、业界做法和常用算法统一流控服务开源-1&#xff1a;场景&业界做法&算法篇最近完成了流控服务的开发&#xff0c;并在生产系统进行了大半年的验证&#xff0c;稳定可靠。今天整理一下核心设计和实现思路&#xff0c;开…

小A的柱状图

小A的柱状图 思路 经典的单调栈题目&#xff0c;对于每一个位置&#xff0c;我们维护他以当前高度可以到达的最左方&#xff0c;以及他当前高度可以到达的最有方&#xff0c;显然就有以他的高度的矩形块的面积就出来了&#xff0c;所以我们只需要统计n个矩形的最大值就行。 …

建筑师 第一类斯特林数

文章目录目录题意:思路&#xff1a;目录 题意: 给你一个nnn的排列&#xff0c;排列中的数代表他的高度&#xff0c;问你有多少个排列能使得从左边能看到aaa个建筑&#xff0c;从右边能看到bbb个建筑。 如果建筑iii左边没有任何比他高的&#xff0c;那么他就能看到。 1≤n≤5…

poj 3233 Matrix Power Series

Matrix Power Series 思路 题意比较简单&#xff0c;就是要求S(n)∑i1nAiS(n) \sum _{i 1} ^{n} A^ {i}S(n)∑i1n​Ai&#xff0c;显然有S(n)S(n−1)∗AAS(n) S(n - 1) * A AS(n)S(n−1)∗AA&#xff0c;看到这里&#xff0c;那就简单了&#xff0c;递推式&#xff0c;加…

.NET Core 编写 Azure Function 并连接 GitHub 持续部署

点击上方蓝字关注“汪宇杰博客”导语Azure Function 是一个事件驱动型无服务器计算平台&#xff0c;可以解决复杂的业务流程问题&#xff0c;更加高效地进行开发。在本地构建和调试&#xff0c;而无需额外的设置&#xff0c;在云中大规模部署和操作&#xff0c;并使用触发器和绑…

Codeforces Round #766 (Div. 2) D. Not Adding 数学gcd

传送门 文章目录目录题意&#xff1a;思路&#xff1a;目录 题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;你每次可以选择其中的两个数&#xff0c;如果他们的gcdgcdgcd在数组中没有出现那么就可以加在数组后面构成一个新的数组&#xff0c;问数组最长是多少。 2≤n…

「数据ETL」从数据民工到数据白领蜕变之旅(五)-使用dotNET脚本实现SSIS无限扩展...

在前面一文中&#xff0c;正式引出了SSIS专业数据ETL工具&#xff0c;笔者仅能作引路作用&#xff0c;未能使用文章的方式给大家写出更多的入门级的文章&#xff0c;希望读者们可以自行根据分享的学习资源自行完成入门及进阶的学习。同时也想给大家分享到SSIS的能力边界性&…

P3067 [USACO12OPEN]Balanced Cow Subsets G 折半搜索

传送门 文章目录目录题意&#xff1a;思路&#xff1a;目录 题意&#xff1a; 给你nnn个数&#xff0c;从中任意选出一组数&#xff0c;使这些数能分成和相等的两组&#xff0c;问有多少种选数方案。 2≤n≤20,1≤ai≤1e92\le n\le 20,1\le a_i\le 1e92≤n≤20,1≤ai​≤1e9 …

poj 2191 Mersenne Composite Numbers

思路 用pollard_rho miller_rabin来拆分数字&#xff0c;如果得到的质因子大于等于2的话就按照格式输出&#xff0c;否则就不是我们想要的梅森素数。 代码 /*Author : lifehappy */ // #pragma GCC optimize(2) // #pragma GCC optimize(3) // #include <bits/stdc.h>…

数据结构为什么那么难?

来源 | 异步 | 文末赠书2017年8月&#xff0c;本着让更多的人轻松学习算法的初心&#xff0c;我写作了第一本书《趣学算法》&#xff0c;该书在出版后受到广大读者一致好评&#xff0c;在一年内重印了10次&#xff0c;并输出了繁体版的版权。一位读者对我说&#xff0c;读这本书…

书籍推荐:《C#7.0本质论》

在dotNet平台中有多种开发语言可以使用&#xff0c;C#无疑是其中应用得最为广泛的。学习一门编程语言最好的方式就是找一本好书系统地学习&#xff0c;我读过的关于C#的书籍中&#xff0c;我认为下面三本最为经典&#xff1a;《C#本质论》&#xff1a;入门类&#xff0c;目前最…

乌龟棋(dp)

乌龟棋 思路 最优值问题&#xff0c;显然可以通过dpdpdp解决&#xff0c;我们定义dp[i][j][k][l]dp[i][j][k][l]dp[i][j][k][l]表示到达1i∗2∗j3∗k4∗l1 i * 2 * j 3 * k 4 * l1i∗2∗j3∗k4∗l这个点之前已经走过的价值最大的值(i,j,k,li, j, k, li,j,k,l分别是走一步&…

CF 1631 D. Range and Partition 尺取 + 前缀和

传送门 文章目录目录&#xff1a;题意&#xff1a;思路&#xff1a;目录&#xff1a; 题意&#xff1a; 给你一个长度为nnn的数组aaa以及kkk&#xff0c;让你选择一个值域[x,y][x,y][x,y]&#xff0c;满足能将该数组分成连续的kkk段并且每段中值域在[x,y][x,y][x,y]内的个数严…

gRPC的简单使用

前言八月初的时候&#xff0c;在公司内部做了一个主题为《gRPC的简单使用》的分享&#xff0c;其实就是和小伙伴们扯扯淡&#xff0c;现在抽空回忆一下&#xff0c;也算是一个小小的总结吧。现在市面上耳熟能详的RPC框架也很多&#xff0c;下面列举几个遇到比较多的。谷歌的gRP…

P6282 [USACO20OPEN] Cereal S 思维

传送门 文章目录目录&#xff1a;题意&#xff1a;思路&#xff1a;目录&#xff1a; 题意&#xff1a; 你有nnn头奶牛&#xff0c;mmm中不同种类的麦片&#xff0c;每个麦片只有一箱&#xff0c;给你每个奶牛第一和第二喜欢的麦片&#xff0c;奶牛会先看第一喜欢的是否有&am…

HDU 4417 Super Mario(莫队 + 树状数组 + 离散化)

Super Mario 思路 区间查找问题&#xff0c;容易想到离线莫队&#xff0c;确实这题就是莫队&#xff0c;接下来我们考虑如何维护区间高度值问题。 既然是离线嘛&#xff0c;我们容易想到离散化和他挂钩&#xff0c;想想这题是否需要离散化&#xff0c;高度的最大值是1000000…

生命周期结束,Spring Boot 1.x退役

一年前 Spring 官方宣布 Spring Boot 1.x 生命周期将于今年 8 月 1 日结束&#xff0c;如今时间已到&#xff0c;在发布 Spring Boot 1.5.22 的同时&#xff0c;Spring 确认将不再为 1.x 系列发布维护版本。官方希望用户尽快迁移到 Spring Boot 2.x 上&#xff0c;为此还制作了…

P3085 [USACO13OPEN]Yin and Yang G 点分治

文章目录题意&#xff1a;思路&#xff1a;传送门 题意&#xff1a; 给你一颗nnn个点的树&#xff0c;每条边为黑色或者白色&#xff0c;问满足以下条件的路径条数&#xff1a;路径上存在一个不是端点的点&#xff0c;使得两端点到该点的两条路径上两种颜色的边数相等。 1≤n…

G. Xor-MST(异或最小生成树)

G. Xor-MST 思路 异或最小生成树&#xff0c;这里采用了一种分治的方法来贪心求解最值&#xff1a; 首先我们对所有的点权值从小到大排个序&#xff0c;从高位开始在中间找到一个这个位置上的0&#xff0c;10&#xff0c;10&#xff0c;1分界点分成两个集合&#xff0c;然后…

CF 1638 E. Colorful Operations set 区间平推

文章目录题意&#xff1a;思路&#xff1a;传送门 题意&#xff1a; 给你一个数组aaa&#xff0c;初始价值全为000&#xff0c;颜色全为111&#xff0c;让后让你实现以下三个操作&#xff1a; 将[l,r][l,r][l,r]区间内的颜色都染成ccc。将所有颜色为ccc的位置价值都加上xxx。…