★★  
输入文件:counttree.in   输出文件:counttree.out   简单相比
日子范围:1 s   内部存款和储蓄器限制:128 MB

PID221 / 烦人的幻灯片 ☆

【标题叙述】

有关树的总计难点有种种各类的本子,那里你需求化解一个比较不难的标题:对于一棵包罗N个节点的有根树,将全部点从1到N编号后,对于每二个节点v,总括出以v为根的子树中有多少个点的号码比v小。

 

【输入格式】

输入第①行李包裹蕴贰个整数N,以下N行每行李包裹括3个平头,当中第i行的整数表示编号为i的节点的阿爹节点的号码,根的爹爹节点编号为0。

统计 1

【输出格式】

输出包括N行,当中第i行提交编号为i的节点的总计结果。

您还木有做过啊

【样例输入】

3
2
3
0

作者的图景

【样例输出】

0 1 2

 

【提示】

在此键入。

 

【来源】

20%的数据1<=n<=1000

100%的数据1<=n<=100000

 

上来看了一眼题目难度是两颗黑星,感觉特别不足做(因为自个儿一般在cogs刷两星的标题很少贰次不看题解AC)

一初阶以为是树上倍增.树上DP.SportageMQ之类的,不过都不会啊。。

无法只得暴力。

武力思路:

一:读入每多个点,记录她的father,

二:枚举每多个点,假如她的father不为0且它的father的值比他大,那么它的father的值就++

正解:

DFS序+树状数组

可是看了弹指间测评记录自身的强力0.125s秒杀全部正解+暴力=.=

 

统计 2

 1     #include<iostream>
 2     #include<cstdio>
 3     #include<cstring>
 4     #include<cmath>
 5     using namespace std;
 6     const int MAXN=100001;
 7     int read(int & n)
 8     {
 9         char c='/';int x=0,flag=0;
10         while(c<'0'||c>'9')
11         {c=getchar();
12         if(c=='-')flag=1;}
13         while(c>='0'&&c<='9')
14         {x=x*10+c-48;c=getchar();}
15         if(flag)n=-x;
16         else n=x;
17         return n;
18     }
19     int n,p;
20     int fa[MAXN];
21     int ch[MAXN];
22     int num[MAXN];
23     int main()
24     {
25         freopen("counttree.in","r",stdin);
26         freopen("counttree.out","w",stdout);
27         read(n);
28         for(int i=1;i<=n;i++)
29         {
30             read(p);
31             fa[i]=p;    
32         }
33         for(int i=1;i<=n;i++)
34         {
35             int p=i;
36             while(fa[p]!=0)
37             {
38                 if(fa[p]>i)
39                     num[fa[p]]++;
40                 p=fa[p];
41             }
42         }
43         for(int i=1;i<=n;i++)
44         {
45             printf("%d ",num[i]);
46         }
47         return 0;
48     }

统计 3

 

 

 

翻开最终一回测验评定记录

统计 4

统计 5

质量还无法计算出来啊~

题目评价

质量

★★★★★

★★★★☆

★★★☆☆

★★☆☆☆

★☆☆☆☆

0%

0%

0%

0%

0%

统计 6

通过人数 186 / 337

因而总结

 

最短耗费时间

0ms

微小内部存款和储蓄器

0KB

统计 7

其它

难点标签

类型

其它 

标题叙述

李助教于后日早上做1个老大首要的演说。不幸的是她不是三个要命爱整洁的人,他把温馨做演说要用的幻灯片随便堆放在一块儿。因而,解说以前她只好去收拾那几个幻灯片。做为3个另眼相待效用的专家,他盼望尽可能简单地形成它。景况是如此,教师这一次发言一共要用n张幻灯片(n<=26),那n张幻灯片依据解说要选用的一一已经用数字1,2,…,n在上头编上了号。因为幻灯片是晶莹剔透的,所以大家无法须臾间看清每3个数字所对应的幻灯片。

前几日我们用大写字母A,B,C,。。。再度把幻灯片依次编上号,如样例所示,大家能够长足发现编号为A的幻灯片是第伍张,把它抽出来后大家又有啥不可鲜明编号为C的幻灯片是第3张,。。。

你的任务是编辑三个顺序,把幻灯片的数字编号和字母编号对应起来,显然那种对应相应是唯一的;如若出现七种应和的景况大概某些数字编号和字母对应不起来,我们就称对应是无能为力落到实处的。

输入格式

率先行唯有三个数n,表示有n张幻灯片,接下去的n行第行李包裹蕴伍个整数Xmin,Xmax,Ymin,Ymax(整数之间用空格分开),为幻灯片的坐标(该区域为幻灯片),那n张幻灯片按其在输入文件中出现的依次从前到后依次编号为A,B,C,。。。再接下来的n行依次为n个数字编号的坐标X,Y,鲜明在幻灯片之外是不会有数字的。

(其实是键盘输入了哇)

出口格式

若果对应能够落成,你的出口应该包罗n行,每一行事三个假名和1个数字,中间以叁个空格隔开分离,并且各行以字母的升序排列,注意输出的字母要大写并且顶格;反之,假若对应不能落实,在文件的首先行顶格输出None即可。行首行末无剩余空格。

