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) 编辑 收藏 举报