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 板 ...
随机推荐
- iOS开发之3D Touch
1.简介 3DTouch是在6s之后苹果的一项技术,只能在6s及其以上机型真机运行,Xcode的模拟器是不支持的. Quick Actions(点击icon的快捷方式) Peek&Pop(应用 ...
- 基于Netty的RPC架构学习笔记(七):netty学习之心跳
文章目录 idleStateHandler netty3
- JVM内核-原理、诊断与优化学习笔记(九):锁
文章目录 线程安全 多线程网站统计访问人数 多线程访问ArrayList 对象头Mark Mark Word,对象头的标记,32位 描述对象的hash.锁信息,垃圾回收标记,年龄 偏向锁 轻量级锁 B ...
- Java 中的 SPI 机制是什么鬼?高级 Java 必须掌握!
作者:sigangjun blog.csdn.net/sigangjun/article/details/79071850 SPI的全名为:Service Provider Interface,大多数 ...
- Centos 7 ping 不通外网
首先检查添加DNS是否正常,如不存在则添加dns: [root@cgls]# vim /etc/resolv.conf nameserver 114.114.114.114 nameserver 8. ...
- 学习k8s的经验
最近在学k8s,总结一下安装k8s的坑. 1.晚上关于k8s的学习资料很多,多不如精,这个博客很好,https://blog.csdn.net/sinat_35930259/article/categ ...
- python下pip使用bug汇总
PS:以下操作全部基于win10 64位操作系统 pip安装任何包都出现问题: Cannot unpack file /tmp/pip-KzJgHD-unpack/simple 报错: Cannot ...
- drools原生drl规则文件的使用
在初识drools中对drl文件进行了简单的介绍.这里举个例子来具体说明下.主要是写了规则之后我们如何用java代码来run起来. drl文件内容如下: rule "ageUp12" ...
- splice用法
splice()方法给数组添加内容,返回新的数组 splice()方法替换数组一项内容,返回新的数组 如果添加进数组的元素个数不等于被删除的元素个数,数组的长度会发生相应的改变. 比如:从第 2 位开 ...
- scala中ArrayBuffer简单使用
import scala.collection.mutable.ArrayBuffer /** * 与Array区别: * 1.Array是不可变的,不能直接地对其元素进行删除操作,只能通过重赋值或过 ...