第二周 5.24-5.30

5.24

 

2015百度之星资格赛 1003 IP聚合

水。数据小。暴解即可。

STL依赖症。set需重载<

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <set>
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int a,b,c,d;
 9     friend bool operator < (node X,node Y)
10     {
11         if(X.a!=Y.a) return X.a<Y.a;
12         if(X.b!=Y.b) return X.b<Y.b;
13         if(X.c!=Y.c) return X.c<Y.c;
14         return X.d<Y.d;
15     }
16 } ip[1001];
17 
18 int main(void)
19 {
20     int T;cin>>T;
21     for(int kase=1;kase<=T;kase++)
22     {
23         int N,M;scanf("%d%d",&N,&M);
24         for(int i=1;i<=N;i++) scanf("%d.%d.%d.%d",&ip[i].a,&ip[i].b,&ip[i].c,&ip[i].d);
25         printf("Case #%d:\n",kase);
26         for(int i=1;i<=M;i++)
27         {
28             set <node> s;
29             node tem;
30             int A,B,C,D;scanf("%d.%d.%d.%d",&A,&B,&C,&D);
31             for(int j=1;j<=N;j++)
32             {
33                 tem.a=ip[j].a&A;
34                 tem.b=ip[j].b&B;
35                 tem.c=ip[j].c&C;
36                 tem.d=ip[j].d&D;
37                 s.insert(tem);
38             }
39             printf("%d\n",s.size());
40         }
41     }
42     return 0;
43 }
Aguin

 

2015百度之星资格赛 1004 放盘子
博弈。我觉得用我的脑子应该是想不到的。但是它把方法写在Hint里了。

由于图形对称。只要能放就是必胜。否则必败。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cmath>
 4 using namespace std;
 5 const double pi=3.1415926;
 6 
 7 int main(void)
 8 {
 9     int T;cin>>T;
10     for(int kase=1;kase<=T;kase++)
11     {
12         int n;double a,r;
13         scanf("%d%lf%lf",&n,&a,&r);
14         if(r<=a/2/tan(pi/n)) printf("Case #%d:\nGive me a kiss!\n",kase);
15         else printf("Case #%d:\nI want to kiss you!\n",kase);
16     }
17     return 0;
18 }
Aguin

 

2015百度之星资格赛 1005 下棋

看讨论里有人找规律。可惜对这种东西一向不怎么敏感阿。

老老实实两边BFS。

分别两张地图上。针对每个格子。找出老头和马能走到该格子的最短时间。

倘若老头能在t走到某格子(x,y)。那么只要你喜欢。就能选择在任何t+k的时间让他走到这个格子。(k∈Z+&&t+k<=K)

同理。若马能在t走到(x,y)。就能在t+2*k走到这个格子。

最后扫一遍图。取马和老头时间相同中的最小值即可。

写的比较丑。已经丑出风格丑出水平了。真是屡教不改。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <queue>
 5 using namespace std;
 6 # define CLR(x) memset(x,0,sizeof(x))
 7 # define mp make_pair
 8 int knight[1001][1001],king[1001][1001];
 9 int move[8][2]={{-2,1},{-1,2},{1,2},{2,1},{-2,-1},{-1,-2},{1,-2},{2,-1}};
