JZOJ.5329【NOIP2017模拟8.22】时间机器

Description

 

Input

Output

 

Sample Input

3
2 2
1 4 2
3 5 1
1 4 2
2 5 1
3 2
1 3 1
2 4 1
3 5 1
1 3 2
2 5 1
2 2
1 2 2
1 2 1
1 2 1
1 2 2
 

Sample Output

Yes
No
Yes
 

Data Constraint


 

Hint

很明显这是要让我们匹配,很容易想到可以二分图匹配,但是又有数量,于是我们可以网络流,但是n还是巨大,使得我们不得不想想其他办法。

我们的期望搭配就是电阻的允许电压范围跟节点的电压范围接近,于是我们可以贪心。

我们可以用左端点排序,然后对于每个节点找到第一个右端点大于它的,左端点小于等于它的即可。

但是复杂度仍为O(nm),我们可以考虑用map或set维护符合左端点条件的右端点的电阻。复杂度O((n + m) log m + n log n)。

复制代码
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <set>
 5 #include <algorithm>
 6 #define N 100005
 7 using namespace std;
 8 struct data{
 9     int l,r,num,v;
10     bool operator < (const data &a) const{
11         return (a.r>r);
12       }
13 }zu[N];
14 multiset<data> qwq;
15 multiset<data>::iterator qaq;
16 int n,m,t,ans;
17 bool power;
18 int read(){
19     int x=0,w=1;
20     char c=0;
21     for (c=getchar();c<'0'||c>'9';c=getchar()) {if (c=='-') w=-1;}
22     for (;c>='0'&&c<='9';c=getchar()) x=(x<<3)+(x<<1)+c-'0';
23     return x*w;
24 }
25 bool comp(const struct data a,const struct data b){
26   return ((a.l<b.l)||(a.l==b.l)&&(a.v>b.v));
27 }
28 int main(){
29     freopen("machine.in","r",stdin);
30     freopen("machine.out","w",stdout);
31     for (t=read();t;t--){
32       qwq.clear();
33       power=true;
34       ans=0;
35       n=read();
36       m=read();
37       for(int i=1;i<=n;++i){
38         zu[i].l=read();
39         zu[i].r=read();
40         zu[i].num=read();
41         zu[i].v=-1;
42       }
43       for(int i=n+1;i<=n+m;++i){
44         zu[i].l=read();
45         zu[i].r=read();
46         zu[i].num=read();
47         zu[i].v=1;
48       }
49       sort(zu+1,zu+1+n+m,comp);
50       for (int i=1;i<=n+m;i++){
51         if (zu[i].v==1) 
52          qwq.insert(zu[i]);
53         else while (zu[i].num){
54           qaq=qwq.lower_bound(zu[i]);
55           if (qaq==qwq.end()){
56             power=false;
57             puts("No");
58             break;
59           }
60           data tmp=*qaq;
61           qwq.erase(qaq);
62           if (zu[i].num<tmp.num) {tmp.num-=zu[i].num,qwq.insert(tmp),zu[i].num=0;}
63           else {zu[i].num-=tmp.num;}
64         }
65         if (power==false) break;
66       }
67       if (power) puts("Yes");
68     }
69 }
神奇的代码
复制代码

这种纯考STL的题.......还出了两题

第一次打set,第一次打迭代器,第一次打重载运算符啊啊QAQ

本文作者:~Lanly~

本文链接:https://www.cnblogs.com/Lanly/p/7413224.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ~Lanly~  阅读(207)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.