10.25 noip模拟试题
今天题目略水2333
依旧不粘题目了23333
T1
/*数学题 给定n个斜率 求有多少个三元组 保证两两斜率不同
ans=C(n,3)-ΣC(len[i],2)*(n-len[i])-ΣC(len[i],3)*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#define inf 1e10
#define ll long long
#define maxn 300010
using namespace std;
ll n,a,b,c,ans,len[maxn],cnt;
struct node{
double k;
ll C;
}p[maxn];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
ll cmp(const node &x,const node &y){
return (x.k==y.k&&x.C<y.C)||x.k<y.k;
}
void Insert(ll x,ll y,ll z,ll o){
double K;
if(y==)K=inf;
else K=-double(x)/double(y);
p[o].C=z;p[o].k=K;
}
ll Cu(ll x,ll y){
if(y==)return x*(x-)/;
if(y==)return x*(x-)*(x-)/;
}
int main()
{
//freopen("trokuti.in","r",stdin);
//freopen("trokuti.out","w",stdout);
n=init();
for(ll i=;i<=n;i++){
a=init();b=init();c=init();
Insert(a,b,c,i);
}
sort(p+,p++n,cmp);
double now=p[].k;
ll nowc=p[].C;len[++cnt]++;
for(ll i=;i<=n;i++){
if(p[i].k==now&&p[i].C!=nowc){
nowc=p[i].C;len[cnt]++;
}
else if(p[i].k!=now){
len[++cnt]++;
now=p[i].k;nowc=p[i].C;
}
}
ans=n*(n-)*(n-)/;
for(ll i=;i<=cnt;i++){
if(len[i]>=)ans-=Cu(len[i],)*(n-len[i]);
if(len[i]>=)ans-=Cu(len[i],);
}
cout<<ans<<endl;
return ;
}
T2/*可贪心 或者一边nlogn的LIS */
#include<cstdio>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,a[maxn],c[maxn],num;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int main()
{
freopen("manage.in","r",stdin);
freopen("manage.out","w",stdout);
n=init();
for(int i=;i<=n;i++)
a[i]=init();
for(int i=;i<=n;i++){
int x=a[i];
if(x>c[num]){
c[++num]=x;continue;
}
int pos=lower_bound(c+,c++num,x)-c;
c[pos]=x;
}
printf("%d\n",num);
return ;
}
T3/*暴力 枚举最大的能用的s 然后将合法的边按g为关键字MST m*m*logm +剪枝50分*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
#define maxn 410
#define maxm 50010
#define inf 1e18
using namespace std;
ll n,m,S,G,ms,mg,cnt,tot,fa[maxn],falg;
ll ans=inf*,mx,mig=inf;
struct node{
ll u,v,s,g;
}p[maxm];
struct edge{
ll u,v,o,g;
}e[maxm];
ll init(){
ll x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int cmp(const node &x,const node &y){
return (x.s==y.s&&x.g<y.g)||x.s<y.s;
}
int Cmp(const edge &x,const edge &y){
return x.g<y.g;
}
int find(int x){
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
bool Judge(int x){
cnt=;tot=;falg=;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=x;i++){
e[++cnt].o=i;e[cnt].g=p[i].g;
e[cnt].u=p[i].u;e[cnt].v=p[i].v;
}
sort(e+,e++cnt,Cmp);
for(int i=;i<=cnt;i++){
int r1=find(e[i].u);
int r2=find(e[i].v);
if(r1!=r2){
tot++;fa[r2]=r1;
}
if(tot==n-){
mg=e[i].g;falg=;break;
}
}
return falg;
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n=init();m=init();G=init();S=init();
ll u,v,g,s;
for(int i=;i<=m;i++){
u=init();v=init();g=init();s=init();
p[i].u=u;p[i].v=v;p[i].g=g;
p[i].s=s;mig=min(mig,p[i].g);
}
sort(p+,p++m,cmp);
for(int i=;i<=m;i++){
mx=p[i].s*S+mig*G;
if(mx>=ans)break;
if(Judge(i)){
ms=p[i].s;
mx=ms*S+mg*G;
ans=min(ans,mx);
}
}
if(ans==inf*)cout<<"-1"<<endl;
else cout<<ans<<endl;
return ;
}
/*
后来看了题解的方法 在之前暴力的基础上优化一下
每次加入一条边 不用O(m)的跑MST 直接把这条边加到上一次MST的n-1条边里
还有就是每加入一条边 因为之前的n-1条是有序的 直接O(m)插入就好了
这样就成了O(mn) 可能我写的比较挫 先找一遍MST 这个略慢2333 可以卡掉 但是没数据
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define maxn 410
#define maxm 50010
#define inf 1e18
using namespace std;
int n,m,cnt,tot,fa[maxn],falg;
ll ans=inf*,S,G,ms,mg,mx,mi[maxm];
struct node{
int u,v;ll s,g;
}p[maxm],pp[maxm],e[maxn],ee[maxm];
ll init(){
ll x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
ll min(ll x,ll y){
return x<y?x:y;
}
int cmp(const node &x,const node &y){
return x.s<y.s;
}
int Cmp(const node &x,const node &y){
return x.g<y.g;
}
int find(int x){
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
bool Judge2(int x){
tot=;falg=;int P=cnt+;
e[++cnt]=p[x];cnt=;
for(int i=;i<=n;i++)fa[i]=i;
while(e[P].g<e[P-].g){//插入这排序 快快快
swap(e[P],e[P-]);P--;
}
for(int i=;i<=n;i++){
int r1=find(e[i].u);
int r2=find(e[i].v);
if(r1!=r2){
ee[++cnt]=e[i];
tot++;fa[r2]=r1;
}
if(tot==n-){
mg=e[i].g;falg=;break;
}
}
if(falg)for(int i=;i<=n;i++)e[i]=ee[i];
return falg;
}
bool Judge1(int x){
tot=;falg=;cnt=;int P=x;
for(int i=;i<=n;i++)fa[i]=i;
while(pp[P].g<pp[P-].g){//插入这排序 快快快
swap(pp[P],pp[P-]);P--;
}
for(int i=;i<=x;i++){
int r1=find(pp[i].u);
int r2=find(pp[i].v);
if(r1!=r2){
tot++;fa[r2]=r1;
e[++cnt]=pp[i];
}
if(tot==n-){
mg=pp[i].g;falg=;break;
}
}
return falg;
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n=init();m=init();G=init();S=init();
int u,v;ll g,s;
for(int i=;i<=m;i++){
u=init();v=init();g=init();s=init();
p[i].u=u;p[i].v=v;p[i].g=g;p[i].s=s;
pp[i].u=u;pp[i].v=v;pp[i].g=g;pp[i].s=s;
}
memset(mi,/,sizeof(mi));
sort(p+,p++m,cmp);sort(pp+,pp++m,cmp);
int start=;
for(int i=;i<=m;i++)
mi[i]=min(mi[i-],p[i].g);
for(int i=;i<=m;i++){
mx=p[i].s*S+mi[i]*G;
if(mx>=ans)break;
if(Judge1(i)){
ms=p[i].s;
mx=ms*S+mg*G;
ans=min(ans,mx);
start=i+;break;
}
}
for(int i=start;i<=m;i++){
mx=p[i].s*S+mi[i]*G;
if(mx>=ans)break;
if(Judge2(i)){
ms=p[i].s;
mx=ms*S+mg*G;
ans=min(ans,mx);
}
}
if(ans==inf*)cout<<"-1"<<endl;
else cout<<ans<<endl;
return ;
}
10.25 noip模拟试题的更多相关文章
- 10.26 noip模拟试题
enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...
- 10.3 noip模拟试题
希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...
- 10.27 noip模拟试题
1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...
- 10.24 noip模拟试题
尼玛pdf依旧不会粘23333 /* 每段合并到总的里面 假设总的有X个 这一段有Y个 一共有X+1个空 那么就有 C(X+1,1)+C(X+1,2)+C(X+1,3)+...+C(X+1,Y) 这样 ...
- 10.18 noip模拟试题
分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...
- 10.13 noip模拟试题
Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...
- 10.11 noip模拟试题
4题均为128M,1s 1. 锻炼计划(exercise.pas) 身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题.小x设计了自己的锻炼计划,但他不知道这个计划是否可行, ...
- 10.8 noip模拟试题
1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...
- 10.4 noip模拟试题
题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out tari ...
随机推荐
- 全连接的BP神经网络
<全连接的BP神经网络> 本文主要描述全连接的BP神经网络的前向传播和误差反向传播,所有的符号都用Ng的Machine learning的习惯.下图给出了某个全连接的神经网络图. 1前向传 ...
- CAVLC
在H.264标准中,CAVLC(Context-based Adaptive Variable Length Coding)被用于亮度和色度残差数据编码.在标准的码流结构中,CAVLC编码方式描述为c ...
- Batik - 将svg转换成其他格式图片或PDF - [导出服务器配置] 导出服务器原理解析
导出服务器原理解析 Highcharts图表导出(或下载)本质上是将SVG代码转换为不同文件格式的过程,用到的工具是batik,所以所谓导出服务器,只不过是调用batik,将SVG代码转换并下载.下图 ...
- 14.6.3.3 Making the Buffer Pool Scan Resistant
14.6.3.3 Making the Buffer Pool Scan Resistant 相比使用一个严格的LRU算法,InnoDB 使用一个技术来最小化数据总量 带入到buffer pool 而 ...
- Node.js权威指南 (5) - 使用Buffer类处理二进制数据
5.1 创建Buffer对象 / 705.2 字符串的长度与缓存区的长度 / 725.3 Buffer对象与字符串对象之间的相互转换 / 74 5.3.1 Buffer对象的toString方法 / ...
- 综合(奇技淫巧):HDU 5118 GRE Words Once More!
GRE Words Once More! Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/O ...
- CSS 属性 - 伪类和伪元素
CSS 伪类用于向某些选择器添加特殊的效果. CSS 伪元素用于将特殊的效果添加到某些选择器. 可以明确两点,第一两者都与选择器相关,第二就是添加一些“特殊”的效果.这里特殊指的是两者描述了其他 cs ...
- 西安Uber优步司机奖励政策(1月25日~1月31日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- iOS开发之获取WIFI信号强度
虽然各种直接获取信号强度的api都被封杀了.但是还有一个另类的黑魔法可以获取到.那就是遍历UIStatusBar了 - (void)getSignalStrength{ UIApplication * ...
- The breakpoint will not currently be hit. vs2005断点不被命中
用会了vs2005但是发现坑爹的连断点都不会命中,原来是默认设置的问题.要使断点命中: 1. 首先确保程序是在DEBUG模式下运行: 2. 确认正确的项目设置:链接器->调试->生成调试信 ...