2018.10.9模拟赛

T1 trade

正解:贪心

据说lyd讲过但并没有印象QAQ,考场上现推浪费了不少时间

其实就开个小根堆,每次把堆顶取出来看它是不是比当前的 a[i]a[i]a[i] 小,如果小的话就把它替换成a[i]a[i]a[i]

然后再把a[i]a[i]a[i] push进去

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 100005
#define LL long long
using namespace std;
int n,a[maxn];
LL ans;
priority_queue< pair<int,int> > q;inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}int main(){freopen("trade.in","r",stdin);freopen("trade.out","w",stdout);n=rd();for(int i=1;i<=n;i++) a[i]=rd();for(int i=1;i<=n;i++){if(!q.empty()){int x=q.top().second;if(a[x]<a[i]){q.pop(); ans+=a[i]-a[x];q.push(make_pair(-a[i],i));}}q.push(make_pair(-a[i],i));}printf("%lld\n",ans);return 0;
}
//5
//1 1 5 3 6

T2 sum

正解是莫队,但我不会莫队呜呜呜我果然是机房最菜的那个,然后就胡乱写了一堆暴力拿了60分

把询问离线然后分块,块外按n排序,快内按m排序

因为可以很容易地从Si,jS_{i,j}Si,j​ 转移到Si+1,jS_{i+1,j}Si+1,j​ 或者Si,j+1S_{i,j+1}Si,j+1​ 所以只要维护两个指针转移就好了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 100005
#define LL long long
using namespace std;
int q,block;
LL fac[maxn],inv[maxn],ans[maxn];
const int mod=1e9+7,inv2=500000004;inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}struct Query{int n,m,id,pos;bool operator <(const Query &x) const{return pos==x.pos?m<x.m:pos<x.pos;}
}a[maxn];inline LL qpow(LL x,int k){LL ret=1;while(k){if(k&1) (ret*=x)%=mod;(x*=x)%=mod; k>>=1;} return ret;
}inline void prework(){fac[0]=1; inv[1]=1;for(int i=1;i<=100000;i++)fac[i]=(fac[i-1]*i)%mod;inv[100000]=qpow(fac[100000],mod-2);for(int i=100000;i>=1;i--) inv[i-1]=(inv[i]*i)%mod;
}inline LL C(int n,int m){return fac[n]*inv[m]%mod*inv[n-m]%mod;
}inline void solve(){sort(a+1,a+q+1);int nn=0,nm=0; LL cur=1;for(int i=1;i<=q;i++){int x=a[i].n,y=a[i].m;while(nn<x){(cur*=2)%=mod; cur=(cur-C(nn,nm)+mod)%mod; nn++;}while(nm<y){nm++;(cur+=C(nn,nm))%=mod;}while(nn>x){nn--;cur=(cur+C(nn,nm))%mod; (cur*=inv2)%=mod;}while(nm>y){cur=(cur-C(nn,nm)+mod)%mod; nm--;}ans[a[i].id]=cur;}for(int i=1;i<=q;i++)printf("%lld\n",ans[i]);
}int main(){freopen("sum.in","r",stdin);freopen("sum.out","w",stdout);int t=rd(); q=rd(); block=sqrt(q);for(int i=1;i<=q;i++){a[i].n=rd(),a[i].m=rd(); a[i].id=i; a[i].pos=a[i].n/block;}prework(); solve();return 0;
}
/*
1
5
1 1
2 1
3 2
4 3
5 5
*/

T3 building

本场最毒瘤的题了吧···不过部分分分的很清楚,打了40的暴力qwq

正解讲了两种:

第一种是xcc讲的,就是用各种vectorvectorvector存横块和竖块的信息,当u=0u=0u=0的时候非常简单,只需要差分+++前缀和就好了

但是当u=1u=1u=1的时候就有些麻烦了,首先可以用并查集维护连通性,顺便算出联通块个数,然后一行一行的扫

