码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-08-22 19:49:31      阅读:244      评论:0      收藏:0      [点我收藏+]

标签:tox   3par   fit   oal   复杂   重载运算符   lnl   web   snr   

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

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

标签:tox   3par   fit   oal   复杂   重载运算符   lnl   web   snr   

原文地址:http://www.cnblogs.com/Lanly/p/7413224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!