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 阅读(161) 评论(0) 收藏 举报
浙公网安备 33010602011771号