暴力没打满。。。有点垃圾。。。

考得稍绝望,啥也不会啊???

T3的测试点分治还写挂了。。。

其实就是没有沉下心好好的思考,在三道题上来回切换结果一个成型思路都没有

T2既然已经想到那一步了居然没有继续想下去。。。

不管怎么说,还是思路凌乱了,没有稳下来

但是,也算是混进第一鸡房了,也是新的自我调整的机会吧

没怎么颓废,改题也快了。。。感觉不错

这是一个好的桌面背景。(Ubuntu Mono Bold Italic 150号字)

T1:trade

刚开始以为要怎么优化dp。但是这其实是一个比较明显的反悔型贪心。

因为取消卖出和进行买入这两个操作本质是一样的,往堆里扔就是了。

买a卖b再买b卖c,和买a卖c是等价的,这样就做到了反悔。

当你决定卖的时候就往堆里扔一个用于反悔卖出这个决定。

然后每个元素都还要往堆里扔一个来用于正常的买入。

代码比暴力dp还好写。

 #include<cstdio>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,x;long long ans;
main(){
scanf("%d%d",&n,&x);q.push(x);n--;
while(n--){
scanf("%d",&x);
if(x>q.top())ans+=x-q.top(),q.pop(),q.push(x);
q.push(x);
}printf("%lld\n",ans);
}

思路积累:

  • 反悔型贪心:正确性证明与数据结构结合达到最优决策

T2:sum

根据定义,有S[i][j]=S[i][j-1]+C[i][j]

打表发现,有S[i][j]=S[i-1][j-1]+S[i-1][j]

用含义就可以知道:i个里至多选j个,随意指定其中一个元素,如果它选,那么就在剩下的i-1里至多选j-1个,如果它不选,那就在剩下的i-1里选至多j个

合并一下,有S[i][j]=S[i-1][j]*2-C[i-1][j]

这样的形式就可以做到O(1)的把数组的某一维变化1了。可以莫队了。

 #include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
#define mod 1000000007
struct qs{int m,n,id;friend bool operator<(qs a,qs b){return a.n/!=b.n/?a.n/<b.n/:a.m/<b.m/;}}q[];
int fac[],inv[],invv[],id,Q,n,m,ans[];
int C(int b,int t){return b<t?:fac[b]*inv[t]%mod*inv[b-t]%mod;}
main(){//freopen("sum1.in","r",stdin);freopen("my.out","w",stdout);
fac[]=invv[]=inv[]=inv[]=fac[]=;
for(int i=;i<=;++i)fac[i]=fac[i-]*i%mod,invv[i]=mod-mod/i*invv[mod%i]%mod,inv[i]=inv[i-]*invv[i]%mod;
scanf("%lld%lld",&id,&Q);
int x=,y=,Ans=;
for(int i=;i<=Q;++i)scanf("%lld%lld",&q[i].n,&q[i].m),q[i].id=i;
sort(q+,q++Q);
for(int i=;i<=Q;++i){
while(x<q[i].n)Ans=(Ans+Ans-C(x,y)+mod)%mod,++x;
while(x>q[i].n)--x,Ans=(Ans+C(x,y))*500000004ll%mod;
while(y<q[i].m)++y,Ans=(Ans+C(x,y))%mod;
while(y>q[i].m)Ans=(Ans-C(x,y)+mod)%mod,--y;
ans[q[i].id]=Ans;
}for(int i=;i<=Q;++i)printf("%lld\n",ans[i]);
}

思路积累:

  • 莫队和分块思路在递推表达式求值上的应用

但是还是想讲一下自己傻逼的部分分想法:m全部相同的20分。

$S_{n,m}=\sum\limits_{i=0}^m C_{n,i} $

$=\sum\limits_{i=0}^m n! \times inv(i!) \times inv((n-i)!)$

$= n! \sum\limits_{i=0}^m inv(i!) \times inv((n-i)!) $

然后后面就是一个比较明显的卷积形式了。

因为求和只是到m为止,所以不能直接把两个inv套起来,对于第一个inv数组大于m的项赋成0就可以解决这个问题了。

然后我们就能求出对于每一个n后面的那个卷积式了,就可以O(1)回答询问了。

因为模数是1000000007,不是一个好的NTT模数,所以需要多模数CRT一发。

思路还好,就是如果考场上我要是打这个的话可能就不用干别的了。

又是用省选知识点打联赛暴力的好例子