10 
11 int main(void)
12 {
13     int T;cin>>T;
14     for(int kase=1;kase<=T;kase++)
15     {
16         CLR(knight);CLR(king);
17         int N,M,K;scanf("%d%d%d",&N,&M,&K);
18         int Xking,Yking,Xknight,Yknight;
19         scanf("%d%d%d%d",&Xking,&Yking,&Xknight,&Yknight);
20         queue < pair<int,int> > q1,q2;
21         q1.push(mp(Xking,Yking));
22         q2.push(mp(Xknight,Yknight));
23         for(int i=1;i<=K;i++)
24         {
25             if(!q1.empty())
26             {
27                 int t=q1.size();
28                 while(t--)
29                 {
30                     int x=q1.front().first,y=q1.front().second;q1.pop();
31                     for(int j=-1;j<=1;j++)
32                         for(int k=-1;k<=1;k++)
33                             if((j||k)&&x+j>=1&&x+j<=N&&y+k>=1&&y+k<=M&&!king[x+j][y+k])
34                             {
35                                 king[x+j][y+k]=i;
36                                 q1.push(mp(x+j,y+k));
37                             }
38                 }
39             }
40             if(!q2.empty())
41             {
42                 int t=q2.size();
43                 while(t--)
44                 {
45                     int x=q2.front().first,y=q2.front().second;q2.pop();
46                     for(int j=0;j<8;j++)
47                         if(x+move[j][0]>=1&&x+move[j][0]<=N&&y+move[j][1]>=1&&y+move[j][1]<=M&&!knight[x+move[j][0]][y+move[j][1]])
48                         {
49                             knight[x+move[j][0]][y+move[j][1]]=i;
50                             q2.push(mp(x+move[j][0],y+move[j][1]));
51                         }
52                 }
53             }
54         }
55         int min=K+1;
56         for(int i=1;i<=N;i++)
57             for(int j=1;j<=M;j++)
58                 if(knight[i][j]&&king[i][j])
59                 {
60                     if(knight[i][j]>=king[i][j]&&knight[i][j]<min) min=knight[i][j];
61                     else
62                     {
63                         int tem=knight[i][j];
64                         for(;tem<=K;tem+=2)
65                             if(tem>=king[i][j]) break;
66                         if(tem<min) min=tem;
67                     }
68                 }
69         if(min>K) printf("Case #%d:\nOH,NO!\n",kase);
70         else printf("Case #%d:\n%d\n",kase,min);
71     }
72     return 0;
73 }
Aguin

 

2015百度之星资格赛 1006 单调区间

这个题目的关键信息在:百小度最近在逛博客,然后发现了一个有趣的问题。

懂了吗?没错!这是一个内涵题。

只要百度一下:一个n位数平均有多少个单调区间?

就能找到 http://www.matrix67.com/blog/archives/5296

QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ QAQ

然后……就没有然后了……

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 double num[100001],len[100001];
 5 
 6 int main(void)
 7 {
 8     for(int i=1;i<=100000;i++) {num[i]=1+1.0*(i-2)*19/27;len[i]=(46-1.0*38/i)/(19-1.0*11/i);}
 9     int T;cin>>T;
10     for(int kase=1;kase<=T;kase++)
11     {
12         int n;scanf("%d",&n);
13         printf("Case #%d:\n%.6lf %.6lf\n",kase,num[n],len[n]);
14     }
15     return 0;
16 }
Aguin

 

至此百度之星资格赛的题目就被Aguin、度娘以及鸡汁的出题人三人组成的小队不择手段的完成了。

 

5.25

 

hdu1754 I Hate It 线段树 点更新

题目没啥。但是手贱用了宏。于是T了还不知所以。

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 # define maxn 200000+5
 5 int grade[maxn];
 6 
 7 int MAX(int x,int y){return x>=y ? x:y;}//不能用 # define MAX(x,y) x>y?x:y
 8 
 9 struct node
10 {
11     int a,b,max;
12 } tree[4*maxn];
13 
14 void maketree(int i,int a,int b)
15 {
16     tree[i].a=a;tree[i].b=b;
17     if(a<b)
18     {
19         maketree(2*i,a,(a+b)/2);
20         maketree(2*i+1,(a+b)/2+1,b);
21         tree[i].max=MAX(tree[2*i].max,tree[2*i+1].max);
22     }
23     else tree[i].max=grade[a];
24     return;
25 }
26 
27 void update(int i,int p,int grade)
28 {
29     if(tree[i].a==tree[i].b) {tree[i].max=grade;return;}
30     if(p<=(tree[i].a+tree[i].b)/2) update(2*i,p,grade);
31     else update(2*i+1,p,grade);
32     tree[i].max=MAX(tree[2*i].max,tree[2*i+1].max);
33     return;
34 }
35 
36 int query(int i,int A,int B)
37 {
38     if(tree[i].a>=A&&tree[i].b<=B) return tree[i].max;
39     int max=-1;
40     if(A<=(tree[i].a+tree[i].b)/2) max=MAX(max,query(2*i,A,B));
41     if(B>=(tree[i].a+tree[i].b)/2+1) max=MAX(max,query(2*i+1,A,B));
42     return max;
43 }
44 
45 int main(void)
46 {
47     int N,M;
48     while((scanf("%d%d",&N,&M))!=EOF)
49     {
50         for(int i=1;i<=N;i++) scanf("%d",grade+i);
51         maketree(1,1,N);
52         for(int i=1;i<=M;i++)
53         {
54             char s[5];int A,B;
55             scanf("%s%d%d",s,&A,&B);
56             if(s[0]=='Q') printf("%d\n",query(1,A,B));
57             if(s[0]=='U') update(1,A,B);
58         }
59     }
60     return 0;
61 }
Aguin

 

