11.11~11.12解题报告

Day1

T1

【问题描述】

【题解】

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cmath>
6 #include<ctime>
7 #include<algorithm>
8 using namespace std;
9 #define FILE "string"
10 #define MAXN 200010
11 char ch[MAXN];
12 int n,last[MAXN],vis[MAXN];
13 int main()
14 {
15     freopen(FILE".in","r",stdin);
16     freopen(FILE".out","w",stdout);
17     scanf("%s",ch+1);  n=strlen(ch+1);
18     for(int i=2;i<=n;i++)  last[i]=i-1;
19     for(int i=1;i<=n;i++)
20         if(ch[i]==ch[last[i]])
21         {
22             vis[i]=1;vis[last[i]]=1;
23             last[i+1]=last[last[i]];
24         }
25     for(int i=1;i<=n;i++)  if(!vis[i])  printf("%c",ch[i]);
26     printf("\n");
27     return 0;
28 }

T2

【问题描述】

X操作：x=x+y

Y操作：y=x+y

【题解】

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cstdlib>
5 #include<ctime>
6 #include<cmath>
7 #include<algorithm>
8 using namespace std;
9 #define FILE "plus"
10 int n,len,minn(1000000000);
11 char q[1000010],ans[1000010];
13 {
14     int x=0,f=1;  char ch=getchar();
15     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
16     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
17     return x*f;
18 }
19 int dfs(int x,int y)
20 {
21     if(x<=0||y<=0)  return 0;
22     if(x==1&&y==1)  return 1;
23     if(x==y)  return 0;
24     if(x>y)  {q[++len]='X';  return dfs(x-y,y);}
25     if(x<y)  {q[++len]='Y';  return dfs(x,y-x);}
26 }
27 bool check()
28 {
29     for(int i=minn;i;i--)
30     {
31         if(q[i]>ans[i])  return 0;
32         if(q[i]<ans[i])  return 1;
33     }
34     return 0;
35 }
36 int main()
37 {
38     freopen(FILE".in","r",stdin);
39     freopen(FILE".out","w",stdout);
40     int __size__=20<<20;//20MB
41     char *__p__=(char*)malloc(__size__)+__size__;
42     __asm__("movl %0, %%esp\n"::"r"(__p__));
44     for(int i=n-1;i>=1;i--)
45     {
46         if(dfs(n,i))
47         {
48             if(len<minn)
49             {
50                 minn=len;
51                 for(int j=1;j<=len;j++)  ans[j]=q[j];
52             }
53             if(len==minn&&check())  for(int j=1;j<=len;j++)  ans[j]=q[j];
54         }
55         len=0;
56     }
57     for(int i=minn;i;i--)  printf("%c",ans[i]);
58     printf("\n");
59     return 0;
60 }

T3

Day2

T1

【问题描述】

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

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

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

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

【题解】

T1就搞了一个可持久化栈，excited

 1 #include<iostream>
2 #include<cstdlib>
3 #include<cstdio>
4 #include<cstring>
5 #include<ctime>
6 #include<cmath>
7 #include<algorithm>
8 using namespace std;
9 #define FILE "array"
10 #define MAXN 80010
11 typedef long long ll;
12 ll n,node,a[MAXN],fa[MAXN];
14     ll x=0,f=1;  char ch=getchar();
15     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
16     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
17     return x*f;
18 }
19 int main(){
20     freopen(FILE".in","r",stdin);
21     freopen(FILE".out","w",stdout);
23     for(ll i=1;i<=n;i++){
24         char ch;  scanf("%c ",&ch);
25         if(ch=='a')  {ll v=read();  a[i]=v;  fa[i]=node;  node=i;}
26         else if(ch=='s') {node=fa[node];  a[i]=a[node];  fa[i]=fa[node];  node=i;}
27         else  {ll v=read();  node=v-1;  a[i]=a[node];  fa[i]=fa[node];  node=i;}
28     }
29     for(ll i=1;i<=n;i++)  printf("%lld\n",a[i]);
30     return 0;
31 }

T2

【问题描述】