诚当是磨砺思维吧(虽然在考场上耽误了不少时间)

T3:building

loj差点就让我弃坑了。

对于询问有多少个块,这还是比较好做的,差分一下O(1)修改,最后求两遍前缀和。

至于联通块,容易想起以前的结论:在无环图上,联通块数=点数-边数

然而这道题有环。我们把每一次操作作为一个点,把相邻的操作建边,求联通块。

可以利用并查集,这样它就成了树型的了,就可以用点数-边数了。

建边的时候,如果发现它们已经联通,那么就不再建边,这样就保证了无环。

我的思路是横边只与横边相邻,竖边只与竖边有相邻。

那么怎么考虑横边与竖边之间的相邻呢?

可以发现如果横边与竖边相邻的话,其实就是其中的一条边与另一条边的某一个端点相邻。

这样的话,我们在加入某一条横边的时候,同时也把它的两个端点当成竖边加入。加入竖边时同理。

然后逐行扫,不断加入x1小的边即可。

暴力的做法是爆扫相邻的两行/列枚举每一个块。这样的复杂度在极端时会被卡成n2

但是本题没有卡可以AC,虽说跑的很慢而且我的方法有有3倍量的块。2900ms。

 #include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
struct ps{int x1,x2,y1,y2,ord;friend bool operator<(ps a,ps b){return a.x1<b.x1;}}p[];
vector<ps>L[],R[];
int ans,cf[],f[],cb[],eds;
int find(int k){return f[k]==k?k:f[k]=find(f[k]);}
void link(int a,int b){
int fa=find(a),fb=find(b);
if(fa!=fb)eds++,f[fa]=fb;
}
int main(){
int id,n,m,k,q,qk,qx,pt=;scanf("%d%d%d%d%d",&id,&n,&m,&k,&q);
for(int i=,x1,x2,y1,y2;i<=k;++i){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
p[i]=(ps){x1,x2,y1,y2,f[i]=i};
if(x1==x2)cf[x1]+=y2-y1+,cf[x1+]-=y2-y1+;
else cf[x1]++,cf[x2+]--;
}
for(int i=;i<=n;++i)cf[i]+=cf[i-];
for(int i=;i<=n;++i)cf[i]+=cf[i-];
sort(p+,p+k+);
for(int I=;I<=n;cb[I]=pt-eds-,++I)while(p[pt].x1==I&&pt<=k){
int x1=p[pt].x1,x2=p[pt].x2,y1=p[pt].y1,y2=p[pt].y2,ord=p[pt].ord,X1=x1-,X2=x2+,Y1=y1-,Y2=y2+;
for(int i=;i<L[X1].size();++i)if(!(L[X1][i].y1>y2||L[X1][i].y2<y1))link(L[X1][i].ord,ord);
for(int i=;i<R[Y1].size();++i)if(!(R[Y1][i].x1>x2||R[Y1][i].x2<x1))link(R[Y1][i].ord,ord);
for(int i=;i<L[X2].size();++i)if(!(L[X2][i].y1>y2||L[X2][i].y2<y1))link(L[X2][i].ord,ord);
for(int i=;i<R[Y2].size();++i)if(!(R[Y2][i].x1>x2||R[Y2][i].x2<x1))link(R[Y2][i].ord,ord);
ps P1=(ps){x1,x1,y1,y1,ord},P2=(ps){x2,x2,y2,y2,ord};
if(y1==y2)R[y1].push_back(p[pt]),L[x2].push_back(P2),L[x1].push_back(P1);
else L[x1].push_back(p[pt]),R[y2].push_back(P2),R[y1].push_back(P1);
pt++;
}
while(q--)scanf("%d%d",&qk,&qx),printf("%d\n",qk?cb[qx]:cf[qx]);
}

肯定是可以优化的。一种是把vector改成set这样的话常数会非常大最后可能比暴力还慢。

另一种就是先把所有边都加入然后sort,用lower_bound查询并及时break就行。

要注意你建边时只与前面行的建边,没有扫到的行不要建。

QAQnlog的代码还没有写等会马上跟上啊我没脸溜了

QAQ打完超级长的nlog的正解了但是它跑的比暴力还慢啊啊啊常数这么丑2940ms但是好歹打正解了我又有脸了啊啊啊溜了

 #include<cstdio>