(其实是显示器输出了啊。。。)

样例输入

4
6  22  10  20
4  18  6   16
8  20  2   18
10 24  4   8
9  15
19 17
11 7
21 11

输出

A4
B1
C2
D3
强力出神迹暴力出神迹暴力出神跡暴力出神蹟暴力出神跡暴力出奇迹暴力出神跡暴力出奇迹暴力出神跡暴力出神迹暴力出神迹暴力出神跡暴力出神蹟暴力出神跡暴力出神蹟暴力出神蹟暴力出神蹟暴力出奇迹暴力出神迹暴力出奇迹暴力出奇迹暴力出奇迹暴力出奇迹暴力出神迹暴力出神蹟暴力出神跡暴力出神迹暴力出神蹟暴力出神蹟暴力出神跡暴力出神跡暴力出神跡暴力出神跡暴力出神跡暴力出神迹暴力出神蹟暴力出神蹟暴力出奇迹暴力出神跡暴力出神蹟暴力出神蹟暴力出神蹟暴力出奇迹暴力出奇迹暴力出神跡暴力出神跡暴力出神蹟暴力出神迹暴力出奇迹暴力出神蹟暴力出神跡暴力出神蹟暴力出奇迹暴力出神蹟暴力出神迹暴力出神蹟暴力出神跡暴力出神跡暴力出神蹟暴力出神迹暴力出神跡暴力出神迹暴力出奇迹暴力出奇迹暴力出神蹟暴力出神跡暴力出奇迹暴力出神蹟暴力出神迹暴力出神跡暴力出神蹟暴力出奇迹暴力出神跡暴力出奇迹暴力出奇迹暴力出神跡暴力出神蹟暴力出奇迹暴力出神迹暴力出奇迹暴力出奇迹暴力出神跡暴力出神迹暴力出神跡暴力出神跡暴力出奇迹暴力出奇迹暴力出奇迹暴力出奇迹暴力出神跡暴力出神迹暴力出神蹟暴力出神蹟暴力出神跡暴力出神跡暴力出神迹暴力出奇迹暴力出神迹暴力出神迹暴力出奇迹暴力出神迹暴力出神跡暴力出神迹暴力出神蹟暴力出神迹暴力出神迹暴力出奇迹暴力出神蹟暴力出神迹暴力出神迹暴力出奇迹暴力出神跡暴力出神蹟暴力出神跡暴力出奇迹暴力出奇迹暴力出神迹暴力出神蹟暴力出神迹暴力出神跡暴力出神迹暴力出神迹暴力出神蹟暴力出神迹暴力出神迹暴力出奇迹暴力出神蹟暴力出神跡暴力出奇迹暴力出神蹟暴力出神蹟暴力出神蹟暴力出神迹暴力出奇迹暴力出神跡、】

 

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 struct node
 6 {
 7     int xmin;
 8     int xmax;
 9     int ymin;
10     int ymax;
11     int vis;
12     int bj;
13 }a[1001];
14 struct zb
15 {
16     int x;
17     int y;
18     int vis;
19     int bj;
20 }b[1001];
21 int n;
22 int flag=0;
23 char hh='A';
24 int ans[1001];
25 void dfs(int p)
26 {
27     if(p==n+1)
28     {
29         if(flag==0)
30         {
31             for(int i=1;i<=n;i++)
32             {
33                 ans[i]=a[i].bj;
34             }
35             flag=1;
36         }
37         else 
38         {
39             for(int i=1;i<=n;i++)
40             {
41                 if(a[i].bj!=ans[i])
42                 {
43                     printf("None");
44                     flag=2;
45                     return;
46                 }
47             }
48         }
49         
50         /*for(int i=1;i<=n;i++)
51         printf("%c %d\n",hh,a[i].bj);
52         flag=1;
53         return;*/
54     }
55     for(int j=1;j<=n;j++)
56         {
57             if(a[j].vis==0)
58             {
59                 for(int k=1;k<=n;k++)
60                 {
61                     if(a[j].xmin<b[k].x&&a[j].xmax>b[k].x&&a[j].ymin<b[k].y&&a[j].ymax>b[k].y&&b[k].vis==0)
62                     {
63                         a[j].vis=1;
64                         b[k].vis=1;
65                         a[j].bj=k;
66                         dfs(p+1);
67                         if(flag==2)return;    
68                         b[k].vis=0;
69                         a[j].vis=0;
70                     }
71                 }
72                 
73             }
74             
75         }
76 }
77 int main()
78 {
79     
80     scanf("%d",&n);
81     for(int i=1;i<=n;i++)
82         scanf("%d%d%d%d",&a[i].xmin,&a[i].xmax,&a[i].ymin,&a[i].ymax);
83     for(int i=1;i<=n;i++)
84         scanf("%d%d",&b[i].x,&b[i].y);
85     dfs(1);
86     if(flag==1)
87     for(int i=1;i<=n;i++)
88     {
89         printf("%c%d\n",hh++,ans[i]);
90     }
91     return 0;
92     
93 }