zoukankan      html  css  js  c++  java
  • 第二周 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:
    ",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
    ",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:
    Give me a kiss!
    ",kase);
    15         else printf("Case #%d:
    I want to kiss you!
    ",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:
    OH,NO!
    ",kase);
    70         else printf("Case #%d:
    %d
    ",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:
    %.6lf %.6lf
    ",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
    ",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
    ",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.
    ",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
    ",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
    ",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:
    ",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
    ",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
    ",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
    ",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
    ",ans[i]);
    45     }
    46     return 0;
    47 }
    Aguin

    下午百度爆0了。

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

    1001想贪。贪错了。

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

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

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

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

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

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

    暑假快来吧。

    23+1=24;

  • 相关阅读:
    应对高并发场景的redis加锁技巧
    Spring中@Transactional事务回滚(含实例具体解说,附源代码)
    计算机网络10--计算机网络体系结构简单介绍
    IIS身份验证的配置
    AMR音频文件格式分析
    IOS版本号被拒的经历
    两分钟读懂《成大事者不纠结》——读书笔记
    同一个TextView设置不同的颜色和大小
    似非而是的程序猿悖论---为什么救火比防火更加吃香?
    OS
  • 原文地址:https://www.cnblogs.com/Aguin/p/4526319.html
Copyright © 2011-2022 走看看