第 👋 - 👆 周
一、睿抗训练(武汉工程大学202GPLT选拔赛)
比赛链接 :🔗(我是链接)
签到题就不赘述了
C-L1-3 Pokémon_武汉工程大学2020GPLT选拔赛(nowcoder.com)
有点卡细节,闪光卡的概率为1%,那么非闪光卡的概率则为99%
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*------------------------------------------------------------------*/
signed main(){
double a[10];
for(int i=0;i<7;i++){
string s;
cin>>s;
s.pop_back();
a[i]=stod(s);
}
int c,f;
cin>>c>>f;
if(f) cout<<fixed<<setprecision(2)<<a[c]*0.01<<'%'<<endl;
else cout<<fixed<<setprecision(2)<<a[c]*0.99<<'%'<<endl;
}
F-L1-6 分鸽子_武汉工程大学2020GPLT选拔赛(nowcoder.com)
思路:一眼二分
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------*/
int a[100005],n,m;
bool check(int x){
if(x==0) return 0;
int num=0;
for(int i = 1 ; i <=n ; i++) num+=a[i]/x;
return num>=m;
}
signed main(){
cin>>n>>m;
for(int i = 1 ; i <= n ; i++) cin>>a[i];
int l=0,r=1e18,ans=0;
while(l<=r){
int mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
cout<<ans<<endl;
}
G-L1-7 拼接梯子_武汉工程大学2020GPLT选拔赛(nowcoder.com)
思路:位运算题,把要拼接的梯子按位分解,输出最高位,如果是奇数则无法分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
signed main(){
ll n,m;
cin>>n>>m;
if(m % 2 == 1) cout<<"No";
else {
string s;
while(m){
if(m % 2 == 1) s='1'+s;
else s='0'+s;
m/=2;
}
//cout<<s<<endl;
int len=s.size();
len--;
ll a=((ll)1<<len);
if(len<=n){
cout<<"Yes"<<endl;
cout<<a;
}else cout<<"No";
}
}
H-L1-8 幻想乡炼金学_武汉工程大学2020GPLT选拔赛(nowcoder.com)
思路:恶心的字符串模拟,按照题意模拟即可,比较麻烦
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
vector<string> a[166];
int b[166];
signed main(){
string s,c,h;
getline(cin,s);
bool f = 0;
int cnt = 0;
for(int i = 0 ; i < s.size() ; i++){
if(s[i] == ' ') continue;
if(!islower(s[i]) and c.size()){
a[cnt].push_back(c);
if(!f) cnt++;
c.clear();
}
if(isupper(s[i])) c = s[i];
else if(islower(s[i])) c += s[i];
else if(s[i] == '(') f = 1;
else if(s[i] == ')') f = 0 , cnt++;
else if(s[i] == '{'){
int num=0;
i++;
while(s[i] != '}'){
if(s[i] == ' '){
i++;
continue;
}
else num = num * 10 + s[i] - '0';
i++;
}
b[cnt-1] = num;
}
}
if(c.size()) a[cnt++].push_back(c);
for(int i = 0 ; i < cnt ; i++) if(!b[i]) b[i] = 1;
for(int i = 0 ; i < cnt ; i++){
for(int j = 0 ; j < a[i].size() ; j++){
for(int k = 0 ; k < b[i] ; k++){
cout<<a[i][j];
}
}
}
}
I-L2-1 特殊的沉重球_武汉工程大学2020GPLT选拔赛(nowcoder.com)
思路:dfs,要注意剪枝
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
int n,w,ans;
int c[25],a[25];
void dfs(int k , int res){
if(res >= ans) return;
if(k >= n){
ans = min(ans , res);
return;
}
for(int i = 0 ; i <= res ; i++){
if(a[i] + c[k] <= w){
a[i] += c[k];
dfs(k+1 , res);
a[i] -= c[k];
}
}
a[res+1] += c[k];
dfs(k+1 , res+1);
a[res+1] -= c[k];
}
signed main(){
ans=INT_MAX;
cin >> n >> w;
for(int i = 0 ;i < n ; i++) cin >> c[i];
sort(c , c + n , greater<int>());
dfs(0,0);
cout << ans + 1 << endl;
}
二、SMU Summer 2024 Team Round 1
Problem - C - Codeforces
思路:比较恶心的一道题,一直在想怎么模拟撒谎的人,可是没想到其实撒谎的人最多就一个
#include<bits/stdc++.h>
#define endl '\n'
#define mk make_pair
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+7;
const int mod = 998244353;
int n, m, k;
int a[N];
void sovle(){
cin>>n>>k;
int sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
sum+=a[i];
}
if(sum==k) cout<<n<<endl;
else cout<<n-1<<endl;
}
signed main()
{
ios::sync_with_stdio(false), cin.tie(0),cout.tie(0);
int t = 1;
//cin>>t;
while (t--){
sovle();
}
return 0;
}
J (codeforces.com)
思路:又是一道复杂的字符串模拟,读懂题就能秒了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 25555;
/*-----------------------------------------------------------------*/
string w[13] = {"1p","9p","1s","9s","1m","9m","1z","2z","3z","4z","5z","6z","7z"};
map<string,int> mp;
void solve(){
mp.clear();
vector<string> a;
string s,c;
cin >> s;
int len = s.size();
for(int i = 0 ; i < len ; i++){
if(c.size() == 2){
a.push_back(c);
c.clear();
}
c += s[i];
}
a.push_back(c);
for(int i = 0 ; i < a.size() ; i++) mp[a[i]]++;
int num = 0,cnt = 0;
for(auto x:mp){
if(x.second==2) num++;
}
for(int i = 0 ; i < 13 ; i++){
if(mp[w[i]]) cnt++;
}
if(cnt == 13) {
cout << "Thirteen Orphans" << endl;
}else if(num == 7){
cout<< "7 Pairs" << endl;
}else {
cout << "Otherwise" <<endl;
}
}
signed main(){
int t;
cin >> t;
while(t--) solve();
}
Problem - L - Codeforces
思路:把各个时间段开的门存进一个数组里,map记录,然后遍历map,全部dijsktra跑一遍,可惜赛时dijsktra写拉了,没过😭
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
int n,m,k,T;
int a[N],dist[20][N];
bool vis[N];
struct b{
int p,l,r;
}door[20];
struct edge{
int v,w;
bool operator< (const edge&x) const{
return x.w < w;
}
};
vector<edge> P[N];
void dijkstra(int s){
priority_queue<edge> q;
for(int i = 1 ; i <= n ; i++){
dist[s][i] = INT_MAX;
vis[i] = false;
}
q.push({door[s].p,0});
dist[s][door[s].p] = 0;
while(!q.empty()){
edge x = q.top();
q.pop();
if(vis[x.v]) continue;
vis[x.v] = true;
for(auto y:P[x.v]){
if(dist[s][x.v] + y.w < dist[s][y.v]){
dist[s][y.v] = dist[s][x.v] + y.w;
q.push({y.v,dist[s][y.v]});
}
}
}
}
map<vector<int>,int> mp;
vector<int> num[N];
signed main(){
cin >> n >> m >> k >> T;
for(int i = 1 ; i <= n ; i++) cin >> a[i];
for(int i = 1 ; i <= k ; i++) cin >> door[i].p >> door[i].l >> door[i].r;
for(int i = 1 ; i <= m ; i++){
int u,v,w;
cin >> u >> v >> w;
P[u].push_back({v,w});
P[v].push_back({u,w});
}
for(int i = 1 ; i <= k ; i++) dijkstra(i);
for(int i = 1 ; i <= T ; i++){
for(int j = 1 ; j <= k ; j++){
if(door[j].l <= i && door[j].r >= i){
num[i].push_back(j);
}
}
mp.insert(mk(num[i],0));
}
for(auto& x:mp){
for(int i = 1 ; i <= n ; i++){
int ans = LLONG_MAX;
vector<int> open = x.first;
for(auto& j : open){
ans = min(dist[j][i]*a[i],ans);
}
x.second += ans;
}
}
for(int i = 1 ; i <= T ; i++){
if(num[i].empty()) cout << "-1" <<endl;
else cout << mp[num[i]] <<endl;
}
}
三、河南萌新联赛2024第(三)场:河南大学
B-正则表达式_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
签到题
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
signed main(){
int t = 0,ans = 0;
cin >> t;
while(t--){
string s,c;
cin >> s;
bool f = 0;
int sum = 0;
int len = s.size();
for(int i = 0 ; i < len ; i++){
if(s[i] == '.') {
sum = stoi(c);
if(sum < 0 or sum >= 256){
f = 1;
break;
}
c.clear();
}
else c += s[i];
}
sum = stoi(c);
if(sum >= 256 or sum < 0) f=1;
if(!f) ans++;
}
cout << ans <<endl;
}
C-Circle_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
算是一道数学题吧,一开始把5画错了wa了1发,分的区域其实就是n * n - n + 2
#include<bits/stdc++.h>
using namespace std;
long long t,n;
int main(){
cin>>t;
while(t--){
cin>>n;
if(n==0) cout<<1<<' ';
else cout<<n*n-n+2<<' ';
}
return 0;
}
E-区间_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
正解线段树🌲,还没学;不过这题数据水了,暴力竟然能过
贴个官解的代码吧
#include<bits/stdc++.h>
using namespace std;
template<class info>
struct segmenttree {
vector<info>tree;
int n;
segmenttree(int n) {
this->n = n;
tree.resize(4 * n + 10);
}
void modify(int i, int st, int ed, int pos, const info u) {
if (st == ed) {
tree[i] = u;
return;
}
int mid = (st + ed) / 2;
if (pos <= mid)modify(i * 2, st, mid, pos, u);
if (pos > mid)modify(i * 2 + 1, mid + 1, ed, pos, u);
tree[i] = tree[i * 2] + tree[i * 2 + 1];
}
info ask(int i, int st, int ed, int l, int r) {
if (st >= l && ed <= r) {
return tree[i];
}
int mid = (st + ed) / 2;
info u;
if (l <= mid && r > mid) {
u = ask(i * 2, st, mid, l, mid) + ask(i * 2 + 1, mid + 1, ed, mid + 1, r);
}
else if (r <= mid)u = ask(i * 2, st, mid, l, r);
else if (l > mid)u = ask(i * 2 + 1, mid + 1, ed, l, r);
return u;
}
info ask(int l, int r) {
return ask(1, 1, n, l, r);
}
void modify(int pos, info u) {
modify(1, 1, n, pos, u);
}
};
struct info {
int l, r, lpos, rpos;
int ans;
};
info operator+(const info& ls, const info& rs) {
info u;
u.r = rs.r; u.l = ls.l;
u.ans = max(ls.ans, rs.ans);
if (ls.lpos == 0 && rs.lpos == 0) {
u.ans = max(u.ans, u.r - u.l + 1);
u.lpos = 0; u.rpos = 0;
}
else if (ls.lpos == 0 && rs.lpos) {
u.ans = max(u.ans, ls.r - ls.l + 1 + rs.lpos - rs.l);
u.lpos = rs.lpos;
u.rpos = rs.rpos;
}
else if (ls.lpos && rs.lpos == 0) {
u.ans = max(u.ans, ls.r - ls.rpos + rs.r - rs.l + 1);
u.lpos = ls.lpos;
u.rpos = ls.rpos;
}
else {
u.ans = max(u.ans,rs.lpos-ls.rpos-1);
u.lpos = ls.lpos;
u.rpos = rs.rpos;
}
return u;
}
int main() {
int n;
cin >> n;
int q; cin >> q;
segmenttree<info>seg(n);
for (int i = 1; i <= n; i++) {
seg.modify(i, info{ i,i,0,0,1 });
}
for (int i = 1; i <= q; i++) {
int op; cin >> op;
if (op == 1) {
int x; cin >> x;
if (seg.ask(x, x).lpos == 0) {
seg.modify(x, info{ x,x,x,x,0 });
}
else {
seg.modify(x, info{ x,x,0,0,1});
}
}
else {
int l, r; cin >> l >> r;
cout << seg.ask(l, r).ans << "\n";
}
}
return 0;
}
F-累加器_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:位运算,找到规律就行,每个1的位可以为前面贡献,然后每位的变化就是y + 1位上贡献的,就可以得出答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
int qmi(int a,int b){
int res = 1;
while (b)
{
if (b & 1) res = (res * a) ;
a = (a * a);
b >>= 1;
}
return res;
} // kuai su mi
void solve(){
int x,y,x1,ans=0;
cin >> x >> y;
string s,c;
x1 = x;
while(x1){
if(x1 % 2) s = s + '1';
else s = s + '0';
x1 /= 2;
}
x1 = x + y;
while(x1){
if(x1 % 2) c = c + '1';
else c = c + '0';
x1 /= 2;
}
ans += y;
for(int i = 1 ; i < c.size() ; i++){
if(i <= s.size() and s[i-1] == '1') y += qmi(2,i-1);
ans += y / qmi(2,i);
}
cout << ans << endl;
}
signed main(){
int t;
cin >> t;
while(t--) solve();
}
G-求值_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:将给定公式变形,z = n - x - y ,然后再固定一个x,三分查找y就能得出答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
void solve(){
int a,b,c,n,w;
cin >> a >> b >> c >> n >> w;
int ans = 1e18;
auto check = [&](int x,int y){
return abs((x * a) + (y * b) + (n - x - y) * c - w);
};
for(int i = 0 ; i <= n ; i++){
int l = 0 , r = n - i;
while(l <= r){
int mid1 = l + (r - l) / 3;
int mid2 = r - (r - l) / 3;
ans = min(ans,min(check(i,mid1),check(i,mid2)));
if(check(i,mid1) > check(i,mid2)) l = mid1 + 1;
else r = mid2 - 1;
}
}
cout << ans << endl;
}
signed main(){
int t;
cin >> t;
while(t--) solve();
}
I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:dijsktra最短路,先从1开始跑一遍,看能否到达 k 拿到钥匙 或者 到达 n ,如果都无法到达就输出 -1 , 能到达 k 的话还要从 k 跑一遍dijsktra
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
/*-----------------------------------------------------------------*/
int n,m,k;
struct edge{
int v,w,d;
};
vector<edge> G[N];
int dist[N];
bool vis[N];
void dijstra1(int x){
for(int i = 1 ; i <= n ; i++){
dist[i] = LLONG_MAX;
vis[i] = 0;
}
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push(mk(0,x));
dist[x] = 0;
while(q.size()){
auto v = q.top();
q.pop();
if(vis[v.second]) continue;
vis[v.second] = 1;
for(auto y : G[v.second]){
//cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
if(y.d == 0) continue;
if(dist[v.second] + y.w < dist[y.v]){
dist[y.v] = dist[v.second] + y.w;
q.push(mk(dist[y.v],y.v));
//cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
}
}
}
}
void dijstra2(int x){
for(int i = 1 ; i <= n ; i++){
vis[i] = 0;
}
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push(mk(dist[x],x));
while(q.size()){
auto v = q.top();
q.pop();
if(vis[v.second]) continue;
vis[v.second] = 1;
for(auto y : G[v.second]){
if(dist[v.second] + y.w < dist[y.v]){
dist[y.v] = dist[v.second] + y.w;
q.push(mk(dist[y.v],y.v));
//cout << y.v << " : " << dist[y.v] << " " << v.second << " " << v.first << endl;
}
}
}
}
signed main(){
cin >> n >> m >> k;
for(int i = 1 ; i <= m ; i++){
int a,b,c,d;
cin >> a >> b >> c >> d;
G[a].push_back({b,c,d});
G[b].push_back({a,c,d});
}
// for(int i = 1 ; i <= n ; i++){
// for(auto x : G[i]){
// cout << i << " : " << x.v << " " << x.w << " " << x.d <<endl;
// }
// cout << endl;
// }
dijstra1(1);
if(dist[k] == LLONG_MAX and dist[n] == LLONG_MAX){
cout << -1 << endl;
return 0;
}
if(dist[k] != LLONG_MAX) dijstra2(k);
cout << dist[n] << endl;
}
J-keillempkill学姐の卷积_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
思路:比较麻烦的模拟,按照题意写就行
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
int a[25][25],b[25][25];
signed main(){
int n,m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++){
for(int j = 1 ; j <= n ; j++){
cin >> a[i][j];
}
}
for(int i = 1 ; i <= m ; i++){
for(int j = 1 ; j <= m ; j++){
cin >> b[i][j];
}
}
vector<int> c;
int sum = 0;
for(int i = 1 ; i <= m ; i++){
for(int k = 1 ; k <= m ; k++){
if(i + n - 1<= m and k + n - 1<= m){
sum = 0;
int x = 1 , y = 1;
for(int j = i ; x <= n ; j++,x++){
for(int l = k ; y <= n ; l++,y++){
//cout << x << " " << y << " " << j << " " << l << endl;
sum += a[x][y] * b[j][l];
}
y = 1;
}
c.push_back(sum);
}
}
}
//cout << c.size() << endl;
int x = 0;
for(int i = 1 ; i <= m - n + 1 ; i++){
for(int j = 1 ; j <= m - n + 1 ; j++){
cout<<c[x]<<" ";
x++;
}
cout << endl;
}
}
L-SSH_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com)
又是恶心的字符串模拟,用几个map就能写出来
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<string,string>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
int n,m,q;
map<string,string> mp;
map<string,vector<string>> mp2,mp3;
signed main(){
cin >> m >> n >> q;
for(int i = 1 ; i <= m ; i++){
string s,c;
cin >> s >> c;
mp[s] = c;
}
for(int i = 1 ; i <= n ; i++){
string s,c,h;
int k,t;
cin >> s >> k;
for(int j = 1 ; j <= k ; j++){
cin >> c >> t;
mp2[s].push_back(c);
for(int l = 1 ; l <= t ; l++){
cin >> h;
mp3[c].push_back(mp[h]);
}
}
}
while(q--){
string s,c,h;
cin >> s >> c >> h;
bool ok1=0,ok2=0;
for(auto x:mp2[c]){
if(x == s){
ok1 = 1;
break;
}
}
for(auto x : mp3[s]){
if(x == h){
ok2 = 1;
break;
}
}
if(ok1 and ok2) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
四、睿抗训练(上海理工大学2022GPLT选拔赛)
A-A+B Problem(GPLT)上海理工大学校内选拔赛(nowcoder.com)
签到
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
void solve(){
int n,sum = 0;
cin >> n;
vector<int> a(n+1),b(n+1);
for(int i = 1 ; i <= n ; i++){
cin >> a[i];
b[i] = a[i];
}
sort(b.begin() + 1,b.end(),greater<int>());
for(int i = 1 ; i <= n ; i++){
if(a[i] == b[1]) cout << a[i] + b[2] << " ";
else cout << a[i] + b[1] << " ";
}
}
signed main(){
IOS;
int t = 1;
//cin >> t;
while(t--) solve();
}
B-Komorebi的数学课_2022年(GPLT)上海理工大学校内选拔赛 (nowcoder.com)
思路:快速幂
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
int n;
int qmi(int a,int b){
int res = 1;
while (b)
{
if (b & 1) res = (res * a) % (n + 2);
a = (a * a) % (n + 2);
b >>= 1;
}
return res % (n + 2);
} // kuai su mi
void solve(){
cin >> n;
cout << qmi(n,n)%(n + 2);
}
signed main(){
IOS;
int t = 1;
//cin >> t;
while(t--) solve();
}
C-次佛锅_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)
思路:字符串模拟
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
map<string,int> mp;
void solve(){
string s,c,h;
getline(cin,s);
int len = s.size();
for(int i = 0 ; i < len ; i++){
if(s[i] == ' '){
if(c.size() and h.size()) mp[c] += stoi(h) , c.clear() , h.clear();
else continue;
}
else if(isalpha(s[i])) c += s[i];
else if(isalnum(s[i])) h += s[i];
}
if(c.size() and h.size()) mp[c] += stoi(h) , c.clear() , h.clear();
int q;
cin >> q;
while(q--){
cin >> s;
cout << mp[s] << endl;
}
}
signed main(){
IOS;
int t = 1;
//cin >> t;
while(t--) solve();
}
D-Setsuna的K数列_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)
思路:一开始没发现什么规律,就按他的大小排了一下序,结果发现就是和二进制位有关,二进制位上是1的就加上
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
int qmi(int a,int b){
int res = 1;
while (b)
{
if (b & 1) res = (res * a) % mod;
a = (a * a) % mod;
b >>= 1;
}
return res % mod;
} // kuai su mi
void solve(){
int n,k,ans = 0;
cin >> n >> k;
string s;
while(n){
if(n % 2) s += '1';
else s += '0';
n /= 2;
}
//cout << s << endl;
for(int i = 0 ; i < s.size() ; i++){
if(s[i] == '1') ans += qmi(k,i);
ans %= mod;
}
cout << ans % mod << endl;
}
signed main(){
IOS;
int t = 1;
//cin >> t;
while(t--) solve();
}
E-Wiki下象棋_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)
赛时BFS写拉了,硬控2个小时。赛后重写了一遍就过了,感觉很板,就是特殊情况要判一下
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
int dx[8] = {-2,-2,-1,-1,1,1,2,2};
int dy[8] = {-1,1,-2,2,-2,2,-1,1};
int dp1[305][305];
int dp2[305][305];
int vis1[305][305];
int vis2[305][305];
int n,m,k,a,b,c,d;
int bfs1(int x,int y){
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push(mk(x,y));
dp1[x][y] = 0;
while(q.size()){
auto [tx,ty] = q.top();
q.pop();
if(tx == c and ty == d) return dp1[tx][ty];
for(int i = 0 ; i < 8 ; i++){
int nx = tx + dx[i];
int ny = ty + dy[i];
if(nx <= 0 or nx > n or ny <= 0 or ny > m or vis1[nx][ny] or vis2[nx][ny]) continue;
dp1[nx][ny] = dp1[tx][ty] + 1 ;
if(nx == c and ny == d) return dp1[nx][ny];
q.push({nx,ny});
vis1[nx][ny] = 1;
}
}
return -1;
}
int bfs2(int x,int y){
memset(vis1,0,sizeof vis1);
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push(mk(x,y));
dp2[x][y] = 0;
while(q.size()){
auto [tx,ty] = q.top();
q.pop();
if(tx == c and ty == d) return dp2[tx][ty];
for(int i = 0 ; i < 8 ; i++){
if(vis2[tx-1][ty] and (i == 0 or i == 1)) continue;
if(vis2[tx][ty-1] and (i == 2 or i == 4)) continue;
if(vis2[tx][ty+1] and (i == 3 or i == 5)) continue;
if(vis2[tx+1][ty] and (i == 6 or i == 7)) continue;
int nx = tx + dx[i];
int ny = ty + dy[i];
if(nx <= 0 or nx > n or ny <= 0 or ny > m or vis1[nx][ny] or vis2[nx][ny]) continue;
dp2[nx][ny] = dp2[tx][ty] + 1 ;
if(nx == c and ny == d) return dp2[nx][ny];
q.push({nx,ny});
vis1[nx][ny] = 1;
}
}
return -1;
}
void solve(){
cin >> n >> m >> k >> a >> b >> c >> d;
for(int i = 1 ; i <= k ; i++){
int x,y;
cin >> x >> y;
vis2[x][y] = 1;
}
if(a == c && b == d){
cout << 0 << " " << 0 << endl;
return;
}
cout << bfs1(a,b) << " " << bfs2(a,b) << endl;
}
signed main(){
IOS;
int t = 1;
cin >> t;
while(t--) solve();
}
F-黄金律法_2022(GPLT)上海理工大学校内选拔赛 (nowcoder.com)
最小不等式?一个数组从小到大,一个数组从大到小排序就行
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
void solve(){
int n,ans = 0;
cin >> n;
vector<int> w(n+1),m(n+1);
for(int i = 1 ; i <= n ; i++) cin >> w[i];
for(int i = 1 ; i <= n ; i++) cin >> m[i];
sort(w.begin()+1,w.end(),greater<int>());
sort(m.begin()+1,m.end());
for(int i = 1 ; i <= n ; i++){
ans += w[i]*m[i];
}
cout << ans << endl;
}
signed main(){
IOS;
int t = 1;
cin >> t;
while(t--) solve();
}
G-天气预报_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)
前缀和加二分
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
int num1[N],num2[N];
int n,a,b,ans;
bool check(int l,int r){
if(num1[r] - num1[l-1] >= a and num2[r] - num2[l-1] >= b) return 1;
else return 0;
}
signed main(){
cin >> n >> a >> b;
string s;
cin >> s;
s = " " + s;
for(int i = 1 ; i <= n ; i++){
num1[i] = num1[i-1];
num2[i] = num2[i-1];
if(s[i] == '1') num2[i]++;
else num1[i]++;
}
for(int i = 1 ; i <= n ; i++){
int l = i , r = n;
while(l < r){
int mid = (l + r) >> 1;
if(check(i,mid)) r = mid;
else l = mid + 1;
}
if(check(i,l)) ans += n - l + 1;
}
cout << ans << endl;
}
J-史东薇尔城_2022年(GPLT)上海理工大学校内选拔赛 (nowcoder.com)
dijsktra 从 1 到每个点,后续如果是从1出发答案就是dist[y],不是的话就是先从x 到 1 (dist[x]). 再从1 到 y dist[y]
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e5 + 10;
/*-----------------------------------------------------------------*/
struct edge{
int v,w;
};
vector<edge> G[N];
int dist1[N],dist2[N];
bool vis[N];
void dijsktra1(int x){
memset(dist1, 0x3f3f3f3f , sizeof dist1);
memset(vis , 0 , sizeof vis);
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push({0,x});
dist1[x] = 0;
while(q.size()){
auto t = q.top();
q.pop();
if(vis[t.second]) continue;
vis[t.second] = 1;
for(auto ed : G[t.second]){
if(dist1[t.second] + ed.w < dist1[ed.v]){
dist1[ed.v] = dist1[t.second] + ed.w;
//cout << ed.v << " " << dist[ed.v] << endl;
q.push({dist1[ed.v],ed.v});
}
}
}
}
void dijsktra2(int x){
memset(dist2, 0x3f3f3f3f , sizeof dist2);
memset(vis , 0 , sizeof vis);
priority_queue<PII , vector<PII> , greater<PII> > q;
q.push({0,x});
dist2[x] = 0;
while(q.size()){
auto t = q.top();
q.pop();
if(vis[t.second]) continue;
vis[t.second] = 1;
for(auto ed : G[t.second]){
if(dist2[t.second] + ed.w < dist2[ed.v]){
dist2[ed.v] = dist2[t.second] + ed.w;
//cout << ed.v << " " << dist[ed.v] << endl;
q.push({dist2[ed.v],ed.v});
}
}
}
}
signed main(){
IOS;
int n,m;
cin >> n >> m;
for(int i = 1 ; i <= m ; i++){
int u,v,w;
cin >> u >> v >> w;
G[u].push_back({v,w});
G[v].push_back({u,w});
}
int q;
cin >> q;
dijsktra1(1);
while(q--){
int x , y;
cin >> x >> y;
if(x != 1){
dijsktra2(x);
cout << dist1[y] + dist2[1] << endl;
}
else {
cout << dist1[y] << endl;
}
}
}
L-剪绳子_2022年(GPLT)上海理工大学校内选拔赛(nowcoder.com)
一直在磕E导致这个简单的没写,官解说的并查集?其实一个set 的lower_bound就解决了
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define endl '\n'
#define mk make_pair
#define IOS ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
#define Pi acos(-1.0)
#define ull unsigned long long
//减法取模运算同样与加法乘法类似,但是有一点需要注意的是,由于在进行减法运算后结果可能是负数,因此需要加上一个mod后再取模。
//(A - B) % mod =((A % mod) - (B % mod) +mod) % mod
const int mod = 1e9 + 7;
const int N = 1e6 + 10;
/*-----------------------------------------------------------------*/
signed main(){
int q;
cin >> q;
set<double> st;
st.insert(0.0);
st.insert(10.0);
while(q--){
char op;
double f;
cin >> op >> f;
if(op == 'C') st.insert(f);
else{
auto x = st.lower_bound(f);
double z,y;
if(f == 0) z = *x , y = *(++x);
else y = *x , z = *(--x);
cout << fixed << setprecision(5) << y - z << endl;
}
}
}