#include<vector>
#include<algorithm>
#include<iostream>
using namespace std;
struct ps{int x1,x2,y1,y2,ord;friend bool operator<(ps a,ps b){return a.x1!=b.x1?a.x1<b.x1:a.y1<b.y1;}}p[];
vector<ps>L[],R[];
int ans,cf[],f[],cb[],eds;
int find(int k){return f[k]==k?k:f[k]=find(f[k]);}
void link(int a,int b){
int fa=find(a),fb=find(b);//printf("link:%d %d\n",a,b);
if(fa!=fb)eds++,f[fa]=fb;
}
int main(){//freopen("building1.in","r",stdin);
int id,n,m,k,q,qk,qx,pt=;scanf("%d%d%d%d%d",&id,&n,&m,&k,&q);
for(int i=,x1,x2,y1,y2;i<=k;++i){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
p[i]=(ps){x1,x2,y1,y2,f[i]=i};
ps P1=(ps){x1,x1,y1,y1,i},P2=(ps){x2,x2,y2,y2,i};
if(x1==x2)cf[x1]+=y2-y1+,cf[x1+]-=y2-y1+,L[x1].push_back(p[i]),R[y2].push_back(P2),R[y1].push_back(P1);
else cf[x1]++,cf[x2+]--,R[y1].push_back(p[i]),L[x2].push_back(P2),L[x1].push_back(P1);
}
for(int i=;i<=n;++i)cf[i]+=cf[i-];
for(int i=;i<=n;++i)cf[i]+=cf[i-];
for(int i=;i<=n;++i)sort(L[i].begin(),L[i].end());
for(int i=;i<=m;++i)sort(R[i].begin(),R[i].end());
sort(p+,p+k+);
for(int I=;I<=n;cb[I]=pt-eds-,++I)while(p[pt].x1==I&&pt<=k){
int x1=p[pt].x1,x2=p[pt].x2,y1=p[pt].y1,y2=p[pt].y2,ord=p[pt].ord,X1=x1-,X2=x2+,Y1=y1-,Y2=y2+;
for(int i=max(,lower_bound(L[X1].begin(),L[X1].end(),(ps){X1,X1,y1,y1,})-L[X1].begin()-);i<L[X1].size();++i)
if(!(L[X1][i].y1>y2||L[X1][i].y2<y1)){if(L[X1][i].x1<=I)link(L[X1][i].ord,ord);}
else if(L[X1][i].y1>y2)break;
for(int i=max(,lower_bound(R[Y1].begin(),R[Y1].end(),(ps){x1,x1,Y1,Y1,})-R[Y1].begin()-);i<R[Y1].size();++i)
if(!(R[Y1][i].x1>x2||R[Y1][i].x2<x1)){if(R[Y1][i].x1<=I)link(R[Y1][i].ord,ord);}
else if(R[Y1][i].x1>x2)break;
for(int i=max(,lower_bound(R[Y2].begin(),R[Y2].end(),(ps){x1,x1,Y2,Y2,})-R[Y2].begin()-);i<R[Y2].size();++i)
if(!(R[Y2][i].x1>x2||R[Y2][i].x2<x1)){if(R[Y2][i].x1<=I)link(R[Y2][i].ord,ord);}
else if(R[Y2][i].x1>x2)break;
pt++;
}
while(q--)scanf("%d%d",&qk,&qx),printf("%d\n",qk?cb[qx]:cf[qx]);
}

思路积累:

  • 联通块的性质
  • 离线处理