一边扫一边用维护,每次从上一行转移过来,这个可以用vectorvectorvector里面存的信息办到

但是代码非常长并且细节很多,一定要脑子清醒的时候写

第二种是某大佬讲的,就是用扫描线处理这些信息,不过好像麻烦···

于是我就写了第一种:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#define int long long
#define re register
#define N 200005
using namespace std;
int n,m,k,cntq,f[N],tot,ans[N],cnt,sum[N],c[N],rt=1;inline int rd(){int x=0,f=1;char c=' ';while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();while(c<='9' && c>='0') x=x*10+c-'0',c=getchar();return x*f;
}struct Node{int l,r,id;Node(){}Node(const int x,const int y,const int z){l=x,r=y,id=z;}
}tmp[N];
inline bool cmpl(const Node &a,const Node &b){return a.l<b.l;}
inline bool cmp(const Node &a,const Node &b){return a.r<b.r;}//按r排序
vector<Node> line[N],row[N],stli[N],enli[N];
vector<int> q[2][N];inline int find(int x){return x==f[x]?x:(f[x]=find(f[x]));
}inline void add(int x,int y){x=find(x),y=find(y);if(x==y) return;--cnt; f[x]=y;
}inline void solve(){for(re int i=1;i<=tot;i++) f[i]=i;for(re int i=1,t;i<=n;i++){cnt+=stli[i].size()+row[i].size();//从1~i行的联通块for(re int j=0;j<row[i].size();j++){//把上一行和它联通的都连上 t=lower_bound(row[i-1].begin(),row[i-1].end(),Node(0,row[i][j].l,0),cmp)-row[i-1].begin();for(;t<row[i-1].size()&&row[i-1][t].l<=row[i][j].r;++t)add(row[i][j].id,row[i-1][t].id);int p=row[i][j].l-1;//和左边一列联通的连上if(p>0){t=lower_bound(line[p].begin(),line[p].end(),Node(0,i,0),cmp)-line[p].begin();if(t<line[p].size()&&line[p][t].l<=i)add(row[i][j].id,line[p][t].id);}p=row[i][j].r+1;//右边同理if(p<=m){t=lower_bound(line[p].begin(),line[p].end(),Node(0,i,0),cmp)-line[p].begin();if(t<line[p].size()&&line[p][t].l<=i)add(row[i][j].id,line[p][t].id);}}//处理列 for(re int j=0;j<stli[i].size();j++){//上面横着的 t=lower_bound(row[i-1].begin(),row[i-1].end(),Node(0,stli[i][j].l,0),cmp)-row[i-1].begin();if(t<row[i-1].size()&&row[i-1][t].l<=stli[i][j].l&&row[i-1][t].r>=stli[i][j].l)add(stli[i][j].id,row[i-1][t].id);}for(re int j=0;j<enli[i].size();j++){//下面横着的 t=lower_bound(row[i].begin(),row[i].end(),Node(0,enli[i][j].l,0),cmp)-row[i].begin();if(t<row[i].size()&&row[i][t].l<=enli[i][j].l&&row[i][t].r>=enli[i][j].l)add(row[i][t].id,enli[i][j].id);}for(re int j=0,t;j<stli[i].size();++j){int p=stli[i][j].l-1;if(p>0){//左边竖着的 t=lower_bound(line[p].begin(),line[p].end(),Node(0,i,0),cmp)-line[p].begin();if(t<line[p].size()&&line[p][t].l<=i)add(line[p][t].id,stli[i][j].id);}p=stli[i][j].l+1;if(p<=m){//右边竖着的 t=lower_bound(line[p].begin(),line[p].end(),Node(0,i,0),cmp)-line[p].begin();if(t<line[p].size()&&line[p][t].l<=i)add(line[p][t].id,stli[i][j].id);}}for(re int j=0;j<q[1][i].size();j++)ans[q[1][i][j]]=cnt;}return;
}signed main(){freopen("building.in","r",stdin);freopen("building.out","w",stdout);int useless=rd();n=rd(); m=rd(); k=rd(); cntq=rd();for(re int i=1;i<=k;i++){int x1=rd(),y1=rd(),x2=rd(),y2=rd();if(x1==x2){row[x1].push_back(Node(y1,y2,0));sum[x1]+=y2-y1+1;}else line[y1].push_back(Node(x1,x2,0));}for(re int i=1;i<=cntq;i++){int a=rd(),b=rd();q[a][b].push_back(i);}for(re int i=1;i<=m;i++)//差分 for(re int j=0;j<line[i].size();j++)++c[line[i][j].l],--c[line[i][j].r+1];for(re int i=1;i<=n;i++) c[i]+=c[i-1];for(re int i=1;i<=n;i++)c[i]+=c[i-1],sum[i]+=sum[i-1];for(re int i=1,t;i<=n;i++){t=c[i]+sum[i];for(re int j=0;j<q[0][i].size();j++)ans[q[0][i][j]]=t;//求楼房个数 }if(useless>=5 && useless<=8){for(re int i=1;i<=cntq;i++)printf("%lld\n",ans[i]);return 0;} for(re int i=1;i<=n;i++)if(row[i].size()){sort(row[i].begin(),row[i].end(),cmpl);int num=0;for(re int j=0;j<row[i].size();j++)//先把一行里首尾相接的连起来 if(num&&tmp[num].r+1==row[i][j].l) tmp[num].r=row[i][j].r;else tmp[++num]=row[i][j],tmp[num].id=++tot;row[i].clear();for(re int j=1;j<=num;j++) row[i].push_back(tmp[j]); }for(re int i=1;i<=m;i++)if(line[i].size()){sort(line[i].begin(),line[i].end(),cmpl);int num=0;for(re int j=0;j<line[i].size();j++)if(num&&tmp[num].r+1==line[i][j].l) tmp[num].r=line[i][j].r;else tmp[++num]=line[i][j],tmp[num].id=++tot;line[i].clear();for(re int j=1;j<=num;j++){line[i].push_back(tmp[j]);//stli存的是第i行为开头的竖块信息 stli[tmp[j].l].push_back(Node(i,tmp[j].r,tmp[j].id));if(tmp[j].r+1<=n)enli[tmp[j].r+1].push_back(Node(i,tmp[j].l,tmp[j].id));}//enli存的是第i-1行为结尾的竖块信息 }solve();for(re int i=1;i<=cntq;i++)printf("%lld\n",ans[i]);return 0;
}

总分 100+60+40=200100+60+40=200100+60+40=200分

三校联考rank15rank 15rank15

本校rank2rank 2rank2

啊我们好菜啊

2018.10.9模拟赛相关推荐

  1. 2018,10,19模拟赛

    jz的题...写炸了不少暴力...还有容斥等不太熟练 T1以为n^2*m过不去,想了好久 归根到底还是我太蒻了qwq 存一下代码 t1 为了稳一点写了部分分...还没删,可以自行跳过ovo #incl ...

  2. 2018.10.2模拟赛

    八数码 1 问题描述 有33 共9 个格子,其中有一个格子是空的,其他格子填满了18 之间不同的数字.通过 移动格子可以改变数字和空格的位置,现在给你初状态和末状态,请你给出最少的移动步数. 2 输入 ...

  3. tarjan+拓扑序+差分--2018.10.16模拟赛T2

    题目: 阿天住的城市有 n 个政府部门,这些部门之间用了 m 条有向路径 连接了起来.有趣的是,每过一天这些路径都会变换方向,也就是说, 偶数的日子和奇数的日子的图是不同的. 阿天在社保局工作,可惜他 ...

  4. 2018.10.31模拟赛

    T1 lgg L 君和 G 君在玩一个游戏.G 君写下一个字符串 A,L 君将其复制一遍连接到 A 串后面得 到字符串 B, G 君又在 B 的任意位置(包括首尾)插入一个字符得到字符串 C.现在你得 ...

  5. 【比赛报告】2018.10.15校赛[2015-9-13 NOIP模拟赛 by hzwer] NOIP练习赛卷十四

    比赛时间:2018.10.15 选手:lrllrl 用时:2h 得分:100+10+90=200 最初想法是一个背包问题.首先背包问题的模型肯定是不行的,但是我们可以列出状态转移方程后发现,每个状态决 ...

  6. 8月10日模拟赛题解

    前言 这次模拟赛应该是暑假以来最水的一场了,然而本来至少 210210210 的分数愣是被我弄成了 141141141,原因竟然是: const int MAXM = 5e5 + 5;struct e ...

  7. 2020/10/31模拟赛

    CSP第二轮前模拟赛 我太菜了 T1 题目描述 奶牛们对围栏的高度非常敏感.奶牛希望围栏高度既不太矮以至于他们没有安全感,也不太高以至于她们看不见围栏外的天地.所以每头奶牛都有自己喜欢的高度.奶牛有N ...

  8. 【比赛报告】2018.10.11校赛[8-2情人节欢乐赛] NOIP练习赛卷十二

    比赛时间:2018.10.10 选手:lrllrl 成绩 100+100+100=300 用时:约1h T1 果实计数 显然易得,答案为 b n m o d    k b^n\mod k bnmodk ...

  9. 【2018.3.10】模拟赛之三-ssl2576 平台

    目录地址 前言 水题不想说,连自带快排都懒得用了 正题 有n个平台,每个平台头尾有两根柱子支撑到地板或另一个平台上,求支撑平台需要的柱子数 输入输出(需要自取) Input 输入文件platforme ...

最新文章

  1. 网页中;window.onerror=function(){return!0};
  2. python教程实例-Python实例教程
  3. oracle 未绑定变量,查看Oracle数据库中未绑定变量的SQL
  4. 2020年,朋友圈的正确打开方式!
  5. 『软件测试2』 关于黑盒测试和测试用例的基础知识
  6. LeetCode 811. 子域名访问计数
  7. 作者:杨慰民(1970-),男,博士,中国移动通信集团福建有限公司网管中心副总经理...
  8. 字符串转数字测试--知识备忘
  9. C++/C--STL API查询及免费教程网站
  10. echarts折现变曲线_echarts将折线图改为曲线图
  11. JavaScript学习(九)—练习:实现跳转页面
  12. iOS模拟器中修改textField键盘类型为中文输入和键盘弹出方法
  13. oracle Dataguard数据库不同步处理备忘
  14. (6)GPS坐标与UTM坐标的转换
  15. 【转载】回首大学四年,一个电工对大学课程的见解
  16. 详解反向传播神经网络 (Back Propagation Neural Network, BPNN)
  17. P1196 [NOI2002] 银河英雄传说 题解
  18. 首款物联网防火墙himqtt开源
  19. 如何修改 linux 命令行登录界面
  20. Benchmark(基准测试)初相识

热门文章

  1. lua 自实现pairs
  2. 小白学习之路,网络编程(上)
  3. Python整型、bool类型及字符串的方法
  4. 5G标准草案公布 改变的不仅是速度
  5. windows远程桌面工具之间如何进行控制?
  6. Java程序启动QQ(九)
  7. 打印机服务器的系统,打印机服务器主机系统
  8. 万年历,可以查 曰、月、年,缓存到redis,直接抓取使用,
  9. 手机163邮箱怎么登录?163手机邮箱登录页面是?
  10. 案例分享:Qt+RV1126+PLC医疗血浆采集仪(中英文输入、西门子PLC、数据库存储,各种数据统计,数值监测,电子秤操作,记录查询,全局报警等等)