hw2 Task2 改龙哥的read速度极快

不能再快了的read

credit : http://zonelikewonderland.tk/#/user/blog/details/481e27461fe6602e138b154ca8379587

const int buffsize=1e5;
char buf[buffsize],*pp=buf-1;
int readsize=0,freadsize=0;
inline void readinit(){
    fread(buf+(((readsize+buffsize-1)%buffsize>=buffsize/2-1)?0:buffsize/2),1,buffsize/2,stdin);
    freadsize+=buffsize/2;
}
inline int read(){
    if(readsize+buffsize/2>freadsize)readinit();
    while((++readsize,*++pp)<'-')if(pp==buf+buffsize-1)pp=buf-1;
    register int x=*pp&15;
    if(pp==buf+buffsize-1)pp=buf-1;
    while((++readsize,*++pp)>'-'){
        x=x*10+(*pp&15);
        if(pp==buf+buffsize-1)pp=buf-1;
    }
    if(pp==buf+buffsize-1)pp=buf-1;
    return x;
}

比我那个快。

P5003 跳舞的线 - 乱拐弯

这道DP有点精妙~,大概最优子结构的转移函数写法长这样:

$$f_{max,i,j,0}=max(f_{max,i,j-1,0},f_{max,i,j-1,1}+1)$$

$$f_{max,i,j,1}=max(f_{max,i-1,j,0}+1,f_{max,i-1,j,1})$$

$$f_{min,i,j,0}=max(f_{min,i,j-1,0},f_{min,i,j-1,1}+1)$$

$$f_{min,i,j,1}=max(f_{min,i-1,j,0}+1,f_{min,i-1,j,1})$$

为了防止在起始点拐弯,最好的办法是-1越界。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define re register int 
#define LL long long 
using namespace std;
int n,m;
int f[1010][1010][2],g[1010][1010][2];
char a[1010][1010];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	cin>>a[i][j];
	memset(f,63,sizeof(f));
	if(a[1][1]=='#'){cout<<-1;return 0;}
	g[1][1][0]=g[1][1][1]=0;
	f[1][1][0]=f[1][1][1]=0;//0 left 1 down
	for(int i=1;i<=m;i++)g[0][i][1]=g[0][i][0]=-2147483647;
	for(int i=1;i<=n;i++)g[i][0][1]=g[i][0][0]=-2147483647;
	for(int i=1;i<=n;i++)
	for(int j=1;j<=m;j++)
	if(a[i][j]=='o')
	{
		if(i==1&&j==1)continue;
		g[i][j][1]=max(g[i-1][j][1],g[i][j-1][0]+1);
		f[i][j][1]=min(f[i-1][j][1],f[i][j-1][0]+1);
		g[i][j][0]=max(g[i-1][j][1]+1,g[i][j-1][0]);
		f[i][j][0]=min(f[i-1][j][1]+1,f[i][j-1][0]);
	}
	int Ansa=max(g[n][m][1],g[n][m][0]);
	int Ansb=min(f[n][m][1],f[n][m][0]);
	if(Ansb>n+m-2)cout<<-1<<endl;
	else cout<<Ansa-1<<" "<<Ansb<<endl;
	return 0;
}

现行最好用的全自动读入

getchar+fread+位运算存入

char ss[1<<17],*A=ss,*B=ss;
inline char gc(){if(A==B){B=(A=ss)+fread(ss,1,1<<17,stdin);if(A==B)return EOF;}return *A++;}
template<class T>inline void read(T&x){
    char c;re y=1;while(c=gc(),c<48||57<c)if(c=='-')y=-1;x=c^48;
    while(c=gc(),47<c&&c<58)x=(x<<1)+(x<<3)+(c^48);x*=y;
}

用法 in BNF

<any type> read(a);

CF1189B Number Circle

水题

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>

using namespace std;
const int inf = 1e5 + 5;
int n, s[inf],cnt;
deque<int> q;
int main()
{
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)scanf("%d", &s[i]);
	sort(s, s + n + 1);
    for(int i=n;i>=1;i--)
    {
        if(cnt)q.push_front(s[i]),cnt^=1;
        else q.push_back(s[i]),cnt^=1;
    }
    cnt=0;
    deque<int>::iterator it;
    for(it=q.begin();it!=q.end();it++)
    s[++cnt]= *it ;
    for(int i=2;i<=n-1;i++)
    if(s[i-1]+s[i+1]<=s[i]){cout<<"NO";return 0;}
    if(s[n-1]+s[1]<=s[n]){cout<<"NO";return 0;}
    cout<<"YES"<<endl;
	for (int i = 1; i <= n; i++)cout << s[i] << " ";
	return 0;
}