hdu1394 Minimum Inversion Number 线段树 点更新

数不大。可以暴解的。

然而一直理解不能线段树到底用在哪里了喂!

最后终于看懂了是区间计数然后每次询问(i,n-1)

感到智商十分捉鸡那。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <algorithm>
 4 using namespace std;
 5 # define maxn 5000+5
 6 int num[maxn];
 7 
 8 struct node
 9 {
10     int a,b,num;
11 }tree[maxn*4];
12 
13 void maketree(int i,int a,int b)
14 {
15     tree[i].a=a;tree[i].b=b;tree[i].num=0;
16     if(a==b) return;
17     maketree(2*i,a,(a+b)/2);
18     maketree(2*i+1,(a+b)/2+1,b);
19     return;
20 }
21 
22 int query(int i,int a,int b)
23 {
24     if(tree[i].a>=a&&tree[i].b<=b) return tree[i].num;
25     int sum=0;
26     if(a<=(tree[i].a+tree[i].b)/2) sum+=query(2*i,a,b);
27     if(b>=(tree[i].a+tree[i].b)/2+1) sum+=query(2*i+1,a,b);
28     return sum;
29 }
30 
31 void update(int i,int p)
32 {
33     if(tree[i].a==tree[i].b) {tree[i].num=1;return;}
34     if(p<=(tree[i].a+tree[i].b)/2) update(2*i,p);
35     else update(2*i+1,p);
36     tree[i].num=tree[2*i].num+tree[2*i+1].num;
37     return;
38 }
39 
40 int main(void)
41 {
42     int n;
43     while(cin>>n)
44     {
45         maketree(1,0,n-1);
46         int sum=0;
47         for(int i=0;i<n;i++)
48         {
49             scanf("%d",num+i);
50             sum+=query(1,num[i],n-1);
51             update(1,num[i]);
52         }
53         int MIN=sum;
54         for(int i=0;i<n;i++)
55             MIN=min(MIN,sum+=n-2*num[i]-1);
56         printf("%d\n",MIN);
57     }
58     return 0;
59 }
Aguin

 

hdu1698 Just a Hook 线段树 段更新

于是终于尝试了段更新。

事实上当时听课就没怎么听懂。

看了很多别人的代码。好像写法还蛮多的。

个人认为关键在于覆盖的时候杂色-1这个处理。

然而感觉这个方法并不是普遍适用的。

先消化这个入门级的吧。后续的再学习。

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 # define maxn 100000+5
 5 
 6 struct node
 7 {
 8     int a,b,color;
 9 } tree[4*maxn];
10 
11 void maketree(int i,int a,int b)
12 {
13     tree[i].a=a;tree[i].b=b;tree[i].color=1;
14     if(a<b)
15     {
16         maketree(2*i,a,(a+b)/2);
17         maketree(2*i+1,(a+b)/2+1,b);
18     }
19     return;
20 }
21 
22 void update(int i,int a,int b,int color)
23 {
24     if(tree[i].color==color) return;
25     if(tree[i].a>=a&&tree[i].b<=b){tree[i].color=color;return;}
26     if(tree[i].color!=-1) {tree[2*i].color=tree[2*i+1].color=tree[i].color;tree[i].color=-1;}
27     if(a<=(tree[i].a+tree[i].b)/2) update(2*i,a,b,color);
28     if(b>=(tree[i].a+tree[i].b)/2+1) update(2*i+1,a,b,color);
29     return;
30 }
31 
32 int query(int i)
33 {
34     if(tree[i].color!=-1) return tree[i].color*(tree[i].b-tree[i].a+1);
35     return query(2*i)+query(2*i+1);
36 }
37 
38 int main(void)
39 {
40     int T;cin>>T;
41     for(int kase=1;kase<=T;kase++)
42     {
43         int N,Q;scanf("%d%d",&N,&Q);
44         maketree(1,1,N);
45         for(int i=1;i<=Q;i++)
46         {
47             int X,Y,Z;scanf("%d%d%d",&X,&Y,&Z);
48             update(1,X,Y,Z);
49         }
50         printf("Case %d: The total value of the hook is %d.\n",kase,query(1));
51     }
52     return 0;
53 }
Aguin

 

