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

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

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. kotlin系列文章 --- 2.基本语法

    函数 函数定义使用fun关键字,参数格式为:参数:类型,需要声明返回类型 fun sum(a:Int, b:Int): Int{ return a+b } 表达式作为函数体,返回值类型自动推断 fun ...

  2. Java为什么需要四种引用?

    首先抛出一个问题:在闲暇时间收拾自己家里的时候,对某一件物件要不要丢弃的问题上,是否有过食之无味,弃之可惜的感觉? 同样的,JVM在回收Java对象的时候,是否对对象实例也有食之无味,弃之可惜的感受? ...

  3. 利用js种的正则删除html标签

    public static string NoHTML(string Htmlstring) { //删除脚本 Htmlstring = Regex.Replace(Htmlstring, @&quo ...

  4. springboot配置ehcache2.X缓存(@Cacheable等注解和手动操作缓存的工具类 支持element粒度的时间设置)

    本文只写出一些注意事项和源码,请善用官方文档~ 注解实现 @Cacheable @CachePut @CacheEvit 启动类上加@EnableCaching就可以开启缓存 由文档可知,自动检测缓存 ...

  5. Vue-cli中axios传参的方式以及后端取的方式

    0917自我总结 Vue-cli中axios传参的方式以及后端取的方式 一.传参 params是添加到url的请求字符串中的,用于get请求. data是添加到请求体(body)中的, 用于post请 ...

  6. 《FFT家族—从不会到崩溃(坑)》读blog笔记

    免责声明 原文地址https://blog.csdn.net/linjiayang2016/article/details/80341958,作者linjiayang2016.\text{linjia ...

  7. [Luogu3868] [TJOI2009]猜数字

    题目描述 现有两组数字,每组k个,第一组中的数字分别为:a1,a2,...,ak表示,第二组中的数字分别用b1,b2,...,bk表示.其中第二组中的数字是两两互素的.求最小的非负整数n,满足对于任意 ...

  8. Codeforces Round #426 The Meaningless Game

    题目网址:http://codeforces.com/contest/834/problem/C 题目: C. The Meaningless Game Slastyona and her loyal ...

  9. 技术分享:Dapr,让开发人员更轻松地构建微服务应用

    最近一直在学习微服务相关的技术.微服务架构已成为构建云原生应用程序的标准,并且可以预见,到2022年,将有90%的新应用程序采用微服务架构.微服务架构提供了令人信服的好处,包括可伸缩性,松散的服务耦合 ...

  10. 百万年薪python之路 -- 模块二

    1. 序列化模块 什么是序列化呢? 序列化的本质就是将一种数据结构(如字典.列表)等转换成一个特殊的序列(字符串或者bytes)的过程就叫做序列化. 为什么要有序列化模块? 如果你写入文件中的字符串是 ...