XJOI contest 1592
首先
热烈庆祝“CSP-S 2020全国开放赛前冲刺模拟训练题2”圆满结束!!!
感谢大毒瘤颗粒囊的题目。题目还是很不错的,部分分设置的不合理,各种神仙随便 AK ,蒟蒻只能爆零。
Problem A
不会,下一个。
暴搜代码如下:
#include<bits/stdc++.h>
using namespace std;
struct Num{int a,b;};
Num opt[25];
int l1,r1,l2,r2,cnt;
int dfs(int now,int a,int b,int use)
{
if(a==0&&b==0&&use%2==0) return 1;
if(a==0&&b==0) return -1;
if(now>=20) return 0;
int tmp;
tmp=dfs(now+1,a,b,use);
if(tmp!=0) return tmp;
tmp=dfs(now+1,a-opt[now].a,b-opt[now].b,use+1);
if(tmp!=0) return tmp;
return 0;
}
void solve()
{
cin>>l1>>r1>>l2>>r2,cnt=0;
for(int i=l1;i<=r1;++i)
{
for(int j=l2;j<=r2;++j)
cnt+=(dfs(0,i,j,0)>0);
}
printf("%d\n",cnt);
}
int main()
{
opt[0].a=1,opt[0].b=0;
opt[1].a=-1,opt[1].b=1;
opt[2].a=0,opt[2].b=-2;
opt[3].a=2,opt[3].b=2;
for(int i=4;i<20;++i)
{
opt[i].a=opt[i-4].a*(-4);
opt[i].b=opt[i-4].b*(-4);
}
int T;cin>>T;
while(T--) solve();
}
Problem B
直接枚举矩形宽度,调和级数的和是 \(O(n\log_2 n)\) 级别的。判重直接用 \(\text{hash}\) 即可。但是题目有一点卡常,我的代码只能跑一半的分。
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define Lint long long
const int N=1e6+5;
const Lint MOD1=19260817;
const Lint MOD2=998244353;
string s;int n;
Lint sum1[N],ksm1[N];
Lint sum2[N],ksm2[N];
set<pair<Lint,Lint> > bag;
inline pair<Lint,Lint> cut(int l,int r)
{
Lint tmp1=(sum1[r]-sum1[l-1]*ksm1[r-l+1]%MOD1+MOD1)%MOD1;
Lint tmp2=(sum2[r]-sum2[l-1]*ksm2[r-l+1]%MOD2+MOD2)%MOD2;
return make_pair(tmp1,tmp2);
}
int solve(int len)
{
bag.clear();
if(n%len==0&&n!=len)
{
for(int i=1;i+len-1<=n;i+=len)
{
pair<Lint,Lint> L=cut(1,i-1),R=cut(i+len,n),tmp;
tmp.first=(L.first*ksm1[n-i-len+1]%MOD1+R.first)%MOD1;
tmp.second=(L.second*ksm2[n-i-len+1]%MOD2+R.second)%MOD2;
bag.insert(tmp);
}
}
Lint rem=n%len;
for(int i=1;i+rem-1<=n;i+=len)
{
pair<Lint,Lint> L=cut(1,i-1),R=cut(i+rem,n),tmp;
tmp.first=(L.first*ksm1[n-i-rem+1]%MOD1+R.first)%MOD1;
tmp.second=(L.second*ksm2[n-i-rem+1]%MOD2+R.second)%MOD2;
bag.insert(tmp);
}
// printf("%d\n",(int)bag.size());
return bag.size();
}
Lint res=0;
int main()
{
cin>>s,n=s.length(),ksm1[0]=ksm2[0]=1;
for(int i=1;i<=n;++i) ksm1[i]=ksm1[i-1]*27%MOD1;
for(int i=0;i<n;++i) sum1[i+1]=(sum1[i]*27+s[i]-'a'+1)%MOD1;
for(int i=1;i<=n;++i) ksm2[i]=ksm2[i-1]*27%MOD2;
for(int i=0;i<n;++i) sum2[i+1]=(sum2[i]*27+s[i]-'a'+1)%MOD2;
for(int i=1;i<=n;++i) res+=solve(i);
printf("%lld\n",res);
return 0;
}
Problem C
这道题目感觉还可以,原本应该有机会拿满分的,但是由于考虑到其他题目的部分分,就没打(然后发现部分分还没有这个多)。
就是考虑用 \(f_{i,j,k}\) 表示在第 \(i\) 列搭高度为 \(j\) 的积木时的和,同时 \(k\in {0,1}\) ,表示是否有过高度为 \(h\) 的列。这里的平方和强行用二项式定理来维护。然后转移方程易得:
\]
\]
\]
然后这个东西前缀和优化还是比较方便的,然后就可以 \(O(n^2)\) 了。
代码如下, \(O(n^3)\) 的做法:
#include<bits/stdc++.h>
using namespace std;
#define Lint long long
const int N=2e2+5;//woshishabi
const Lint MOD=998244353;
int n,m;
Lint way[N][N][2];
Lint f1[N][N][2];
Lint f2[N][N][2];
int main()
{
cin>>n>>m;
for(int j=1;j<m;++j)
f1[1][j][0]=j,f2[1][j][0]=j*j,way[1][j][0]=1;
f1[1][m][1]=m,f2[1][m][1]=m*m,way[1][m][1]=1;
for(int i=2;i<=n;++i)
{
for(int j=1;j<m;++j)
{
for(int k=1;k<m;++k)
{
if(j<=k)
{
f1[i][j][0]+=f1[i-1][k][0],f1[i][j][0]%=MOD;
f2[i][j][0]+=f2[i-1][k][0],f2[i][j][0]%=MOD;
way[i][j][0]+=way[i-1][k][0],way[i][j][0]%=MOD;
f1[i][j][1]+=f1[i-1][k][1],f1[i][j][1]%=MOD;
f2[i][j][1]+=f2[i-1][k][1],f2[i][j][1]%=MOD;
way[i][j][1]+=way[i-1][k][1],way[i][j][1]%=MOD;
}
else
{
f1[i][j][0]+=f1[i-1][k][0]+(j-k)*way[i-1][k][0]%MOD,f1[i][j][0]%=MOD;
f2[i][j][0]+=f2[i-1][k][0]+2*f1[i-1][k][0]*(j-k)%MOD+way[i-1][k][0]*(j-k)*(j-k)%MOD,f2[i][j][0]%=MOD;
way[i][j][0]+=way[i-1][k][0],way[i][j][0]%=MOD;
f1[i][j][1]+=f1[i-1][k][1]+(j-k)*way[i-1][k][1]%MOD,f1[i][j][1]%=MOD;
f2[i][j][1]+=f2[i-1][k][1]+2*f1[i-1][k][1]*(j-k)%MOD+way[i-1][k][1]*(j-k)*(j-k)%MOD,f2[i][j][1]%=MOD;
way[i][j][1]+=way[i-1][k][1],way[i][j][1]%=MOD;
}
}
f1[i][j][1]+=f1[i-1][m][1],f1[i][j][1]%=MOD;
f2[i][j][1]+=f2[i-1][m][1],f2[i][j][1]%=MOD;
way[i][j][1]+=way[i-1][m][1],way[i][j][1]%=MOD;
}
for(int k=1;k<=m;++k)
{
f1[i][m][1]+=f1[i-1][k][0]+(m-k)*way[i-1][k][0]%MOD,f1[i][m][1]%=MOD;
f2[i][m][1]+=f2[i-1][k][0]+2*f1[i-1][k][0]*(m-k)%MOD+way[i-1][k][0]*(m-k)*(m-k)%MOD,f2[i][m][1]%=MOD;
way[i][m][1]+=way[i-1][k][0],way[i][m][1]%=MOD;
f1[i][m][1]+=f1[i-1][k][1]+(m-k)*way[i-1][k][1]%MOD,f1[i][m][1]%=MOD;
f2[i][m][1]+=f2[i-1][k][1]+2*f1[i-1][k][1]*(m-k)%MOD+way[i-1][k][1]*(m-k)*(m-k)%MOD,f2[i][m][1]%=MOD;
way[i][m][1]+=way[i-1][k][1],way[i][m][1]%=MOD;
}
}
Lint res=0;
for(int i=1;i<=m;++i) res+=f2[n][i][1],res%=MOD;
printf("%lld\n",res);
return 0;
}
Problem D
不会,下一个。
暴搜如下:
#include<bits/stdc++.h>
using namespace std;
#define Lint long long
const int N=2e2+5,M=1e5+5;
const Lint MOD=998244373;
int n,m,cnt=0;
vector<int> bag[N];
int mp[N][N],deg[N];
int ord[N];bool used[N];
Lint res=0;
void dfs(int now)
{
if(now>=cnt)
{
int hhh=0;
for(int i=1;i<cnt;++i)
{
for(int j=i+1;j<cnt;++j)
hhh+=(ord[i]>ord[j]);
}
Lint sum=1;
for(int i=1;i<cnt;++i) sum*=mp[i][ord[i]],sum%=MOD;
res+=MOD+pow(-1,hhh)*sum,res%=MOD;
return ;
}
for(int i=1;i<cnt;++i)
{
if(used[i]) continue;
used[i]=true;
ord[now]=i;
dfs(now+1);
used[i]=false;
}
}
int main()
{
cin>>n>>m;
for(int i=1,x;i<=n;++i)
{
scanf("%d",&x);
for(int j=1;j<=x;++j)
bag[i].push_back(++cnt);
}
for(int i=1,u,v;i<=m;++i)
{
scanf("%d%d",&u,&v);
for(int c=0;c<(int)bag[u].size();++c)
{
for(int d=0;d<(int)bag[v].size();++d)
{
if(bag[u][c]==bag[v][d]) continue;
mp[bag[u][c]][bag[v][d]]++;
mp[bag[v][d]][bag[u][c]]++;
deg[bag[u][c]]++;
deg[bag[v][d]]++;
}
}
}
for(int i=1;i<=cnt;++i)
{
for(int j=1;j<=cnt;++j)
{
if(i!=j) mp[i][j]=-mp[i][j];
else mp[i][j]=deg[i];
}
}
for(int i=1;i<=cnt;++i)
{
for(int j=1;j<=cnt;++j)
mp[i+cnt-1][j]=mp[i][j];
}
dfs(1);
printf("%lld\n",res);
}
XJOI contest 1592的更多相关文章
- XJOI contest 1590
首先 热烈庆祝"CSP-S 2020全国开放赛前冲刺模拟训练题1"圆满结束!!! 感谢大毒瘤周指导的题目.题目还是很不错的,部分分设置的也比较合理,各种神仙随便 \(\text{A ...
- XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
题目描述: 你有一个1到N的排列P1,P2,P3...PN,还有M对数(x1,y1),(x2,y2),....,(xM,yM),现在你可以选取任意对数,每对数可以选取任意次,然后对选择的某对数(xi, ...
- [contest 781] 9.6
[contest 781] 9.6 - XJOI czx的温暖题... T1 军训
- [contest 782] 9.7
[contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
随机推荐
- rgw配置删除快速回收对象
前言 做rgw测试的时候,经常会有删除文件的操作,而用默认的参数的时候,rgw是通过gc回收机制来处理删除对象的,这个对于生产环境是有好处的,把删除对业务系统的压力分摊到不同的时间点,但是测试的时候, ...
- Git-stash(暂存)
修改某文件后,不想commit,使用stash保存在本地的某分支内 # 暂存 git stash ## 可暂存新增文件 git stash -u ## 为此次暂存添加标识 git stash save ...
- Python_进程process 与 线程thread
进程process 与 线程thread 的区别 各个进程独立使用内存空间,(默认)不可互相访问,线程共享内存 进程的子进程是复制一份父进程,线程没有
- [原题复现+审计][0CTF 2016] WEB piapiapia(反序列化、数组绕过)[改变序列化长度,导致反序列化漏洞]
简介 原题复现: 考察知识点:反序列化.数组绕过 线上平台:https://buuoj.cn(北京联合大学公开的CTF平台) 榆林学院内可使用信安协会内部的CTF训练平台找到此题 漏洞学习 数组 ...
- 在Guitar Pro中如何模拟电子管音响
在这篇文章中,我们将使用Guitar Pro 7中的功能和工具,完成构建一个真实的电子管吉他音箱调音过程. 虽然Guitar Pro是用于创建吉他乐谱的工具,但在新版本中(主要是6和7)它也有一些模拟 ...
- FL Studio中如何制作和混音警报声
警报声在当今的许多电影配乐中,或者电子音乐的环境fx中经常出现.为了使用这种尖刺的警示声音,我们除了自己录制已有的警报声以外,也可以使用FL Studio20中的合成器和混音插件来制作属于自己的警报声 ...
- CleanMyMac X“断网激活”真的能激活软件吗?
CleanMyMac X帮助Mac系统进行垃圾清理,清除多余的缓存.应用程序等,在提高工作效率上起了很大的作用.但是随着对软件的需求不断增加,很多人开始研究通过捷径破解正版软件,但是是否能成功呢?今天 ...
- Requests 库的使用
Python 的标准库 urllib 提供了大部分 HTTP 功能,但使用起来较繁琐.通常,我们会使用另外一个优秀的第三方库:Requests,它的标语是:Requests: HTTP for Hum ...
- jmeter压测mysql数据库
jmeter连接并压测mysql数据库,之前一直想用jmeter一下测试mysql数据库的性能,今天偶然看到一篇博客,于是乎开始自己动手实践. 一.准备工作 1.安装好mysql数据库,可以安装在本地 ...
- exgcd 学习笔记
最大公约数 更相减损术:\(\gcd(x,y)=\gcd(x,y-x)(x\leq y)\). 证明: 设 \(\gcd(x,y)=k\),则 \(x=kp,y=kq,\gcd(p,q)=1\). 那 ...