【题解】

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<cmath>
6 #include<ctime>
7 #include<algorithm>
8 using namespace std;
9 #define FILE "blossom"
10 int n,m,l,r;
11 long long ans;
12 int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
14     int x=0,f=1;  char ch=getchar();
15     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
16     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
17     return x*f;
18 }
19 bool check(int x,int y){
20     if(gcd(x,y)!=1)  return 0;
21     int v=x*x+y*y;
22     if(v>=l*l&&v<=r*r)  return 1;
23     return 0;
24 }
25 int main(){
26     freopen(FILE".in","r",stdin);
27     freopen(FILE".out","w",stdout);
29     for(int i=1;i<=n;i++)
30         for(int j=1;j<=m;j++)
31             if(check(i,j))  ans+=(n-i+1)*(m-j+1)*2;
32     if(l<=1)  ans+=(n+1)*m+(m+1)*n;
33     printf("%lld\n",ans);
34     return 0;
35 }

T3

【问题描述】

【题解】

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<ctime>
6 #include<cmath>
7 #include<algorithm>
8 using namespace std;
9 #define FILE "chen"
10 #define up(i,j,n) for(int i=j;i<=n;i++)
11 typedef long long ll;
12 const int MAXN=1e6+5;
13 const int oo=0x3f3f3f3f;
14 struct node{ll delta,v,maxx;}tr[MAXN<<2];
15 ll n,top,ans,a[MAXN],num[MAXN],Num[MAXN],K[MAXN];
16 namespace INIT{
17     char buf[1<<15],*fs,*ft;
18     inline char getc() {return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;}
20         int x=0,f=1;  char ch=getc();
21         while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getc();}
22         while(isdigit(ch))  {x=x*10+ch-'0';  ch=getc();}
23         return x*f;
24     }
25 }using namespace INIT;
26 namespace Segment_Tree{
27     void pushdown(int p){
28         int delta=tr[p].delta; tr[p].delta=0;
29         if(delta==0)  return;
30         tr[p<<1].maxx+=delta;  tr[p<<1|1].maxx+=delta;
31         tr[p<<1].v+=delta;     tr[p<<1|1].v+=delta;
32         tr[p<<1].delta+=delta; tr[p<<1|1].delta+=delta;
33     }
34     void relord(int p){
35         tr[p].v=min(tr[p<<1].v,tr[p<<1|1].v);
36         tr[p].maxx=max(tr[p<<1].maxx,tr[p<<1|1].maxx);
37     }
38     int get(int p,int l,int r){
39         if(l!=r) pushdown(p);
40         if(tr[p].maxx==0)  return l;
41         if(l==r&&tr[p].v==0)  return l;
42         if(tr[p].v>0)  return oo;
43         int mid=(l+r)>>1;
44         return min(get(p<<1,l,mid),get(p<<1|1,mid+1,r));
45     }
46     void updata(int p,int l,int r,int x,int y,int v){
47         if(l!=r) pushdown(p);
48         if(x>r||y<l)  return;
49         if(x<=l&&y>=r){tr[p].maxx+=v; tr[p].v+=v; tr[p].delta+=v; return;}
50         int mid=(l+r)>>1;
51         updata(p<<1,l,mid,x,y,v);
52         updata(p<<1|1,mid+1,r,x,y,v);
53         relord(p);
54     }
55     void res(int p,int l,int r){
56         if(l==r){K[l]=tr[p].v; return;}
57         pushdown(p);
58         int mid=(l+r)>>1;
59         res(p<<1,l,mid);
60         res(p<<1|1,mid+1,r);
61         relord(p);
62     }
63 }using namespace Segment_Tree;
64 int find(int x){
65     int l=1,r=top;
66     while(l+1<r){
67         int mid=(l+r)>>1;
68         if(num[mid]>x)  r=mid;
69         else l=mid;
70     }
71     if(num[l]==x)  return l;
72     else return r;
73 }
74 void init(){
77     sort(num+1,num+n+1);
78     up(i,1,n)  if(num[i]!=num[i-1])  Num[++top]=num[i];
79     up(i,1,top)  num[i]=Num[i];
80     up(i,1,n)  a[i]=find(a[i]);
81 }
82 void solve(){
83     up(i,1,n){
84         int pos=get(1,1,n);
85         updata(1,1,n,1,a[i],1);
86         if(a[i]+1<=pos-1)  updata(1,1,n,a[i]+1,pos-1,-1);
87     }
88     int pos=get(1,1,n);
89     res(1,1,n);
90     up(i,1,pos) ans-=K[i]*(num[i]-num[i-1]);
91     printf("%lld\n",ans);
92 }
93 int main(){
94     freopen(FILE".in","r",stdin);
95     freopen(FILE".out","w",stdout);
96     init();
97     solve();
98     return 0;
99 }

写完这道题，忽然有一种代码进化的感觉，以前写的代码都不能看了

posted @ 2016-11-13 19:05  chty  阅读(221)  评论(0编辑  收藏  举报