5.26

 

和高中的国象大神讨论了了百度的下棋。

他和我说了一个多小时。总结一下就是:可以贪。

我也觉得自己很sb。

首先对于老头而言。根本无需BFS。

因为老头的范围是以一个正方形扩大。每次边长增加2。

而骑士可以一直向着老头的初始位置走横日或者竖日趋近。

大神说当时比较忙。没空写。

然而现在已经不能提交了。等题放出有心情再写。

其实还是有细节需要注意的。

首先要注意骑士一步走进老头初始位置的情况。

其次注意边界。

放两个图。

 

poj3468 A Simple Problem with Integers 线段树 段更新 lazy-tag

终于学习了传说中号称线段树精髓的lazy-tag

关键还是那个tag与pushdown

感觉还不熟练呐。

(多次i与1写错。然而并不喜欢写宏)

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 typedef long long LL;
 5 # define maxn 100000+5
 6 int num[maxn];
 7 
 8 struct node
 9 {
10     int a,b;
11     LL sum,tag;
12 } tree[4*maxn];
13 
14 void pushdown(int i)
15 {
16     if(tree[i].tag)
17     {
18         tree[2*i].tag+=tree[i].tag;
19         tree[2*i+1].tag+=tree[i].tag;
20         tree[2*i].sum+=(tree[2*i].b-tree[2*i].a+1)*tree[i].tag;
21         tree[2*i+1].sum+=(tree[2*i+1].b-tree[2*i+1].a+1)*tree[i].tag;
22         tree[i].tag=0;
23     }
24     return;
25 }
26 
27 void maketree(int i,int a,int b)
28 {
29     tree[i].a=a;tree[i].b=b;tree[i].tag=0;
30     if(a<b)
31     {
32         maketree(2*i,a,(a+b)/2);
33         maketree(2*i+1,(a+b)/2+1,b);
34         tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
35     }
36     else tree[i].sum=num[a];
37     return;
38 }
39 
40 void update(int i,int a,int b,int value)
41 {
42     if(tree[i].a>=a&&tree[i].b<=b) {tree[i].tag+=value; tree[i].sum+=(tree[i].b-tree[i].a+1)*value; return;}
43     pushdown(i);
44     if(a<=(tree[i].a+tree[i].b)/2) update(2*i,a,b,value);
45     if(b>=(tree[i].a+tree[i].b)/2+1) update(2*i+1,a,b,value);
46     tree[i].sum=tree[2*i].sum+tree[2*i+1].sum;
47     return;
48 }
49 
50 LL query(int i,int a,int b)
51 {
52     if(a<=tree[i].a&&b>=tree[i].b) return tree[i].sum;
53     pushdown(i);
54     LL sum=0;
55     if(a<=(tree[i].a+tree[i].b)/2) sum+=query(2*i,a,b);
56     if(b>=(tree[i].a+tree[i].b)/2+1) sum+=query(2*i+1,a,b);
57     return sum; 
58 }
59 
60 int main(void)
61 {
62     int N,Q;
63     while(cin>>N>>Q)
64     {
65         for(int i=1;i<=N;i++) scanf("%d",num+i);
66         maketree(1,1,N);
67         for(int i=1;i<=Q;i++)
68         {
69             char s[5];int a,b,c;
70             scanf("%s",s);
71             if(s[0]=='Q') {scanf("%d%d",&a,&b);printf("%lld\n",query(1,a,b));}
72             if(s[0]=='C') {scanf("%d%d%d",&a,&b,&c);update(1,a,b,c);}
73         }
74     }
75     return 0;
76 }
Aguin

 

5.27

 

大家都做了CF然而我又在睡觉。

然而反对暴力倡导和谐的我并没有补题。

 

今年寒假自己啃了C语法。学校里给我们专业开的是C++课。

前面半本书的课基本没听。都在写高代或者物理。但是也没有学C++后面的内容。

唯一会用的就是STL相关的一些基础。

后来开始讲后半本书了。不得不听课了。

讲了类和类模板才知道自己平常在用的STL是个啥。真是惭愧。