[考试反思]1008csp-s模拟测试64:契机的更多相关文章

  1. [考试反思]0718 NOIP模拟测试5

    最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...

  2. [考试反思]0814NOIP模拟测试21

    前两名是外校的240.220.kx和skyh拿到了190的[暴力打满]的好成绩. 我第5是170分,然而160分就是第19了. 在前一晚上刚刚爆炸完毕后,心态格外平稳. 想想前一天晚上的挣扎: 啊啊啊 ...

  3. [考试反思]0714/0716,NOIP模拟测试3/4

    这几天时间比较紧啊(其实只是我效率有点低我在考虑要不要坐到后面去吹空调) 但是不管怎么说,考试反思还是要写的吧. 第三次考试反思没写总感觉缺了点什么,但是题都刷不完... 一进图论看他们刷题好快啊为什 ...

  4. [考试反思]1109csp-s模拟测试106:撞词

    (撞哈希了用了模拟测试28的词,所以这次就叫撞词吧) 蓝色的0... 蓝色的0... 都该联赛了还能CE呢... 考试结束前15分钟左右,期望得分300 然后对拍发现T2伪了写了一个能拿90分的垃圾随 ...

  5. [考试反思]0909csp-s模拟测试41:反典

    说在前面:我是反面典型!!!不要学我!!! 说在前面:向rank1某脸学习,不管是什么题都在考试反思后面稍微写一下题解. 这次是真的真的运气好... 这次知识点上还可以,但是答题策略出了问题... 幸 ...

  6. [考试反思]0729NOIP模拟测试10

    安度因:哇哦. 安度因:谢谢你. 第三个rank1不知为什么就来了.迷之二连?也不知道哪里来的rp 连续两次考试数学都占了比较大的比重,所以我非常幸运的得以发挥我的优势(也许是优势吧,反正数学里基本没 ...

  7. [考试反思]1003csp-s模拟测试58:沉淀

    稳住阵脚. 还可以. 至少想拿到的分都拿到了,最后一题的确因为不会按秩合并和线段树分治而想不出来. 对拍了,暴力都拍了.挺稳的. 但是其实也有波折,险些被卡内存. 如果内存使用不连续或申请的内存全部使 ...

  8. [考试反思]0816NOIP模拟测试23

    210 210 210 170 还可以.暴力打满就rk4了? 但不管怎么说,总算是在改完题之后理直气壮的写考试反思了. T1是个dp,说水也不太水.(当然某脸只要A掉了一道题就要说那是水题) 我的思路 ...

  9. [考试反思]0801NOIP模拟测试11

    8月开门红. 放假回来果然像是神志不清一样. 但还是要接受这个事实. 嗯,说好听点,并列rank#7. 说难听点,垃圾rank#18. 都不用粘人名就知道我是哪一个吧... 因为图片不能太长,所以就不 ...

随机推荐

  1. 可能是国内第一篇全面解读 Java 现状及趋势的文章

    作者 | 张晓楠 Dragonwell JDK 最新版本 8.1.1-GA 发布,包括全新特性和更新! 导读:InfoQ 发布<2019 中国 Java 发展趋势报告>,反映 Java 在 ...

  2. 直通BAT面试题库锦集

    01 python面试题(汇总) 02 面向对象 03 网络和并发编程 04 模块 05 设计模式 06 前端 07 Django框架 08 Flask 09 tornado 10 DB

  3. vue3.0 vue.config.js 配置实战

    今天讲述一下vue-config.js配置,我们前面搭建好脚手架会发现,这个对比2.x版本少了很多东西,没有build的配置,也没有webpack的配置,那么问题来了,我们如何去开发我们的项目呢,比如 ...

  4. 初识Django,了解一下大概流程

    学习Django一个礼拜了,对其有了一个大概的了解,自己画了一个简单的图,虽然有点丑,但是基本上已经把自己所想已经表达 写完这篇随笔之后发现自己逻辑表述的有点不太清晰,有点乱,哪里不对,希望各位指正 ...

  5. OSX 10.14.2 安装Cocoapods 出现问题的解决方法

    今天尝试用 Cocoapods安装个第三方库.. 输入pod install, 发现 command not find. WTF! 估计是升级10.11后Cocoapods被干掉了. 我输入 sudo ...

  6. UWP 使用新版画中画 FontIcon —— 如何使用自定义字体 —— 简单分析Windows Calculator源代码

    微软在新版UWP计算器中加入了一个“置顶”功能,它相当于我们之前看视频的“画中画”一样. 点击后窗体置顶,同时可以进行其他任务. 有的小伙伴说,不就是一个图标吗,去 Segoe MDL2 图标 把图标 ...

  7. RF读取excel

    pip install robotframework-ExcelLibrary (安装ExcelLibrary库) 关键字: Open Excel 打开excel Get Column Count 获 ...

  8. Python_箱型图绘制与特征值获取

    它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较 如何利用Python绘制箱型图 需要的import的包 import matplotlib.pyplot as plt from m ...

  9. HTML CSS3中2D转换、3D转换、过渡效果总结

    一.CSS3 2D转换 通过 CSS3 转换,我们可以对元素进行移动.缩放.转动.拉长或拉伸. 特别注意,我们在使用css3动画效果时,必须给他们加相应的浏览器前缀,以便浏览器识别,让我们更好的去应用 ...

  10. [Luogu3878] [TJOI2010]分金币

    题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 输入输出格式 输入格式: 每个输入文件中包含多 ...