Test 1023 T1&T2
T1 popust (贪心
TimeLimit: 1000MS
Memory Limit: 32768KB
米尔科饿了如熊,偶然发现当地一家餐馆。餐厅提供\(n\)种餐,有一个有趣的定价政策:每种餐有两个指定的价格,\(A_i\)和\(B_i\)。米尔科支付第一种餐只能用价格\(A\),后面的则只能支付\(B\)价格。他知道一种餐只能订一次,但不知道自己要订几种,于是他想知道从\(1\)种到\(N\)种的最少的费用(其实他不在意到底吃哪一种)。请你帮他想一下。
输入:
输入的第一行包含正整数\(N(2≤N≤500000)\),餐厅提供的餐的种类数。
以下\(N\)行包含两个正整数,\(A_i\)和\(B_i\)\((1 ≤ Ai, Bi ≤ 1 000 000 000)\),表示第\(i\)种餐的两个价格。
输出:
\(N\)行,第\(i\)行表示恰好订\(i\)种餐的最低价格
input
3
10 5
9 3
10 5
output
9
13
18
input
2
100 1
1 100
output
1
2
input
5
1000000000 1000000000
1000000000 1000000000
1000000000 1000000000
1000000000 1000000000
1000000000 1000000000
output
1000000000
2000000000
3000000000
4000000000
5000000000
意思就是选\(x\)种物品时,其中一个支付\(A_i\),其余都支付\(B_i\);
因为\(A_i\)只有一个,我们单独考虑;
如果只取\(B\),我们一定是从小到大的取;
先排序;
我们首先从小到大取了\(x\)个\(B\),现在要将其中一个改成\(A\);
有两种改法;
- 在选的前\(x\)个\(B\)中,将其中一个改为对应的\(A\),这一个物品的\(A_i-B_i\),应该是前\(x\)个中最小的;
- 在没选的当中选一个最小的\(A\),将最大的\(B\)改了;
第二种,我们可以预处理出\(mina[]\)代表第\(i+1\sim n\)中最小的\(A\);
第一种可以用一个变量在求解时继承转移;
时间复杂度是\(O(nlogn)\);
\(Code\)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=500005;
int n,pos;
struct food
{
int x,y;
bool operator<(food w)const
{
return y<w.y;
}
}a[N];
ll minx[N],minc;
ll ans;
inline int read()
{
int x=0,f=1;char st=getchar();
while(st<'0'||st>'9'){if(st=='-') f=-1;st=getchar();}
while(st>='0'&&st<='9') x=x*10+st-'0',st=getchar();
return x*f;
}
int main()
{
freopen("popust.in","r",stdin);
freopen("popust.out","w",stdout);
n=read();
for(int i=1;i<=n;i++)
{
a[i].x=read(),a[i].y=read();
}
sort(a+1,a+1+n);
minx[n]=9999999999999;
for(int i=n-1;i>=1;i--)
minx[i]=min(minx[i+1],(ll)a[i+1].x);
minc=9999999999999;
for(int i=1;i<=n;i++)
{
minc=min(minc,(ll)a[i].x-a[i].y);
ans+=a[i].y;
printf("%lld\n",min(ans-a[i].y+minx[i],ans+minc));
}
fclose(stdin);
fclose(stdout);
return 0;
}
T2 informacije (二分图
TimeLimit: 1000MS
Memory Limit: 32768KB
有一个序列\(A\),包涵\(1\)到\(N\)共\(N\)个元素(每个元素出现且只出现一次),给出\(M\)个关于\(A\)的描述。描述格式如下:
$1\ x\ y\ v $ 表示位置在\([x,y]\) 之间最大的值等于\(v\)
\(2\ x\ y\ v\)表示位置在\([x,y]\) 之间最小的值等于\(v\)
请输出满足上面这\(M\)个描述的序列。可以有不同的方案,输出任意一种。
无解输出\(-1\);
\(N (1 ≤ N ≤ 200)\)\(M (0 ≤ M ≤ 40 000)\)
就是求合法排列;
就是求一个位置可以放什么数;
一边是位置,一边是数,一个位置可以选这个数就连一条边;
这是一个二分图;
位置与数相连代表这位置选这个数;
这就是二分图的最大匹配;
如果不是完备匹配,就构造不出排列;
就输出\(-1\);
预处理出每个位置可以放的数,每个数可以放的位置,如果两情相悦,就连一条边;
时间复杂度是\(O(n^3)\)
\(Code\)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=205;
int n,m,opt,l,r,v,ans;
bool pd[N][N];
int l1[N],l2[N];//上界,与下界
struct skr
{
int to,nxt;
}a[N*N*2];
int head[N<<1],cnt;
int match[N<<1],vis[N<<1];
inline void add(int x,int y)
{
a[++cnt].to=y;a[cnt].nxt=head[x];head[x]=cnt;
}
inline int read()
{
int x=0,f=1;char st=getchar();
while(st<'0'||st>'9'){if(st=='-') f=-1;st=getchar();}
while(st>='0'&&st<='9') x=x*10+st-'0',st=getchar();
return x*f;
}
inline bool dfs(int x)
{
for(int i=head[x];i;i=a[i].nxt)
{
int y=a[i].to;
if(!vis[y])
{
vis[y]=1;
if(!match[y]||dfs(match[y]))
{
match[y]=x;
return 1;
}
}
}
return 0;
}
int main()
{
freopen("informacije.in","r",stdin);
freopen("informacije.out","w",stdout);
n=read();m=read();
for(int i=1;i<=n;i++)
l1[i]=n,l2[i]=1;
while(m--)
{
opt=read();l=read();r=read();v=read();
for(int i=1;i<l;i++)
pd[v][i]=1;
for(int i=r+1;i<=n;i++)
pd[v][i]=1;
if(opt==1)
{
for(int i=l;i<=r;i++)
l1[i]=min(l1[i],v);
}
else
{
for(int i=l;i<=r;i++)
l2[i]=max(l2[i],v);
}
}
for(int i=1;i<=n;i++)
{
for(int j=l2[i];j<=l1[i];j++)
if(!pd[j][i])
{
add(j,i+n);
add(i+n,j);
}
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof vis);
if(dfs(i)) ans++;
}
if(ans<n)
{
printf("-1");
fclose(stdin);
fclose(stdout);
return 0;
}
for(int i=1;i<=n;i++)
printf("%d ",match[i+n]);
fclose(stdin);
fclose(stdout);
return 0;
}
Test 1023 T1&T2的更多相关文章
- Action<T1, T2>委托
封装包含两个参数的方法委托,没有返回值. 语法 public delegate void Action<in T1, in T2>( T1 arg1, T2 arg2 ) 类型参数 in ...
- DateTime.Compare(t1,t2)比較两个日期大小
DateTime.Compare(t1,t2)比較两个日期大小,排前面的小,排在后面的大,比方:2011-2-1就小于2012-3-2返回值小于零: t1 小于 t2. 返回值等于零 : t1 等于 ...
- 使用Func<T1, T2, TResult>
使用Func<T1, T2, TResult> 委托返回匿名对象 Func<T1, T2, TResult> 委托 封装一个具有两个参数并返回 TResult 参数指定的类 ...
- java 多线程,T1 T2 T3 顺序执行
一.程序设计 1.抽象公共类PublicThread,具有先前线程属性previousThread.父类为Thread 2.在PublicThread的run()方法中判断previousThread ...
- 三个线程T1,T2,T3.保证顺序执行的三种方法
经常看见面试题:有三个线程T1,T2,T3,有什么方法可以确保它们按顺序执行.今天手写测试了一下,下面贴出目前想到的3种实现方式 说明:这里在线程中我都用到了sleep方法,目的是更容易发现问题.之前 ...
- C# Tuple<T1,T2....T>元组的使用
1) 先说组元:一个数据结构,由通过逗号分割的,用于传递给一个程序或者操作系统的一系列值的组合. NET Framework 直接支持一至七元素的元组 Tuple<T1> Tuple< ...
- DateTime.Compare(t1,t2)比较两个日期大小
DateTime.Compare(t1,t2)比较两个日期大小,排前面的小,排在后面的大,比如:2011-2-1就小于2012-3-2返回值小于零: t1 小于 t2. 返回值等于零 : t1 等于 ...
- Func<T1, T2, TResult> Delegate 系统Func委托类型
原文发布时间为:2011-03-25 -- 来源于本人的百度文章 [由搬家工具导入] http://msdn.microsoft.com/en-us/library/bb534647%28v=VS.1 ...
- 对复杂字典Dictionary<T1,T2>排序问题
原文:对复杂字典Dictionary<T1,T2>排序问题 //VoltageCount类(电压值对应的数量): public class VoltageCount { ...
随机推荐
- 学习记录:《C++设计模式——李建忠主讲》3.“组件协作”模式
“组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式.典型模式:Template M ...
- C# - VS2019 WinFrm应用程序开发报表 - ReportViewer控件初涉
前言 简单报表我们可以通过label.textBox和PrintDialog来实现,但是一般在实际生产过程中,用户的报表需求一般都是比较复杂的. 本篇主要记录对于传统中国式复杂报表的处理方法和解决思路 ...
- C# 未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”
“Microsoft.Jet.OLEDB.4.0” 是数据库接口驱动,用来连接数据库的,一般多用于连Access和Excel.我在在winform开发时,在本地运行没有问题,可是部署到另一台服务器上就 ...
- 扛把子组20191017-8 alpha week 2/2 Scrum立会报告+燃尽图 07
此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9804 一.小组情况 队名:扛把子 组长:迟俊文 组员:宋晓丽 梁梦瑶 韩昊 ...
- Docker-Compose基础与实战,看这一篇就够了
what & why Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排.使用前面介绍的Dockerfile我们很容易定义一个单独的应用容器.然 ...
- 2019-11-4:渗透测试,bypass学习,笔记
编码方式过wafurl编码,针对特殊情况可以两次URL编码十六进制编码,针对某些数据,如特殊字符,特殊字符串等unicode编码,使用两个字节编码一个字符,高位不足使用0填充单引号:%u0027.%u ...
- Flink中的CEP复杂事件处理 (源码分析)
其实CEP复杂事件处理,简单来说你可以用通过类似正则表达式的方式去表示你的逻辑,表现能力非常的强,用过的人都知道 开篇先偷一张图,整体了解Flink中的CEP中的 一种重要的图 NFA非确定有限状 ...
- 2019-2020-1 20199304《Linux内核原理与分析》第八周作业
第七章 Linux内核如何装载和启动一个可执行程序 一.知识点 1.ELF(Executable and Linkable Format)概述: "目标文件"指编译器生成的文件,& ...
- pop 与 popitem
pop给出一个键弹出值 popitem弹出一个项 >>> a.pop(2)'two'>>> a{1: 'one', 3: 'three', 4: 'four'}&g ...
- python 计算两个日期间的小时数
#!/usr/bin/env python #encoding: utf-8 import datetime def dateDiffInHours(t1, t2): td = t2 - t1 ret ...