(然而感觉语法学的很糟糕)

 

晚上写一个线段树。STL依赖症于是T了一晚。明日再补吧。

 

5.28

 

poj2528 Mayor’s posters 线段树 离散化

这个线段树的部分和hdu1698的涂色是一样的。

但是加上了一个叫离散化的东西。

在上周BC的时候用map+queue做了一个离散化的题目(当时并不知道叫离散化)

于是一开始就像用set+map做。

但是自己测样例的时候大概过了1s才跳出答案- -

于是去掉了set的部分。用了一个大大的数组。但是T了。

感觉应该是不能用map了。

看了几个别人写的离散化。不知道干嘛觉得很不顺眼。(大概和别人看我不爽是一样的)

后来就自己乱写了。

结果内存用了好多。跑得也不快。但是总算是过了。

# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
int ans,ord[2][10005],mark[10005],point[10000005];

struct node
{
    int a,b,cover;
} tree[4*20005];

void maketree(int i,int a,int b)
{
    tree[i].a=a;tree[i].b=b;tree[i].cover=0;
    if(a<b)
    {
        maketree(2*i,a,(a+b)/2);
        maketree(2*i+1,(a+b)/2+1,b);
    }
    return;
}

void update(int i,int a,int b,int cover)
{
    if(a<=tree[i].a&&b>=tree[i].b) {tree[i].cover=cover;return;}
    if(tree[i].cover!=-1) {tree[2*i].cover=tree[2*i+1].cover=tree[i].cover; tree[i].cover=-1;}
    if(a<=(tree[i].a+tree[i].b)/2) update(2*i,a,b,cover);
    if(b>=(tree[i].a+tree[i].b)/2+1) update(2*i+1,a,b,cover);
    return;
}

void query(int i)
{
    if(!tree[i].cover) return;
    if(tree[i].cover!=-1) {if(!mark[tree[i].cover]) ans++; mark[tree[i].cover]=1; return;}
    query(2*i);query(2*i+1);
    return;
}

int main(void)
{
    int c;cin>>c;
    while(c--)
    {
        int n,cnt=0; scanf("%d",&n);
        memset(mark,0,sizeof(mark));
        memset(point,0,sizeof(point));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d",ord[0]+i,ord[1]+i);
            point[ord[0][i]]=point[ord[1][i]]=1;
        }
        for(int i=1;i<=10000000;i++) if(point[i]) point[i]=++cnt;
        maketree(1,1,cnt);
        for(int i=1;i<=n;i++) update(1,point[ord[0][i]],point[ord[1][i]],i);
        ans=0; query(1);
        printf("%d\n",ans);
    }
    return 0;
}
Aguin

 

5.29

 

郏老大讲树状数组。算法课签到+1。

感觉就是学习了一种虽然不知道怎么回事但是很好用的求和工具。

课上讲的题好像都见过。于是用树状数组重新写一次。

 

hdu1166 敌兵布阵 点更新 求和 树状数组

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 using namespace std;
 5 int N,c[50005]={0};
 6 
 7 int lowbit(int s)
 8 {return s&(-s);}
 9 
10 void add(int i,int x)
11 {
12     while(i<=N){c[i]+=x; i+=lowbit(i);}
13     return;
14 }
15 
16 int sum(int i)
17 {
18     int ans=0;
19     while(i>0) {ans+=c[i];i-=lowbit(i);}
20     return ans;
21 }
22 
23 int main(void)
24 {
25     int T;cin>>T;
26     for(int kase=1;kase<=T;kase++)
27     {
28         memset(c,0,sizeof(c));
29         scanf("%d",&N);
30         for(int i=1;i<=N;i++)
31         {
32             int x;scanf("%d",&x);
33             add(i,x);
34         }
35         printf("Case %d:\n",kase);
36         while(1)
37         {
38             char s[10];int a,b;
39             scanf("%s",s);
40             if(s[0]=='E') break;
41             scanf("%d%d",&a,&b);
42             if(s[0]=='A') add(a,b);
43             if(s[0]=='S') add(a,-b);
44             if(s[0]=='Q') printf("%d\n",sum(b)-sum(a-1));
45         }
46     }
47     return 0;
48 }
Aguin

 

hdu1394 Minimum Inversion Number 求逆序数 树状数组

