AtCoder Regular Contest 082
我都出了F了……结果并没有出E……atcoder让我差4分上橙是啥意思啊……
C - Together
题意:把每个数加1或减1或不变求最大众数。
#include<cstdio> #include<algorithm> using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } int t[110000],n,a; int main(){ n=read(); for (int i=1;i<=n;i++){ a=read(); t[a]++;t[a+1]++;t[a+2]++; } a=0; for (int i=0;i<=100100;i++) if (t[i]>a) a=t[i]; printf("%d\n",a); }
D - Derangement
题意:求把一个排列变成错排的最少操作数,操作是交换相邻俩位置。
#include<cstdio> #include<algorithm> using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } int t[110000],n,a=0; int main(){ n=read(); for (int i=1;i<=n;i++){ t[i]=read(); } for (int i=1;i<n;i++) if (t[i]==i) a++,swap(t[i],t[i+1]); if (t[n]==n) a++; printf("%d\n",a); }
E - ConvexScore
题意:一个凸包的价值为其$2^{内部点数}$求所以凸包价值之和。
题解:窝好蠢啊,居然没想到这个……$2^{内部点数}$其实就是把每个集合都统计了一遍,这样就只剩下直线的集合没被统计了。
代码还没写(不想补题)
F - Sandglass
题意:一沙漏初始上边那个为a,下边为X-a,每秒上边向下边掉一个,一些时刻会把沙漏倒过来,问某时刻的状态。
题解:反正就是个分段函数,而且只有3段。
#include<cstdio> #include<algorithm> #define MN 110000 #define int long long using namespace std; int read_p,read_ca; inline int read(){ read_p=0;read_ca=getchar(); while(read_ca<'0'||read_ca>'9') read_ca=getchar(); while(read_ca>='0'&&read_ca<='9') read_p=read_p*10+read_ca-48,read_ca=getchar(); return read_p; } int n,m,X,K,T[MN],la=0,Q,t,a,l[MN],r[MN],L[MN],R[MN]; signed main(){ X=read(); K=read(); l[0]=0;L[0]=0;r[0]=X;R[0]=X; for (int i=1;i<=K;i++){ a=read(); T[i]=a; l[i]=l[i-1];r[i]=r[i-1]; L[i]=L[i-1]-(a-la); R[i]=R[i-1]-(a-la); if (L[i]<=R[i]) if (R[i]<=0){ l[i]=0;L[i]=X;r[i]=0;R[i]=X; }else{ if (L[i]<0) l[i]-=L[i], L[i]=0; L[i]=X-L[i];R[i]=X-R[i]; }else if (L[i]<=0){ l[i]=0;L[i]=X;r[i]=0;R[i]=X; }else{ if (R[i]<0) r[i]+=R[i], R[i]=0; L[i]=X-L[i];R[i]=X-R[i]; } la=a; } /*for (int i=0;i<=K;i++) printf("%d %d %d %d %d\n",i,l[i],r[i],L[i],R[i]);*/ Q=read(); for (int i=1;i<=Q;i++){ t=read();a=read(); int _l=0,_r=K,mid; while (_l<_r){ if (T[mid=_l+_r+1>>1]<=t) _l=mid;else _r=mid-1; } t-=T[_l]; if (a<=l[_l]) a=L[_l];else if (a>=r[_l]) a=R[_l];else if (L[_l]==R[_l]) a=L[_l];else if (L[_l]<R[_l]) a=L[_l]+(a-l[_l]);else a=L[_l]-(a-l[_l]); a-=t; if (a<0) a=0; if (_l&1) a=X-a; printf("%lld\n",a); } }