CF 767#

A题的话,用一个priority_queue维护一下,直到最大的符合要求才出来,,(一开始记错了,,2333写成了小根堆。。。)

 1 #include<bits/stdc++.h>
 2 #define N 150005
 3 #define LL long long
 4 #define inf 0x3f3f3f3f
 5 #define lowbit(x) x&(-x)   
 6 using namespace std;
 7 inline int ra()
 8 {
 9     int x=0,f=1; char ch=getchar();
10     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
12     return x*f;
13 }
14 priority_queue<int  >q;
15 int main()
16 {
17     int n=ra(),t=n;
18     for (int i=1; i<=n; i++)
19     {
20         int x=ra();
21         q.push(x);
22         while (!q.empty())
23         {
24             int y=q.top();
25             if (y==t)
26             {
27                 printf("%d ",y);
28                 q.pop();
29                 t--;
30             }
31             else break;
32         }
33         cout<<endl;
34     }
35     return 0;
36 }

B题,弃疗,不会,s(神)b(犇)题,码力不够,虚,弃疗。

C题就是普普通通搜一下就好了,然后还是写不对,太虚了。。。一开始的程序真是bug++啊,,,,(一开始只判了2个点合法就行,然后是有特殊情况的,比如就只能分成2块,尴尬了。。。。所以又记录一个点)

 1 #include<bits/stdc++.h>
 2 #define N 1000005
 3 #define LL long long
 4 #define inf 0x3f3f3f3f
 5 #define lowbit(x) x&(-x)   
 6 using namespace std;
 7 inline int ra()
 8 {
 9     int x=0,f=1; char ch=getchar();
10     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
11     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
12     return x*f;
13 }
14 struct node{
15     int to,next;
16 }e[N];
17 int w[N],n,ans1,ans2;
18 bool flag;
19 int head[N],cnt,tot,root,ans3;
20 void insert(int x, int y)
21 {
22     e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
23 }
24 void dfs(int x)
25 {
26     if (flag) return;
27     for (int i=head[x];i;i=e[i].next)
28     {
29         dfs(e[i].to);
30         w[x]+=w[e[i].to];
31     }
32     if (w[x]==tot/3 && !ans1) ans1=x,w[x]=0;
33     else if (w[x]==tot/3 && ans1 && !ans2) ans2=x,w[x]=0; 
34     else if (w[x]==tot/3 && ans1 && ans2 && !ans3) ans3=x;
35 }
36 int main()
37 {
38     n=ra();
39     for (int i=1; i<=n; i++)
40     {
41         int x=ra();
42         if (x!=0) insert(x,i); else root=i; w[i]=ra();
43         tot+=w[i];
44     }
45     if (tot%3)
46     {
47         cout<<"-1";
48         return 0;
49     }
50     dfs(root);
51     if (ans1 && ans2 && ans3)
52     {
53         cout<<ans1<<" "<<ans2;
54         return 0;
55     }
56     cout<<"-1";
57     return 0;
58 }

 

posted @ 2017-02-23 21:24  ws_ccd  阅读(201)  评论(0编辑  收藏  举报