题目里面是0~n-1的。好像就不好用了(可能是我不会)。于是变成1~n+1。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 using namespace std;
 6 int n,c[5005],num[5005];
 7 
 8 int lowbit(int s)
 9 {return s&(-s);}
10 
11 void add(int i,int x)
12 {
13     while(i<=n+1){c[i]+=x; i+=lowbit(i);}
14     return;
15 }
16 
17 int sum(int i)
18 {
19     int ans=0;
20     while(i>0) {ans+=c[i];i-=lowbit(i);}
21     return ans;
22 }
23 
24 int main(void)
25 {
26     while(cin>>n)
27     {
28         memset(c,0,sizeof(c));
29         int tem=0;
30         for(int i=0;i<n;i++)
31         {
32             scanf("%d",num+i);
33             tem+=sum(n+1)-sum(num[i]+1);
34             add(num[i]+1,1);
35         }
36         int ans=tem;
37         for(int i=0;i<n;i++) ans=min(ans,tem+=n-2*num[i]-1);
38         printf("%d\n",ans); 
39     }
40     return 0;
41 }
Aguin

 

5.30

 

继续补树状数组。

其实当讲到 段更新 点询问 的时候。

首先想到的是西电oj开服赛的那个挖掘机

虽然说这里的询问很简单。不用树状数组或者线段树。

但是求和的时候用到了相同的思想。

树状数组只是工具。关键是如果把问题转化为求和。

 

郏老大在自家oj挂题了。

清点人数

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 using namespace std;
 5 int n,c[500005];
 6 
 7 int lowbit(int s)
 8 {return s&(-s);}
 9 
10 void add(int i,int x)
11 {
12     while(i<=n){c[i]+=x; i+=lowbit(i);}
13     return;
14 }
15 
16 int sum(int i)
17 {
18     int ans=0;
19     while(i>0) {ans+=c[i];i-=lowbit(i);}
20     return ans;
21 }
22 
23 int main(void)
24 {
25     int k;
26     while(cin>>n>>k)
27     {
28         memset(c,0,sizeof(c));
29         for(int i=0;i<k;i++)
30         {
31             char s[5];int a,b;
32             scanf("%s",s);
33             if(s[0]=='A') {scanf("%d",&a); printf("%d\n",sum(a));}
34             if(s[0]=='B') {scanf("%d%d",&a,&b); add(a,b);}
35             if(s[0]=='C') {scanf("%d%d",&a,&b); add(a,-b);}
36         }
37     }
38     return 0;
39 }
Aguin

 

弱弱的战壕

先排序。再统计比它小的。和求顺序对很像。

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 using namespace std;
 6 int c[32005],ans[15005];
 7 
 8 struct cor
 9 {
10     int x,y;
11 } point[15005];
12 
13 bool cmp(cor a,cor b)
14 {
15     return a.x==b.x? a.y<b.y:a.x<b.x ;
16 }
17 
18 int lowbit(int s)
19 {return s&(-s);}
20 
21 void add(int i,int x)
22 {
23     while(i<=32000){c[i]+=x; i+=lowbit(i);}
24     return;
25 }
26 
27 int sum(int i)
28 {
29     int ans=0;
30     while(i>0) {ans+=c[i];i-=lowbit(i);}
31     return ans;
32 }
33 
34 int main(void)
35 {
36     int n;
37     while(cin>>n)
38     {
39         memset(c,0,sizeof(c));
40         memset(ans,0,sizeof(ans));
41         for(int i=0;i<n;i++) scanf("%d%d",&point[i].x,&point[i].y);
42         sort(point,point+n,cmp);
43         for(int i=0;i<n;i++) {ans[sum(point[i].y)]++; add(point[i].y,1);}
44         for(int i=0;i<n;i++) printf("%d\n",ans[i]);
45     }
46     return 0;
47 }
Aguin

 

下午百度爆0了。

感觉心很累。好像不会再码了。

1001想贪。贪错了。

后来拓神教我。然而没怎么看懂。又去问铖霸。

铖霸叫我好好看题。才发现看错题。

1005置换。不知道哪里写错了。

sample3过不了。我拧过了。的确是105次- -

计算几何什么的不会。其他的根本不知道是啥。

 

事情越来越多了。接下来的两周会更忙。

暑假快来吧。

 

23+1=24;

转载于:https://www.cnblogs.com/Aguin/p/4526319.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值