csps模拟测试7576一句话题解
题面:https://www.cnblogs.com/Juve/articles/11694454.html
75考了数学,化学和物理。。。
T1:
假设有一个A和B,那么对于每一个j!=i,都有$\frac{A}{a_i}+\frac{B}{b_i}<=\frac{A}{a_j}+\frac{B}{b_j}$
化一下式子,会卡出$\frac{A}{B}$的一个范围,判断范围是否有解即可
然后你n方了,75分
正解凸包?
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
#define re register
using namespace std;
const int MAXN=3e5+;
int n,maxb,sta[MAXN],top=;
bool vis[MAXN];
struct node{
int a,b,id;
friend bool operator < (node p,node q){
return p.a==q.a?p.b>q.b:p.a>q.a;
}
}c[MAXN];
inline double k(re node a,re node b){
return (double)a.a*b.a*(b.b-a.b)/a.b/b.b/(b.a-a.a);
}
signed main(){
//freopen("slay4.in","r",stdin);
scanf("%lld",&n);
for(re int i=;i<=n;++i){
scanf("%lld%lld",&c[i].a,&c[i].b);
c[i].id=i;
}
sort(c+,c+n+);
sta[++top]=;maxb=c[].b;
for(int i=;i<=n;i++){
if(c[i].b<=maxb) vis[i]=;
else maxb=c[i].b;
}
for(int i=;i<=n;i++){
if(vis[i]) continue;
if(k(c[i],c[sta[top]])>) continue;
while(top>&&k(c[i],c[sta[top]])<k(c[sta[top-]],c[sta[top]]))
--top;
sta[++top]=i;
}
memset(vis,,sizeof(vis));
for(int i=;i<=top;i++){
vis[c[sta[i]].id]=;
for(int j=sta[i]+;j<=n;++j){
if(c[sta[i]].a!=c[j].a||c[sta[i]].b!=c[j].b) break;
vis[c[j].id]=;
}
}
for(re int i=;i<=n;++i){
if(vis[i]) printf("%lld ",i);
}
puts("");
return ;
}
T2:
已知一些热化学方程式,求目标方程式的焓变
200个方程,每个方程中有200个反映物生成物
考高斯消元和字符串的处理
我们发现关键的物质前后都有空格,所以比较好读入
然后放到矩阵里消
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#include<cmath>
using namespace std;
const int MAXN=;
const double eps=1e-;
int n,m=;
double a[MAXN][MAXN],val[MAXN];
map<string,int>mp;
string in;
void gauss(){
for(int i=;i<=max(n,m);i++){
int p=i;
for(int j=i+;j<=n;j++)
if(fabs(a[j][i])>fabs(a[p][i])) p=j;
for(int j=;j<=max(n,m)+;j++)
swap(a[p][j],a[i][j]);
if(fabs(a[i][i])<eps) continue;
double tmp=a[i][i];
for(int j=;j<=max(n,m)+;j++)
a[i][j]/=tmp;
for(int j=;j<=n+;j++)
if(i!=j){
double tmp=a[j][i];
for(int k=;k<=max(n,m)+;k++)
a[j][k]-=a[i][k]*tmp;
}
}
}
int main(){
//freopen("knight1.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n+;++i){
double xs;
while(in!="="){
scanf("%lf",&xs);
cin>>in;
if(mp.find(in)==mp.end()) mp[in]=++m;
a[i][mp[in]]=xs;
cin>>in;
}
while(in!="H="){
scanf("%lf",&xs);
cin>>in;
if(mp.find(in)==mp.end()) mp[in]=++m;
a[i][mp[in]]=-xs;
cin>>in;
}
if(i!=n+) scanf("%lf",&val[i]);
}
for(int i=;i<=n+;++i){
a[i][max(n,m)+]=val[i];
}
gauss();
if(a[n+][max(n,m)+]==) puts("0.0");
else printf("%0.1lf\n",-a[n+][max(n,m)+]);
return ;
}
T3:
不会,只有80分
第一问的话我们先按起点排序,然后根据终点求LIS,二分判断与k的大小关系
构造就GG了。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int MAXN=1e5+;
int n,k,ans=,l=,r=,res=;
double b[MAXN],d[MAXN];
struct node{
int x,a,id;
double ed;
friend bool operator < (node p,node q){
return p.x<q.x;
}
}od[MAXN];
int c[MAXN];
int lowbit(int x){
return x&(-x);
}
void update(int pos,int val){
while(pos<=n){
c[pos]=max(c[pos],val);
pos+=lowbit(pos);
}
}
int query(int pos){
int res=;
while(pos>){
res=max(res,c[pos]);
pos-=lowbit(pos);
}
return res;
}
bool check(int tim){
for(int i=;i<=n;++i) d[i]=b[i]=(double)((double)(od[i].x)+(double)(0.5*(double)od[i].a*tim*tim));
sort(d+,d+n+);
int cnt=unique(d+,d+n+)-d-;
for(int i=;i<=n;++i) b[i]=lower_bound(d+,d+cnt+,b[i])-d;
memset(c,,sizeof(c));
res=;
for(int i=;i<=n;++i){
int tmp=query(b[i]-)+;
update(b[i],tmp);
res=max(res,tmp);
}
res=query(n);
return res>=k;
}
int fa[MAXN][],dis[MAXN],minn[MAXN][];
int lca(int x,int y){
int minnx=x,minny=y;
int i=;
for(;(<<i)<=dis[y];++i);
for(int j=i;j>=;--j){
if(fa[y][j]!=fa[x][j]){
minnx=min(minnx,minn[x][j]);
minny=min(minny,minn[y][j]);
x=fa[x][j];
y=fa[y][j];
}
}
return minnx<minny;
}
pair<int,int>tr[MAXN];
pair<int,int>max(pair<int,int> a,pair<int,int> b){
if(a.first==b.first){
return lca(a.second,b.second)?a:b;
}
else return a.first<b.first?b:a;
}
void add(int pos,pair<int,int>val){
while(pos<=n){
tr[pos]=max(tr[pos],val);
pos+=lowbit(pos);
}
}
pair<int,int>ask(int pos){
pair<int,int>res=make_pair(,);
while(pos>){
res=max(res,tr[pos]);
pos-=lowbit(pos);
}
return res;
}
void prework(int tim){
memset(minn,0x3f,sizeof(minn));
for(int i=;i<=n;++i) d[i]=b[i]=(double)((double)(od[i].x)+(double)(0.5*(double)od[i].a*tim*tim));
sort(d+,d+n+);
int cnt=unique(d+,d+n+)-d-;
for(int i=;i<=n;++i) b[i]=lower_bound(d+,d+cnt+,b[i])-d;
for(int i=;i<=n;++i){
pair<int,int>tmp=ask(b[i]-);
fa[od[i].id][]=minn[od[i].id][]=tmp.second;
dis[od[i].id]=dis[tmp.second]+;
for(int j=;j<=;++j){
fa[od[i].id][j]=fa[fa[od[i].id][j-]][j-];
minn[od[i].id][j]=min(minn[od[i].id][j-],minn[minn[od[i].id][j-]][j-]);
}
++tmp.first;
tmp.second=od[i].id;
add(b[i],tmp);
}
}
int sta[MAXN],top=;
signed main(){
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;++i){
scanf("%lld%lld",&od[i].x,&od[i].a);
od[i].id=i;
}
sort(od+,od+n+);
while(l<r){
int mid=(l+r)>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid;
}
printf("%lld\n",ans);
check(ans);
if(res>k){
puts("-1");
return ;
}else{
prework(ans);
int x=ask(n).second;
sta[++top]=x;
while(fa[x][]){
x=fa[x][];
sta[++top]=x;
}
sort(sta+,sta+top+);
for(int i=;i<=top;++i){
printf("%lld\n",sta[i]);
}
}
return ;
}
76:
集训过了1/3了,我还如此的菜。。。。。。
T1构造题,注意动态维护块长
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1e5+;
int T,n,a,b;
void work(){
int p=n-a+;
for(int i=p;i<=n;++i){
printf("%d ",i);
}
int tot=n-a;
if(!tot){
puts("");
return ;
}
int siz=(tot-)/(b-);
for(int i=;i<b;++i){
if(!tot) break;
siz=(tot)/(b-i);
for(int j=;j<=siz;++j){
printf("%d ",tot-siz+j);
}
tot-=siz;
}
if(tot) printf("");
puts("");
}
int main(){
scanf("%d",&T);
while(T--){
bool flag=;
scanf("%d%d%d",&n,&a,&b);
if(a>n||b>n||a<||b<||a*b<n||n-a<b-){
puts("No");
continue;
}
puts("Yes");
work();
}
return ;
}
T2:
排序求前缀和,如果$\frac{a_i}{2}>sum_{i-1}$,那么会有断点,求断点长度即可
注意向上取整
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+;
int n,a[MAXN],ans=,sum[MAXN];
signed main(){
scanf("%lld",&n);
for(int i=;i<=n;++i) scanf("%lld",&a[i]);
sort(a+,a+n+);
for(int i=;i<=n;++i) sum[i]=sum[i-]+a[i];
for(int i=;i<=n;++i){
if((a[i]+)/>sum[i-])
ans+=(a[i]+)/-sum[i-]-;
}
printf("%lld\n",sum[n]-ans);
return ;
}
T3:
dp记忆化搜索
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=;
const int mod=1e9+;
int t,n,ans=,m,liml[MAXN],limr[MAXN],dp[MAXN][MAXN];
void preinit(){
memset(dp,-,sizeof(dp));
for(int i=;i<=n;++i) liml[i]=,limr[i]=n-i+,dp[i][]=;
dp[n+][]=;
for(int i=,x,y;i<=m;++i){
scanf("%lld%lld",&x,&y);
if(x<y) limr[x]=min(limr[x],y-x-);
else liml[y]=max(liml[y],x-y);
}
}
int dfs(int now,int siz){
if(dp[now][siz]!=-) return dp[now][siz];
++dp[now][siz];
for(int k=liml[now];k<=min(siz,limr[now]);++k){
dp[now][siz]=(dp[now][siz]+dfs(now+,k)*dfs(now++k,siz--k)%mod)%mod;
}
return dp[now][siz];
}
signed main(){
//freopen("sample.in","r",stdin);
scanf("%lld",&t);
while(t--){
scanf("%lld%lld",&n,&m);
preinit();
printf("%lld\n",dfs(,n));
}
return ;
}
csps模拟测试7576一句话题解的更多相关文章
- [CSP-S模拟测试50]反思+题解
??大部分人都觉得T3是道不可做题去刚T1T2了,于是我就侥幸苟到了前面? 这场考试比较成功的就是快速水掉了T1T2的部分分,1h拿到88分起码为之后硬肝T3上了保险(赛后发现就算T3爆零也能rank ...
- [CSP-S模拟测试48]反思+题解
状态很垃圾的一场考试.感觉“这么多分就够了”的心态很是在给自己拖后腿. 打开题面,第一页赫然写着:$Claris' Contest$. 吓得我差点手一抖关掉.不过后来想想似乎强到变态的人出的题都不是很 ...
- [CSP-S模拟测试47]反思+题解
打开题面,T3似乎被换过了.(那我就更有理由直接弃掉了) T1是我最害怕的乱搞题,赶紧扔了看T2.发现是个sb板子?雨天的尾巴弱化版? 然而线段树合并早忘干净了(最近几道可以线段树合并的题都是用别的方 ...
- csps模拟测试707172部分题解myc
题面:https://www.cnblogs.com/Juve/articles/11678524.html 骆驼:构造题,留坑 根据5×5的矩形构造成大矩形 毛一琛: mid in the midd ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- csp-s模拟测试95
csp-s模拟测试95 去世场祭. $T1$:这不裸的除法分块吗. $T2$:这不裸的数据结构优化$Dp$吗. $T3$:这不裸的我什么都不会搜索骗$30$分吗. 几分钟后. 这除法分块太劲了..(你 ...
- csp-s模拟测试87
csp-s模拟测试87 考场状态还可以$T1$我当时以为我秒切,$T2$确认自己思路不对后毅然决然码上,$T3$暴力挂了太可惜了. 03:01:28 03:16:07 03:11:38 140 03: ...
- csp-s模拟测试80(b)
csp-s模拟测试80(b) 水题没什么可写的. $T1SB$规律题正解调了仨小时就过了. $T2SBDp$题颓完题解就秒了. $T3SB$数据结构考场想到正解就弃了,考后太懒一半正解一发随机化就A了 ...
- csp-s模拟测试99
csp-s模拟测试99 九九归一直接爆炸. $T1$一眼板子. $T2$一眼语文题(语文的唯一一次$120+$是给模拟出来的可知我的语文能力). $T3$一眼普及题. ?? Hours Later 板 ...
随机推荐
- 转:这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的。供大家使用。
http://www.cnblogs.com/gmh915/archive/2009/09/30/1576995.html 这里有些sscanf()的一些使用说明,都是从论坛,Blog里整理出来的.供 ...
- Interesting HDU - 5785 回文树
题意: 找出所有[i,j]为回文串[j+1,k]也为回文串的i*k乘积之和. 题解: 设sum1[i] 为正着插入,到 i 的所有回文串的起始位置的前缀和,sum2[i] 表示反正插入的前缀和 ans ...
- 使用neo4j图数据库的import工具导入数据 -方法和注意事项
背景 最近我在尝试存储知识图谱的过程中,接触到了Neo4j图数据库,这里我摘取了一段Neo4j的简介: Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中.它是一个嵌 ...
- D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)
现在用D3.js + react做一个带坐标轴和比例尺的柱形图.我已经尽力把代码全部注释上了,最后我也会把完整柱形图代码奉上.如果还有疑惑的,可以去翻看一下我之前介绍的方法,以下方法都有介绍到. 还有 ...
- .Net串口通讯中的若干问题(C#多串口硬件识别、热插拔、Close方法报错问题、IsOpen的可靠性问题)
一.需求场景 最近有时间静下心来研究SDK,串口通讯的.要求实现识别cp210x和cp2303驱动的两款硬件,并且2303的优先级高,即有2303识别之,没有再识别210x:要求实现热插拔,拔掉自动断 ...
- 2019-3-16-win10-uwp-在-ItemsPanelTemplate-里面通过样式绑定-Orientation-显示方向
title author date CreateTime categories win10 uwp 在 ItemsPanelTemplate 里面通过样式绑定 Orientation 显示方向 lin ...
- java运行字符串代码
本文链接:https://blog.csdn.net/junlong750/article/details/50945883
- 登录操作(方法一:设置flag标志位)
登录操作(方法一:设置flag标志位) user_name="star"passwoed='123'passed_authentication=Falsecount=0for i ...
- JMeter 返回Json数据提取方法
JMeter中,对response返回JSON格式的数据进行处理,格式如下: { "code":2000, "message":"success&qu ...
- HttpClient 使用案例
package com.qifeng.config.ygx.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fas ...