CSP游记
liuhaoyan0323 · · 生活·游记
前话:这篇文章作者文笔不好,是个初三弱省蒟蒻。
初赛
J组准考证:AH-J00336
S组准考证:AH-S00143
考点:依旧是二中
离大谱,初赛考交互了??考得一坨。
复赛
DAY -50
额,文化课作业怎么这么多,考前根本刷不到题。
DAY -7
没打你谷模拟赛,感觉质量不高,打的MX模拟赛。
- J 组:
- 除了
T4 没啥数据结构?? 前三题纯思维有意思,Rk:131 。
- 除了
- S 组:
- 没打,上课的,哈哈,发现除了
T1 ,其他不太可做。DAY
0 今年换了家酒店离合肥八中更近了,就是这装修真的是酒店?
晚上看你谷群里,发现都在背板子?
祝:PR++DAY
1 J组准考证:
AH-J00119
S组准考证:AH-S00076
【J组】开考前敲了下快读模板,发现旁边全是初一的,Orz。 解压包密码:```#Shang4Shan3Ruo6Shui4```,还有今年怎么双重压缩?
- 没打,上课的,哈哈,发现除了
开
开
开
- 容易发现当区间右端点固定时,左端点越后一定不劣,所以每个数往前模拟找异或值为
k 的区间,记录区间,找到不相交区间的数量。后来发现有点问题,遂放弃。 - 先找所有数字
k 出现的地方,将整个序列分成若干段,每段区间中我们往里面加隔板,整体思路是个dfs,但是这咋写?遂也放弃。 - 没事不会贪心,我还会
DP,预处理下前缀异或数组,这道题是很明显的区间动规板子啊!具体的设dp_{l,r} 表示a_{l},a_{l+1},\ldots,a_{r} 中能选区间的最大值。以下我们定义getval(l,r) 表示区间异或值。则很容易推导出转移方程:dp_{l,r}=max(dp_{l,r},getval(l,r),dp_{l,k}+dp_{k+1,r},getval(l,k)+getval(k+1,r)) 。初始化时,dp_{l,l}=getval(l,l) 。求解目标就是dp_{1,n} 。
时间复杂度:O(n^3)
S:
实际得分:
J:
S:
赛后没几天NOI网站卡bug,能通过申诉看到得分了?发现J的
而且S的 long long!这下真见祖宗了,搞不好就差这一点分就是二等了,哎。但是
总结
先放下我的考场代码:
::::info[J]
:::success[T1]
#include<bits/stdc++.h>
#define int long long
#define N (int)(15)
using namespace std;
int b[N];
inline void read(int &num);
inline void solve();
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void solve(){
string str;
cin>>str;
int slen=str.size();
for(int i=0;i<slen;++i){
char c=str[i];
if(c>='0'&&c<='9'){
++b[c-'0'];
}
}
for(int i=9;i>=0;--i){
while(b[i]){
cout<<i;
--b[i];
}
}
}
:::
:::success[T2]
#include<bits/stdc++.h>
#define N (int)(1e3+5)
using namespace std;
int a[N],G[N][N];
inline void read(int &num);
inline void solve();
inline bool cmp(const int &A,const int &B);
signed main(){
freopen("seat.in","r",stdin);
freopen("seat.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
int n,m;
read(n);
read(m);
for(int i=1;i<=n*m;++i){
read(a[i]);
}
int R=a[1],ct=0;
sort(a+1,a+1+n*m,cmp);
for(int j=1;j<=m;++j){
if(j&1){
for(int i=1;i<=n;++i){
++ct;
if(a[ct]==R){
printf("%d %d",j,i);
}
}
}else{
for(int i=n;i>=1;--i){
++ct;
if(a[ct]==R){
printf("%d %d",j,i);
}
}
}
}
}
inline bool cmp(const int &A,const int &B){
return A>B;
}
:::
:::success[T3]
#include<bits/stdc++.h>
#define int long long
#define N (int)(5e5+5)
using namespace std;
int a[N],ans,n,k;
int Xor[N];
//int dp[N][N];
int bck[N];
int fro[N];
inline void read(int &num);
inline void solve();
inline void solve2();
inline int getval(int l,int r);
signed main(){
freopen("xor.in","r",stdin);
freopen("xor.out","w",stdout);
int T=1;
while(T--){
solve2();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
/*
inline void solve(){
read(n);
read(k);
for(int i=1;i<=n;++i){
read(a[i]);
Xor[i]=Xor[i-1]^a[i];
}
for(int i=1;i<=n;++i){
dp[i][i]=getval(i,i);
}
for(int step=0;step<=n-1;++step){
for(int l=1;l<=n-step;++l){
int r=l+step;
dp[l][r]=max(dp[l][r],getval(l,r));
for(int k=l;k<r;++k){
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]);
dp[l][r]=max(dp[l][r],getval(l,k)+getval(k+1,r));
}
}
}
printf("%lld\n",dp[1][n]);
}
*/
inline void solve2(){
bool flag=true;
read(n);
read(k);
for(int i=1;i<=n;++i){
read(a[i]);
if(a[i]>1)flag=false;
Xor[i]=Xor[i-1]^a[i];
}
if(flag&&n>=(int)(1e4)){
if(k>1){
puts("0");
}else{
int ct_0=0,ct_1=0;
for(int i=1;i<=n;++i){
if(a[i]==0){
++ct_0;
}else if(a[i]==1){
++ct_1;
}
}
if(k==1){
printf("%lld\n",ct_1);
}else{
printf("%lld\n",ct_0);
}
}
}
fro[1]=getval(1,1);
for(int step=0;step<=n-1;++step){
int r=1+step;
for(int k=1;k<r;++k){
fro[r]=max(fro[r],fro[k]+getval(k+1,r));
}
}
bck[n]=getval(n,n);
for(int step=0;step<=n-1;++step){
int l=n-step;
for(int k=n;k>l;--k){
bck[l]=max(bck[l],bck[k]+getval(l,k-1));
}
}
int ans=0;
for(int i=1;i<=n;++i){
ans=max(ans,max(fro[i]+bck[i+1],fro[i-1]+bck[i]));
}
printf("%lld\n",ans);
}
inline int getval(int l,int r){
int t=Xor[r]^Xor[l-1];
return t==k?1ll:0ll;
}
:::
:::success[T4]
#include<bits/stdc++.h>
#define int long long
#define MOD 998244353
#define N (int)(5e3+5)
using namespace std;
int a[N],ans,n,k;
int sum[N];
int dp[N][N];
inline void read(int &num);
inline void solve();
inline void solve2();
inline int getval(int l,int r);
signed main(){
freopen("polygon.in","r",stdin);
freopen("polygon.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
read(n);
bool flag=true;
for(int i=1;i<=n;++i){
read(a[i]);
if(a[i]!=1)flag=false;
}
if(flag){
n-=2;
printf("%lld\n",(1+n)*n/2);
return ;
}
sort(a+1,a+1+n);
if(n<=3){
if(a[1]+a[2]>a[3]){
puts("1");
}else{
puts("0");
}
return ;
}
for(int i=1;i<=n;++i){
sum[i]=sum[i-1]+a[i];
dp[1][i]=(sum[i]>a[i]*2)?1:0;
}
for(int i=1;i<=n-2;++i){
dp[i][i+2]+=(sum[i+2]-sum[i-1]>a[i+2]*2)?1:0;
}
for(int step=2;step<=n-2;++step){
for(int l=1;l<=n-step;++l){
int r=l+step;
if(sum[r]-sum[l-1]>a[r]*2){
dp[l][r]++;
}
for(int k=l;k<r;++k){
dp[l][r]+=max(dp[l][k]+dp[k+1][r],dp[l][k-1]+dp[k][r]);
}
}
}
int ans=0;
for(int i=1;i<=n;++i){
ans=max(ans,dp[1][i]);
}
printf("%lld\n",ans%MOD);
}
::: ::::
::::info[S]
:::success[T1]
#include<bits/stdc++.h>
#define N (int)(40)
using namespace std;
int w[(int)(1e5+5)][4],n,T;
int dp[N][N][N][N];
int f1[(int)(1e5+5)];
int f2[205][205][205];
inline void read(int &num);
inline void solve();
inline int dfs(int i,int j,int k);
signed main(){
freopen("club.in","r",stdin);
freopen("club.out","w",stdout);
read(T);
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
bool flag1=true;
bool flag2=true;
read(n);
int ans=0;
memset(dp,0,sizeof(dp));
memset(w,0,sizeof(w));
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
for(int i=1;i<=n;++i){
for(int j=1;j<=3;++j){
read(w[i][j]);
}
if(w[i][2]!=0){
flag1=false;
}
if(w[i][3]!=0){
flag2=false;
flag1=false;
}
}
if(flag1){
for(int i=1;i<=n;++i){
f1[i]=w[i][1];
}
sort(f1+1,f1+1+n);
int ans=0;
for(int i=n;i>=n/2+1;--i){
ans+=f1[i];
}
printf("%d\n",ans);
return ;
}else if(flag2){
for(int i=1;i<=n;++i){
f2[i][0][1]=max(f2[i-1][0][1],w[i][2]);
f2[i][1][0]=max(f2[i-1][1][0],w[i][1]);
}
for(int i=1;i<=n;++i){
for(int a=0;a<=n;++a){
if(a>n/2)break;
for(int b=0;b<=n-a;++b){
if(b>n/2)break;
if(a>=1)f2[i][a][b]=max(f2[i][a][b],f2[i-1][a-1][b]+w[i][1]);
if(b>=1)f2[i][a][b]=max(f2[i][a][b],f2[i-1][a][b-1]+w[i][2]);
}
}
}
for(int x=1;x<=n;++x){
for(int y=1;y<=n;++y){
ans=max(ans,f2[n][x][y]);
}
}
printf("%d\n",ans);
return ;
}
for(int i=1;i<=n;++i){
dp[i][0][0][1]=max(dp[i-1][0][0][1],w[i][3]);
dp[i][0][1][0]=max(dp[i-1][0][1][0],w[i][2]);
dp[i][1][0][0]=max(dp[i-1][0][0][1],w[i][1]);
}
for(int i=1;i<=n;++i){
for(int a=0;a<=n;++a){
if(a>n/2)break;
for(int b=0;b<=n-a;++b){
if(b>n/2)break;
for(int c=0;c<=n-a-b;++c){
if(c>n/2)break;
if(a>=1)dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a-1][b][c]+w[i][1]);
if(b>=1)dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a][b-1][c]+w[i][2]);
if(c>=1)dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a][b][c-1]+w[i][3]);
}
}
}
}
for(int x=0;x<=n;++x){
for(int y=0;y<=n;++y){
for(int z=0;z<=n;++z){
ans=max(ans,dp[n][x][y][z]);
}
}
}
printf("%d\n",ans);
}
:::
:::success[T2]
#include<bits/stdc++.h>
#define N (int)(1e4+5)
#define M (int)(1e6+5)
using namespace std;
typedef struct Edge{
int to,next,w;
int from;
}Edge;
Edge e[M<<1];
int ans[N];
int cnt;
int n,m,k;
int fa[N];
inline void unionn(int x,int y);
inline void addEdge(int u,int v,int w);
inline void read(int &num);
inline int find(int x);
inline void solve();
inline void Kus();
inline bool cmp(const Edge &A,const Edge &B);
signed main(){
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
read(n);
read(m);
read(k);
for(int i=1;i<=n;++i)fa[i]=i;
for(int i=1;i<=m;++i){
int x,y,z;
read(x);
read(y);
read(z);
addEdge(x,y,z);
addEdge(y,x,z);
}
Kus();
sort(ans+1,ans+1+ans[0]);
int cost=0;
for(int i=1;i<=ans[0]-k;++i){
cost+=ans[i];
}
printf("%d\n",cost);
}
inline void addEdge(int u,int v,int w){
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].from=u;
}
inline void unionn(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx!=fy)fa[fx]=fy;
}
inline int find(int x){
return (fa[x]==x)?x:fa[x]=find(fa[x]);
}
inline void Kus(){
sort(e+1,e+1+cnt,cmp);
for(int i=1;i<=cnt;++i){
int u=e[i].from;
int v=e[i].to;
if(find(v)!=find(u)){
unionn(u,v);
ans[++ans[0]]=e[i].w;
if(ans[0]==n-1){
return ;
}
}else{
continue;
}
}
}
inline bool cmp(const Edge &A,const Edge &B){
return A.w<B.w;
}
:::
:::success[T3]
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int &num);
inline void solve();
signed main(){
//ios::sync_with_stdio(false);
//cin.tie(0);cout.tie(0);
freopen("replace.in","r",stdin);
freopen("replace.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
int n,m;
read(n);
read(m);
for(int i=1;i<=m;++i){
puts("0");
}
}
:::
:::success[T4]
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int &num);
inline void solve();
signed main(){
freopen("employ.in","r",stdin);
freopen("employ.out","w",stdout);
int T=1;
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
printf("0\n");
}
/*
#include<bits/stdc++.h>
#define N (int)(25)
using namespace std;
int w[N][4],n,T;
int dp[N][N][N][N];
inline void read(int &num);
inline void solve();
inline int dfs(int i,int j,int k);
signed main(){
//::sync_with_stdio(false);
//cin.tie(0);cout.tie(0);
freopen("club3.in","r",stdin);
freopen("club.out","w",stdout);
read(T);
while(T--){
solve();
}
return 0;
}
inline void read(int &num){
int x=0,f=1;
char ch=getchar();
while(ch>'9'||ch<'0'){
f=(ch=='-')?-1:1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
num=x*f;
}
inline void solve(){
read(n);
int ans=0;
memset(dp,0,sizeof(dp));
memset(w,0,sizeof(w));
for(int i=1;i<=n;++i){
for(int j=1;j<=3;++j){
read(w[i][j]);
}
}
dp[0][0][1]=max(dp[i-1][0][0][1],w[i][3]);
dp[0][1][0]=max(dp[i-1][0][1][0],w[i][2]);
dp[1][0][0]=max(dp[i-1][0][0][1],w[i][1]);
for(int i=1;i<=n;++i){
for(int a=0;a<n;++a){
if(a>=n/2)break;
for(int b=0;b<n-a;++b){
if(b>=n/2)break;
for(int c=0;c<n-a-b;++c){
if(c>=n/2)break;
dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a-1][b][c]+w[i][1]);
dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a][b-1][c]+w[i][2]);
dp[i][a][b][c]=max(dp[i][a][b][c],dp[i-1][a][b][c-1]+w[i][3]);
}
}
}
}
for(int x=0;x<=n;++x){
for(int y=0;y<=n;++y){
for(int z=0;z<=n;++z){
ans=max(ans,dp[n][x][y][z]);
}
}
}
printf("%d\n",ans);
}
*/
::: ::::
太荒谬了这次,完全没发挥好,丢了非常多分,尤其是JT3、ST1、ST2放去年我是能写出来的,但是学的越多反而被带偏到别的错解上去了,
不管怎么说,马上中考了,也该退役了。考不上重高,估计高中也不会再打CSP了。
纪念我的OI生涯。
于马鞍山