今天题目略水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模拟试题的更多相关文章

  1. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  2. 10.3 noip模拟试题

    希望[题目描述]网页浏览器者有后退与前进按钮,一种实现这两个功能的方式是用两个栈,“前进栈”.“后退栈”.这里你需要实现以下几个功能:BACK: 如果“后退栈”为空则忽略此命令. 否则将当前两面压入“ ...

  3. 10.27 noip模拟试题

    1.铺瓷砖(tile.cpp/c/pas)[问题描述]有一面很长很长的墙. 你需要在这面墙上贴上两行瓷砖. 你的手头有两种不同尺寸的瓷砖,你希望用这两种瓷砖各贴一行.瓷砖的长可以用分数表示,贴在第一行 ...

  4. 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) 这样 ...

  5. 10.18 noip模拟试题

    分火腿 (hdogs.pas/.c/.cpp) 时间限制:1s:内存限制 64MB 题目描述: 小月言要过四岁生日了,她的妈妈为她准备了n根火腿,她想将这些火腿均分给m位小朋友,所以她可能需要切火腿. ...

  6. 10.13 noip模拟试题

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...

  7. 10.11 noip模拟试题

    4题均为128M,1s 1. 锻炼计划(exercise.pas) 身体是革命的本钱,OIers不要因为紧张的学习和整天在电脑前而忽视了健康问题.小x设计了自己的锻炼计划,但他不知道这个计划是否可行, ...

  8. 10.8 noip模拟试题

      1.花 (flower.cpp/c/pas) [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的 ...

  9. 10.4 noip模拟试题

    题目名称 PA 青春 三部曲 名称 huakai taritari truetears 输入 huakai.in taritari.in truetears.in 输出 huakai.out tari ...

随机推荐

  1. PAT (Basic Level) 1002. 写出这个数 (20)

    读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值.这里保证n小于10100. 输出格式:在一行内输出n的各位数字之和的每 ...

  2. 流形学习(manifold learning)的一些综述

    流形学习(manifold learning)的一些综述 讨论与进展 issue 26 https://github.com/memect/hao/issues/26 Introduction htt ...

  3. 你真的有必要退出吗——再说Android程序的退出功能

    转自你真的有必要退出吗--再说Android程序的退出功能 搞Android开发有一段时间了,相信很多从Windows开发过来的Android程序员都习惯性地会跟我一样遇到过同一个问题:如何彻底退出程 ...

  4. 实验一个最小的PYTHON服务器编程

    没事,玩玩儿~~~:) 按书上的例子来作.. #!/usr/bin/env python #Simple Server - Chapter 1 -server.py import socket hos ...

  5. 用UIKIT的模态对话框要注意的地方

    XXX,晚上又搞了三个小时左右,才摸清楚. 多个ID要注意唯一性. 而在DJANGO里,每一个循环的唯一性,也有技巧性. 父循环的编号 {{ forloop.parentloop.counter }} ...

  6. Java语言基础(三) Java注释

    Java注释 Java提供了三种注释的方式: ①单行注释:// ②多行注释:/*  ...  */ ③归档(JavaDoc)注释: /** * 作者:heyiyong * 时间:2013年11月27日 ...

  7. MonkeyRunner 连续两次点击报“Error sending touch event”

    最近用monkeyrunner做自动化测试,遇到连续两次点击,第二次点击就会报错“Error sending touch event”. 具体做法如下: device.touch(234,112, ' ...

  8. bzoj2734

    非常巧妙地题目对于一个数x列出这样的矩阵x 2x 4x 8x ……3x 6x 12x 24x ………………………………不难方案数就是求取数不相邻的方案数考虑矩阵宽不超过logn,所以可以用状压dp解决 ...

  9. [XenServer] XenServer修改IP 以及 root密码

     A.修改IP以及DNS 1. root用户登录console 2.输入命令获得UUID xe pif-list 3.利用UUID查看之前的IP,注意替换下面的1111111111 xe pif-pa ...

  10. 如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China

    如何以非 root 用户将应用绑定到 80 端口-ssh 篇 » 社区 » Ruby China 如何以非 root 用户将应用绑定到 80 端口-ssh 篇