ACM坑中人. 蒟蒻爬虫

supersumax

noip的坑中人

1112测试教你做人

T1

现在有一个数列,最初包含0个数。现在要对数列操作n次,操作有3类。

1) a k,在数列的最后插入一个整数k

2) s 将最近插入的数删除。

3) t k 将数列恢复第k次操作前的状态

 

这道题有个高端的名字叫做可持久化%%%

就是任意时候都可以回退到原来的版本;

用树来写就好了,每加入一个元素相当于增加一条边,如果恢复到原来的状态就是回到原来的那个节点上

HERE IS THE CODE:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1000010;
int stack[N],last[N];
struct edge{int x;int y;}e[N];
int top=0;
int main()
{
    freopen("array.in","r",stdin);
    freopen("array.out","w",stdout);
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        char ch;
        scanf("%c",&ch);
        while(ch!='a'&&ch!='s'&&ch!='t')  ch=getchar();
        if(ch=='a')
        {
            int d;
            scanf("%d",&d);stack[++top]=d;
            e[i].x=e[i-1].y;e[i].y=top;
            last[top]=e[i-1].y;
        }
        if(ch=='s')
        {
            e[i].x=e[i-1].y;e[i].y=last[e[i-1].y];
        }
        if(ch=='t')
        {
            int d;
            scanf("%d",&d);
            e[i].x=e[i-1].y;e[i].y=e[d].x;
        }
        if(stack[e[i].y]==0)
        printf("%d\n",-1);
        else
        printf("%d\n",stack[e[i].y]);
    }
    return 0;
}

T2:
TM居然是一道数学题。(吐血)
好吧其实我根本没有看;;;
考场上直接想的是dfs
但是讲完之后就知道一百的解法居然离我这么近。。。
其实就是只特判0,0点到其他点的距离,判断方法就可以了
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long  w,h,l1,l2;
inline long long  gcd(long long  x,long long  y)   
{
        long long  i,j;
        if(x==0) return y;
        if(y==0) return x;
        for(i=0;0==(x&1);++i)x>>=1;   
        for(j=0;0==(y&1);++j)y>>=1;   
        if(j<i) i=j;
        while(1){
                if(x<y)x^=y,y^=x,x^=y;   
                if(0==(x-=y)) return y<<i;  
                while(0==(x&1))x>>=1; 
        }
}
void init()
{
    cin>>w>>h>>l1>>l2;
}
void work()
{
    long long  sum=0;
    for(long long  i=0;i<=w;i++)
        for(long long  j=0;j<=h;j++)
        {
            if(i*i+j*j<=l2*l2&&i*i+j*j>=l1*l1)
                if(gcd(i,j)==1)
                {
                    if(i==0)  {if(j<2)     sum+=w*h;}
                    else if(j==0)   {if(i<2)   sum+=w*h;}
                    else  {
                        sum+=(w-i+1)*(h-j+1)*2;
                    }
                }
        }
    //sum*=2;
    cout<<sum<<endl;
}
int   main()
{
    freopen("blossom.in","r",stdin);
    freopen("blossom.out","w",stdout);
    init();
    work();
    return 0;
}

 

  

posted on 2016-11-13 19:00  supersumax  阅读(156)  评论(0编辑  收藏  举报

导航