南浦电商网站建设,公司网站建设劳伦,wordpress登陆才可以看到,网络营销推广为什么效果不好感觉现在的xcpc#xff0c;风格越来越像CF#xff0c;不是很喜欢#xff0c;还是更喜欢多点算法题的比赛
VP银了#xff0c;VP银也是银
感觉省赛都是思维题#xff0c;几乎没有算法题#xff0c;感觉像打了场大型的CF
B题很简单没开出来#xff0c;一直搞到最后…感觉现在的xcpc风格越来越像CF不是很喜欢还是更喜欢多点算法题的比赛
VP银了VP银也是银
感觉省赛都是思维题几乎没有算法题感觉像打了场大型的CF
B题很简单没开出来一直搞到最后后来发现原来是卡常了....换种写法就过了
队名是偶像yinwuxx杭电一队著名选手QwQ
话说好像很快就要篮球被了我去什么都不会了一直在写CF的S b题
怎么办感觉真的要没了
m d别到时候区域赛名额没搞出来篮球被没奖直接亏损最大化了 Dashboard - 2023 CCPC Henan Provincial Collegiate Programming Contest - Codeforces
简略写一下思路吧
A 思路签到一开始还想字符串哈希判回文结果只需要n^2判几次就好了
Code队友写的
#includebits/stdc.h
using namespace std;
const int mxv2e59;
#define int long long
char s[mxv];
mapchar,int mp;
void solve(){cins,mp.clear();int lenstrlen(s)-1;if(len0){coutNaN\n;return;}int flag1;for(int i0;ilen;i){if(s[len]s[i]){flag1;for(int ji,klen;jk;j,k--)if(s[j]!s[k]){flag0;break;}if(flag1){coutHE\n;return;}}if(mp[s[i]]0) mp[s[i]]1;else break;}coutNaN\n;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cint;while(t--) solve();return 0;
} B: 思路
一开始的想法是二分K然后在check函数里面把所有段的RMQ搞出来如果存在这一段的最小值小于前一段的最大值就是False否则就是True
然后T14了....因为线段树的RMQ复杂度多了个log....
然后就换了ST表然后第二维开成33MLE了....
事实上N是1e6的数据范围开成22就够了
注意到不需要二分直接枚举复杂度也是够的于是换成了枚举
然后是莫名其妙的RE到最后也是RE也不知道为什么
事实上check函数里面不把RMQ扔进vector里面直接扫一遍记录上一次的最大值然后判就过了被卡了好几小时....
Code
#include bits/stdc.h//#define int long longusing namespace std;const int mxn1e610;
const int mxe1e610;
const int mxv1e310;
const int mod1e97;int N;
int a[mxn];
int F_min[mxn][22],F_mx[mxn][22];
int lg[mxn];void ST_init(){for(int j1;j22;j){for(int i1;i(1(j-1))N;i){F_min[i][j]min(F_min[i][j-1],F_min[i(1(j-1))][j-1]);F_mx[i][j]max(F_mx[i][j-1],F_mx[i(1(j-1))][j-1]);}}
}
void L_init(){lg[1]0;for(int i2;imxn;i) lg[i]lg[i1]1;
}
int query_mi(int l,int r){int klg[r-l1]; return min(F_min[l][k],F_min[r-(1k)1][k]);
}
int query_mx(int l,int r){int klg[r-l1]; return max(F_mx[l][k],F_mx[r-(1k)1][k]);
}
void solve(){cinN;L_init();for(int i1;iN;i){cina[i];F_min[i][0]F_mx[i][0]a[i];}if(is_sorted(a1,a1N)){coutN\n;return;}ST_init();int ans0;for(int k1;kN;k){int last0,ok1;for(int l1;lN;lk){int rmin(lk-1,N);if(query_mi(l,r)last){ok0;break;}lastquery_mx(l,r);}ansok;}coutans\n;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __1;//cin__;while(__--)solve();return 0;
} C 思路
猜了个结论就过了很奇怪这种题还是第一次碰到
#include bits/stdc.h//#define int long longusing namespace std;const int mxn1e610;
const int mxe1e610;
const int mxv1e310;
const int mod1e97;string s1;void solve(){cins1;string s2s1.substr(0,1000);s1.erase(0,1000);if(s1.find(s2)!-1) coutNo\n;else coutYes\n;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __1;//cin__;while(__--)solve();return 0;
} D题图论难题会不了一点 E 思路
一开始队友写的DFS然后T了换成DP然后MLE了
是个很篮球杯风格的DP但是开了三维MLE
换成vector也MLE关掉define也是MLE
这件事告诉我们正式比赛一般是不卡这种东西的
我滚了一下数组就AC了
Code
#includebits/stdc.h
using namespace std;
const int mxv5e29,mxn1e33;
const int Inf0x3f3f3f3f;
//#define int long long
int n,m,x;
char s[mxv][mxv];
int dx[]{0,0,1};
int dy[]{0,1,0};
int dp[2][mxv][mxn];
void solve(){cinnmx;// vector vector vectorint dp(2,vector vectorint (m1,vectorint(x1,-Inf)));//dp(i,j,k):到达(i,j)已经修改了k次的最大价值for(int i0;i1;i){for(int j0;jm;j){for(int k0;kx;k){dp[i][j][k]-Inf;}}}for(int i1;in;i) cins[i]1;if(s[1][1]1) dp[11][1][0]1;else if(s[1][1]0) dp[11][1][0]0;else dp[1][1][1]1,dp[11][1][0]0;for(int i1;in;i){for(int j1;jm;j){for(int k0;kx;k){if(i1n){dp[(i1)1][j][k]max(dp[(i1)1][j][k],dp[i1][j][k]);if(s[i1][j]1)dp[(i1)1][j][k]max(dp[i1][j][k]1,dp[(i1)1][j][k]); if(s[i1][j]?k-10)dp[(i1)1][j][k]max(dp[i1][j][k-1]1,dp[(i1)1][j][k]);}if(j1m){dp[i1][j1][k]max(dp[i1][j1][k],dp[i1][j][k]);if(s[i][j1]1)dp[i1][j1][k]max(dp[i1][j][k]1,dp[i1][j1][k]); if(s[i][j1]?k-10)dp[i1][j1][k]max(dp[i1][j][k-1]1,dp[i1][j1][k]);}}}}int ans0;for(int i0;ix;i) ansmax(ans,dp[n1][m][i]);coutans\n;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t1;cint;while(t--) solve();return 0;
} F 思路
首先显然是要排序然后选K个元素对应区间长度为K所以就是滑动窗口滑过去就可以了维护一下RMQ统计一下最大的min*max
Code
#include bits/stdc.h#define int long longusing namespace std;const int mxn5e510;
const int mxe5e510;
const int mxv1e310;
const int mod1e97;struct ty{int mi;
}tree[mxe2];int N,K;
int a[mxn],b[mxn];void pushup(int rt){tree[rt].mimin(tree[rt1].mi,tree[rt1|1].mi);
}
int query(int rt,int l,int r,int x,int y){if(xlry){return tree[rt].mi;}int midlr1;int res1e18;if(xmid) resmin(res,query(rt1,l,mid,x,y));if(ymid) resmin(res,query(rt1|1,mid1,r,x,y));return res;
}
void build(int rt,int l,int r){if(lr){tree[rt].mib[l];return;}int midlr1;build(rt1,l,mid);build(rt1|1,mid1,r);pushup(rt);
}
void solve(){cinNK;for(int i1;iN;i) cina[i];sort(a1,a1N);for(int i1;iN;i) b[i]a[i]-a[i-1];build(1,2,N);//for(int i1;iN;i) couta[i] \n[iN];//for(int i2;iN;i) coutb[i] \n[iN];int ans1e18;for(int l1;lK-1N;l){int rlK-1;int mxa[r]-a[l];int miquery(1,2,N,l1,r);ansmin(ans,mi*mx);}coutans\n;
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int __1;//cin__;while(__--)solve();return 0;
} G题大模拟不想写 H 思路
需要对N和2*k进行分类讨论
如果N/k0.5那么最小值一定是0最大值就是0.5,0.5.....这样子放答案就是N/0.5因为最后几个一定是0
否则最小值就是0.49,0.49这样子放答案就是最后剩下的数的上取整最大值就是0.5,0.5这样放答案就是K-1个1最后一个数上取整
Code
#includebits/stdc.h
//#define int long long
#define rep(i,a,n) for(int ia; in ;i)
#define pii pairint,int
#define pb push_back
#define fi first
#define sc second
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const double eps0.5, exs0.49999999999999999;
void solve(){int n, k;cinnk;double cn-(k-1)*exs;//coutc\n;if(c0.5){int ans2int(n/0.5);cout0 ans2\n;}else{int ans10, ans20;ans1int(c0.5);double dn-(k-1)*0.5;ans2int(d0.5)k-1;coutans1 ans2\n;}
}
signed main(){ios;int t1;cint;while(t--){solve();}return 0;
}
I: 直接看这个【容斥扫描线】2023CCPC河南省赛 I 数正方形_lamentropetion的博客-CSDN博客 JL都是神秘题不会QwQ