[考试反思]1109csp-s模拟测试107:低能
诶一看这不是水题AK场吗?然后80分钟就拿到了285分。
然后,对拍?还是卡T2常数?还是想T2正解?
于是上述三项我依次进行了。
前两项让我的分数丝毫不变但是吃掉了我一个多小时的时间。
卡常卡的也不彻底,不然就能再多个5分。因为心里还想着我想想正解。
最后剩余不多的时间里想到了一个接近正解的思路。。。因为没有时间写所以也就放弃了进一步的思考。
首先肯定还是要%%%Paris值得纪念的考试。
然后至于我。。。现在真的是水题考不高,难题不会做。。。
没前途。联赛啊。。。省选啊。。。不要止步于此啊。。。
T1:字符交换
二分答案。枚举从哪个字符开始。
最优决策一定是聚拢到最中间的那个字符的位置。
前缀和+等差数列求和就可以把绝对值拆掉。
总复杂度$O(nlogn)$
#include<cstdio>
#include<vector>
using namespace std;
vector<int>v[];
char s[];int n,k,tot[][];
int cal(int l,int r){return (l+r)*(r-l+)/;}
int tp(int i,int l,int r){return tot[i][r]-tot[i][l-];}
bool chk(int len){
for(int i=;i<;++i)if(v[i].size()>=len)for(int j=;j+len-<=v[i].size();++j){
int l=j,r=j+len-,m=j+(len>>),mp=v[i][m-];
if(-tp(i,l,m)+cal(mp-m+l,mp)+tp(i,m+,r)-cal(mp+,mp+r-m)<=k)return true;
}
return false;
}
int main(){freopen("swap.in","r",stdin);freopen("swap.out","w",stdout);
scanf("%d%d%s",&n,&k,s+);
for(int i=;i<=n;++i)v[s[i]-'a'].push_back(i);
for(int i=;i<;++i)for(int j=;j<v[i].size();++j)tot[i][j+]=tot[i][j]+v[i][j];
int l=,r=n,ans;
while(l<=r)if(chk(l+r>>))ans=l=l+r>>,l++;else r=(l+r>>)-;
printf("%d\n",ans);
}
T2:平方数
如果一个数含有平方因子,那么把它干掉之后这个数与其它数的关系不变。
于是筛出$\sqrt{1e9}$以内的所有质数(4300个左右),用它干掉所有平方因子,然后哈希表统计答案。
复杂度$O(4000n)$,能得到$70~90$不等。
#include<cstdio>
#include<cmath>
using namespace std;
struct hash_map{
int fir[],l[],to[],w[],cnt;
int &operator[](int x){
int r=x%;
for(int i=fir[r];i;i=l[i])if(to[i]==x)return w[i];
l[++cnt]=fir[r];fir[r]=cnt;to[cnt]=x;return w[cnt];
}
}M;
int al[],cnt,p[],n,q[];long long ans;
int main(){freopen("square.in","r",stdin);freopen("square.out","w",stdout);
for(int i=;i<=;++i)if(!al[i]){
p[++cnt]=i;
for(int j=;j*i<=;++j)al[i*j]=;
}
for(int i=;i<=cnt;++i)q[i]=p[i]*p[i];
q[++cnt]=;
scanf("%d",&n);
while(n--){
int x,y=;scanf("%d",&x);
for(int i=;x>=q[i];++i){
while(x%q[i]==)x/=q[i];
if(x%p[i]==)x/=p[i],y*=p[i];
}
int q=sqrt(x);if(q*q!=x)y*=x;
int &P=M[y];ans+=P;P++;
}printf("%lld\n",ans);
}
暴力
进一步优化这个思路,$\sqrt{1e9}$显然就是复杂度瓶颈。
考虑如何能够不筛那么多。
对于每一个数,它含有超过1000的平方因子至多有1个($1000^2=1000000$,放不下两个)
那么把它们都筛一遍是多余的。
那么就筛到1000,考虑剩下的是什么。
改变筛的策略,对于你枚举的1000以内的数时,不止干掉平方因子,单个一次的因子也干掉(但是要记录下来累乘到一个变量y里)
最后剩下的数,对它进行质因数分解,它的最小因子也大于1000。而且它之可能是以下4种情况:
- 是一个平方数
- 是两个大于1000的质数相乘
- 是一个大于1000的质数
- 是1
继续上面的思路,我们只需要干掉它的平方因子。
因为现在它不可能是平方数×另一个数的形式,所以我们直接开根判断它是不是平方数。
如果是就干掉,否则剩余的部分也累乘到y里。
那么y就是原数干掉所有平方因子之后所剩下的。
1000以内的质因子只有170个。总复杂度$O(170n)$
(cbx实践证明,就算你不用质数筛而是1000个全筛$O(1000n)$也是能AC的,但是在老年评测机下就不一定了)
#include<cstdio>
#include<cmath>
using namespace std;
struct hash_map{
int fir[],l[],to[],w[],cnt;
int &operator[](int x){
int r=x%;
for(int i=fir[r];i;i=l[i])if(to[i]==x)return w[i];
l[++cnt]=fir[r];fir[r]=cnt;to[cnt]=x;return w[cnt];
}
}M;
int al[],cnt,p[],n,q[];long long ans;
int main(){freopen("square.in","r",stdin);freopen("square.out","w",stdout);
for(int i=;i<=;++i)if(!al[i]){
p[++cnt]=i;
for(int j=;j*i<=;++j)al[i*j]=;
}
for(int i=;i<=cnt;++i)q[i]=p[i]*p[i];
q[++cnt]=;
scanf("%d",&n);
while(n--){
int x,y=;scanf("%d",&x);
for(int i=;x>=q[i];++i){
while(x%q[i]==)x/=q[i];
if(x%p[i]==)x/=p[i],y*=p[i];
}
int q=sqrt(x);if(q*q!=x)y*=x;
int &P=M[y];ans+=P;P++;
}printf("%lld\n",ans);
}
T3:多维网络
部分分给的很全啊。
首先最基本的就是有$n$种物品每种有$a_i$个那么本质不同的排列数是$\frac{(\sum\limits_{i=1}^{n} a_i)!}{\prod\limits_{i=1}^{n}a_i!}$
观察部分分提示,n=0的直接就是套式子。
n=1需要去掉经过了这个点的路径,那么就计算一下经过这个点的路径有多少,其实就是把路径拆成了两部分,相乘即可。
n=2的话也一样啊,只不过要去掉两种经过了这两个点之一的路径,但是减多了,还要加回来两个点都经过了的路径。
n=3。。。
这不就是容斥么???
但是在n=500时,手动容斥估计码长都能超限。
运用一些性质,每个点只会走到各坐标都比它大的点。我们把这样的关系连边。然后边权就是从一个点走到另一个点的方案数,套上面的式子。
然后就可以得到一个DAG。(当然没有环。。。)。DAG?当然拓扑啦。
然后这个容斥说白了就是奇加偶减,考虑奇偶。
就是如果路径上有奇数个点,那么答案加这么多,否则减。
初始状态是在原点,偶数步方案数为1,奇数步方案数为0。
然后跑拓扑,按照边权统计方案。
最后输出终点的奇数步-偶数步就是答案。
在有重复点的时会出锅(DAG有环),我判掉了不知道有没有用。。。
#include<cstdio>
#define mod 1000000007
int n,d,x[][],fac[],inv[],dp[][];
int fir[],l[],to[],w[],deg[],ec,q[];
int qpow(long long b,int t,long long a=){for(;t;t>>=,b=b*b%mod)if(t&)a=a*b%mod;return a;}
bool com(int p1,int p2){
for(int i=;i<=d;++i)if(x[i][p1]>x[i][p2])return false;
return true;
}
bool sam(int p1,int p2){
for(int i=;i<=d;++i)if(x[i][p1]!=x[i][p2])return false;
return true;
}
void Swap(int p1,int p2){
for(int i=;i<=d;++i)x[i][p1]^=x[i][p2]^=x[i][p1]^=x[i][p2];
}
int cal(int p1,int p2){
int tot=,ans;
for(int i=;i<=d;++i)tot+=x[i][p2]-x[i][p1];
ans=fac[tot];
for(int i=;i<=d;++i)ans=1ll*ans*inv[x[i][p2]-x[i][p1]]%mod;
return ans;
}
void link(int a,int b,int v){l[++ec]=fir[a];fir[a]=ec;to[ec]=b;w[ec]=v;deg[b]++;}
main(){freopen("net.in","r",stdin);freopen("net.out","w",stdout);
fac[]=;
for(int i=;i<=;++i)fac[i]=1ll*fac[i-]*i%mod;
inv[]=qpow(fac[],mod-);
for(int i=;~i;--i)inv[i]=inv[i+]*(i+1ll)%mod;
scanf("%d%d",&d,&n);n++;
for(int i=;i<=d;++i)scanf("%d",&x[i][n]);
for(int i=;i<n;++i)for(int j=;j<=d;++j)scanf("%d",&x[j][i]);
for(int i=;i<n;++i)for(int j=i+;j<n;++j)if(sam(i,j))Swap(j,n-),Swap(n-,n),n--;
for(int i=;i<=n;++i)for(int j=;j<=n;++j)if(i!=j&&com(i,j))link(i,j,cal(i,j));
dp[][]=;
for(int h=,t=;h<=t;++h){
int p=q[h];
for(int i=fir[p];i;i=l[i]){
deg[to[i]]--;
if(!deg[to[i]])q[++t]=to[i];
dp[][to[i]]=(dp[][to[i]]+1ll*dp[][p]*w[i])%mod;
dp[][to[i]]=(dp[][to[i]]+1ll*dp[][p]*w[i])%mod;
}
}
printf("%d\n",(dp[][n]-dp[][n]+mod)%mod);
}
[考试反思]1109csp-s模拟测试107:低能的更多相关文章
- [考试反思]0718 NOIP模拟测试5
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
- [考试反思]0814NOIP模拟测试21
前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...
- [考试反思]1109csp-s模拟测试106:撞词
(撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...
- [考试反思]0909csp-s模拟测试41:反典
说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...
- [考试反思]0729NOIP模拟测试10
安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...
- [考试反思]0714/0716,NOIP模拟测试3/4
这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...
- [考试反思]1003csp-s模拟测试58:沉淀
稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...
- [考试反思]0816NOIP模拟测试23
210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...
- [考试反思]0801NOIP模拟测试11
8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...
随机推荐
- FFmpeg(五) 重采样相关函数理解
一.重采样流程 重采样(解码音频数据之后格式不可以直接播放,需要重采样,类似图像的像素转换) 1.分配上下文 2.设置参数(分为(前几个是)输出格式和(后几个)输入格式,两个相对应的) 可以通过改变样 ...
- Spring系列(六):Spring事务源码解析
一.事务概述 1.1 什么是事务 事务是一组原子性的SQL查询,或者说是一个独立的工作单元.要么全部执行,要么全部不执行. 1.2 事务的特性(ACID) ①原子性(atomicity) 一个事务必须 ...
- springmvc中重定向该如何处理?
如果登录成功,会重定向到系统首页 response.sendRedirect("jsp/frame.jsp"); 在springmvc中,应该如何处理?是否可以直接使用 retur ...
- Redis info 说明
背景 前面几篇文章介绍完了Redis相关的一些说明,现在看看如何查看Redis的一些性能指标和统计信息,也可以看官网说明. INFO [section] INFO命令返回有关服务器的信息和统计信息,带 ...
- 我最推荐的一张Java后端学习路线图,Java工程师必备
前言 学习路线图往往是学习一样技术的入门指南.网上搜到的Java学习路线图也是一抓一大把. 今天我只选一张图,仅此一图,足以包罗Java后端技术的知识点.所谓不求最好,但求最全,学习Java后端的同学 ...
- python编程基础之三十三
构造方法: 目的:构造方法用于初始化对象,可以在构造方法中添加成员属性 触发时机:实例化对象的时候自动调用 参数:第一个参数必须是self,其它参数根据需要自己定义 返回值:不返回值,或者说返回Non ...
- Ned 的难题
题目描述 Ned 再也看不下去 Robert 的种种恶习, 于是他决定出一道题来让他醒悟. Ned 的题目是这样: 给出一个有 n 个数的序列, 求其中所有连续子序列的数的最大公因数的乘积模 1000 ...
- 分库分表(7)--- SpringBoot+ShardingSphere实现分库分表 + 读写分离
分库分表(7)--- ShardingSphere实现分库分表+读写分离 有关分库分表前面写了六篇博客: 1.分库分表(1) --- 理论 2.分库分表(2) --- ShardingSphere(理 ...
- DP题 总结 [更新中]
建设中 ... 预防针 : 本蒟蒻代码风格清奇(⊙﹏⊙)b 一.选学霸 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所 ...
- 实用---eclipse中的代码提示功能
Eclipse 的代码提示功能,具体配置 1. 打开Eclipse ,然后“window”→“Preferences” 2. 选择“java”,展开,“Editor”,选择“Content Assis ...