Problem A 小花梨的字符串

https://acm.ecnu.edu.cn/contest/173/problem/A/

题意:对区间子字符串排列,使得满足条件,求排列最长。

题解:

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N];
char str[N];
struct node{};
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d%d",&n,&m);cin>>str;for(int i=1;i<=m;i++){scanf("%d%d",&l,&r);cout<<(r-l+1)*(r-l+2)/2<<endl;}//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

Problem B 小花梨的三角形

https://acm.ecnu.edu.cn/contest/173/problem/B/

题意:统计三个顶点不完全相同的三角形个数。

题解:枚举

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
bool vis[N][N][N];
char str[N][N];
struct node{};
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d",&n);for(int i=1;i<=n+1;i++)scanf("%s",str[i]+1);for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){for(int k=i+1;k<=n+1;k++){int a[4];a[0]=str[k][j]-'a';a[1]=str[i][j]-'a';a[2]=str[k][j+k-i]-'a';sort(a,a+3);//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;vis[a[0]][a[1]][a[2]]=1;}}}for(int i=2;i<=n;i++){for(int j=1;j<i;j++){for(int k=j+1;k<=i&&i+k-j<=n+1;k++){int a[4];a[0]=str[i][j]-'a';a[1]=str[i][k]-'a';a[2]=str[i+k-j][k]-'a';sort(a,a+3);//cout<<i<<" "<<j<<" "<<k<<" "<<i+k-j<<endl;//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;vis[a[0]][a[1]][a[2]]=1;}}}for(int i=0;i<26;i++){for(int j=i;j<26;j++){for(int k=j;k<26;k++){ans+=vis[i][j][k];}}}cout<<ans<<endl;//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

Problem C 小花梨判连通

https://acm.ecnu.edu.cn/contest/173/problem/C/

题意:有K张联通图,求使得 ?和?在这 ?张图中都是连通的j的个数

C++版本一

题解:直接 dfs 、BFS 或者并查集对每张图进行连通块染色, 或者并查集对每张图进行连通块染色,  两个点在 k张图中都相邻说明这两个点在 张图中都相邻说明这两个点在 张图中都相邻说明这两个点在 k张图的染色 都是一样的 
map<vector<int>,int>存下每个点在 k张图的颜色序  列出现的次数即可

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=200000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int pre[20][N];
char str;
bool vis[N];
struct node{};
vector<int>G[N];
vector<int>V[N];
map<vector<int>,int>mp;
int find(int *pre,int x){return pre[x]==x?x:pre[x]=find(pre,pre[x]);}
void dfs(int u){vis[u]=1;V[u].push_back(cnt);//cout<<u<<" "<<cnt<<endl;for(int i=0,j=G[u].size();i<j;i++){int v=G[u][i];if(!vis[v]){dfs(v);}}
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d%d",&n,&m);for(int i=0;i<=m;i++)for(int j=1;j<=n;j++)pre[i][j]=j;for(int i=1;i<=m;i++){scanf("%d",&k);memset(vis,0,sizeof(vis));for(int j=1;j<=n;j++)G[j].clear();cnt=0;for(int j=1;j<=k;j++){scanf("%d%d",&u,&v);int fx=find(pre[i],u);int fy=find(pre[i],v);if(fx!=fy){pre[i][fy]=fx;G[u].push_back(v);G[v].push_back(u);}}for(int j=1;j<=n;j++){if(vis[j]==0)++cnt,dfs(j);}}for(int i=1;i<=n;i++){mp[V[i]]++;}for(int i=1;i<=n;i++)cout<<mp[V[i]]<<endl;//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

C++版本二

题解:对每一个图dfs求联通块并染色,处于同一个联通块中的点染成相同的颜色。染色之后对于图中的每一个点就有一个长度为k的颜色序列,两点在k张图中均联通即两个点的颜色序列完全相同。求每个点的颜色序列的hash值,并记录每种hash值出现了多少次。输出答案时将该点对应的hash值出现的次数输出即可。

#include "bits/stdc++.h"using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 100;
const int inf = 0x3f3f3f3f;
bool vis[maxn];
vector<int> e[11][maxn];
unsigned long long ans[maxn];
int c[11][maxn];
int col = 0;
map<unsigned long long, int> mp;void dfs(int deep, int now) {if (vis[now]) return;c[deep][now] = col;vis[now] = true;for (auto p:e[deep][now]) {dfs(deep, p);}
}int main() {//freopen("in.txt", "r", stdin);int n, k, m;scanf("%d %d", &n, &k);int u, v;for (int i = 0; i < k; i++) {cin >> m;for (int j = 0; j < m; j++) {scanf("%d %d", &u, &v);e[i][u].push_back(v);e[i][v].push_back(u);}col = 0;memset(vis, 0, sizeof(vis));for (int j = 1; j <= n; j++) {if (!vis[j]) col++;dfs(i, j);}}unsigned long long hash;for (int i = 1; i <= n; i++) {hash = 0;for (int j = 0; j < k; j++) {hash = hash * mod + c[j][i];}mp[hash]++;ans[i] = hash;}for (int i = 1; i <= n; i++) {cout << mp[ans[i]] << endl;}return 0;
}

Problem D 小花梨的取石子游戏

https://acm.ecnu.edu.cn/contest/173/problem/D/

题意:按规则取石子,求第i轮必胜的人

题解:博弈,谁先拿到非1的堆,谁就是赢家。因为足够聪明,所有人必然使得自己永远占先机。

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=200000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int a[N],b[N];
char str;
struct node{};
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[i+n]=a[i];}flag=2*n+1;for(int i=2*n;i>=1;i--){if(a[i]!=1)flag=i;b[i]=flag;}for(int i=1;i<=n;i++){cout<<((min(n-1,b[i]-i))%2==0?"First":"Second")<<endl;}//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

Problem E 小花梨的数组

https://acm.ecnu.edu.cn/contest/173/problem/E/

题意:

题解:线段树+tag标记

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=1000000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,u,v;
int ans,cnt,flag,temp,sum;
int f[M],prime[M],pre[N];
ll tree[N<<2],tag[N<<2];
ll POW(ll a,ll b,ll c){ll res=1;ll base=a%c;while(b){if(b&1)res=(res*base)%c;base=(base*base)%c;b>>=1;}return res;
}void init(){f[1]=1;prime[0]=prime[1]=1;for(int i=2;i<=1e6;i++){if(prime[i]==0){pre[++cnt]=i;f[i]=i;}for(int j=1;j<=cnt&&pre[j]*i<=1e6;j++){prime[i*pre[j]]=1;f[i*pre[j]]=pre[j];if(i%pre[j]==0){break;}}}
}
void pushup(int rt){tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void pushdowm(int rt){tag[rt<<1]+=tag[rt];tag[rt<<1|1]+=tag[rt];tag[rt]=0;
}
void build(int l,int r,int rt){if(l==r){scanf("%lld",&tree[rt]);tag[rt]=0;return;}int mid=(l+r)>>1;build(l,mid,rt<<1);build(mid+1,r,rt<<1|1);pushup(rt);}
void updata1(int l,int r,int rt,int L,int R){if(tree[rt]==r-l+1)return;if(L<=l&&r<=R){tag[rt]++;return;}pushdowm(rt);int mid=(l+r)>>1;if(L<=mid)updata1(l,mid,rt<<1,L,R);if(R>mid)updata1(mid+1,r,rt<<1|1,L,R);pushup(rt);
}
void updata2(int l,int r,int rt,int L,int R){if(tree[rt]==r-l+1)return;if(L<=l&&r<=R&&tag[rt]){tag[rt]--;return;}if(l==r){tree[rt]=tree[rt]/f[tree[rt]]%MOD;return;}pushdowm(rt);int mid=(l+r)>>1;if(L<=mid)updata2(l,mid,rt<<1,L,R);if(R>mid)updata2(mid+1,r,rt<<1|1,L,R);pushup(rt);
}
ll query(int l,int r,int rt,int L){if(tree[rt]==r-l+1)return 1;if(l==r){return tree[rt]*POW(f[tree[rt]],tag[rt],MOD)%MOD;}pushdowm(rt);int mid=(l+r)>>1;if(L<=mid)return query(l,mid,rt<<1,L);else return query(mid+1,r,rt<<1|1,L);
}
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);init();while(~scanf("%d%d",&n,&m)){memset(tree,0,sizeof(tree));build(1,n,1);for(int i=1;i<=m;i++){scanf("%d",&k);if(k==1){scanf("%d%d",&l,&r);updata1(1,n,1,l,r);}else if(k==2){scanf("%d%d",&l,&r);updata2(1,n,1,l,r);}else{scanf("%d",&l);cout<<query(1,n,1,l)<<endl;}}}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

Problem F 小花梨的无向图

https://acm.ecnu.edu.cn/contest/173/problem/F/

题意:

题解:

C++版本一

Problem G 小花梨的函数

https://acm.ecnu.edu.cn/contest/173/problem/G/

题意:

题解:

C++版本一

Problem H 小花梨的矩阵

https://acm.ecnu.edu.cn/contest/173/problem/H/

题意:

题解:

C++版本一

Problem I 小花梨点外卖

https://acm.ecnu.edu.cn/contest/173/problem/I/

题意:有两种优惠,最多选择一种,使得付款最小

题解:模拟

C++版本一

/*
*@Author:   STZG
*@Language: C++
*/
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<deque>
#include<stack>
#include<cmath>
#include<list>
#include<map>
#include<set>
//#define DEBUG
#define RI register int
#define endl "\n"
using namespace std;
typedef long long ll;
//typedef __int128 lll;
const int N=100000+10;
const int M=100000+10;
const int MOD=1e9+7;
const double PI = acos(-1.0);
const double EXP = 1E-8;
const int INF = 0x3f3f3f3f;
int t,n,m,k,p,l,r,a,b,c,d;
ll ans,cnt,flag,temp,sum;
int v[N];
char str;
struct node{};
int main()
{
#ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout);
#endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);for(int i=1;i<=n;i++){scanf("%d",&v[i]);sum+=v[i];}if(sum>=a&&sum>=c){ans=sum-max(b,d);}else if(sum>=a){ans=sum-b;}else if(sum>=c){ans=sum-d;}else{ans=sum;}cout<<ans<<endl;//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC);
#endif//cout << "Hello world!" << endl;return 0;
}

“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)相关推荐

  1. “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)E. 小花梨的数组

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/E/ 题意:Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ...

  2. 小花梨判连通(DFS或BFS或并查集+vector+map)——“美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学)

    (https://acm.ecnu.edu.cn/contest/173/problem/C/) 题目大意: 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于每个点? ...

  3. “美登杯”上海市高校大学生程序设计邀请赛 **D. 小花梨的取石子游戏**

    "美登杯"上海市高校大学生程序设计邀请赛 (华东理工大学) D. 小花梨的取石子游戏 Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ? ...

  4. 美登杯”上海市高校大学生程序设计邀请赛 Problem E 、 小 花梨 的数组 (线段树)...

    Problem E E . 小 花梨 的数组 时间限制:1000ms 空间限制:512MB Description 小花梨得到了一个长度为?的数组?,现在要对它进行三种操作: ⚫ 1 ? ] ∗ ⚫ ...

  5. “美登杯”上海市高校大学生程序设计邀请赛(华东理工大学) 小花梨的取石子游戏(博弈)

    Description 小花梨有?堆石子,第?堆石子数量为??,?堆石子顺时针编号为1 − ?(如图) . 游戏将进行?轮,每轮游戏单独进行,互不干扰,每轮初始时第?堆石子数目为??. 第?轮从编号为 ...

  6. “美登杯”上海市高校大学生程序设计 C. 小花梨判连通 (并查集+map)

    Problem C C . 小 花梨 判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加无向边,构成?张图.小花梨想知道对于 ...

  7. “美登杯”上海市高校大学生程序设计赛B. 小花梨的三角形(模拟,实现)

    题目链接:https://acm.ecnu.edu.cn/contest/173/problem/B/#report9 Problem B B . 小 花梨 的 三角形 时间限制:1000ms 空间限 ...

  8. 上海市高校大学生程序设计邀请赛 C:小花梨判连通

    上海市高校大学生程序设计邀请赛 C:小花梨判连通 Problem C.小花梨判连通 时间限制:2000ms 空间限制:512MB Description 小花梨给出?个点,让?位同学对这?个点任意添加 ...

  9. 字节跳动杯2018中国大学生程序设计竞赛-女生专场题解

    以下所有AC题解程序来自"仙客传奇"团队. A. 口算训练 题解链接: ABDFHK "字节跳动杯"2018中国大学生程序设计竞赛-女生专场 B. 缺失的数据范 ...

最新文章

  1. mysql 数据库引擎切花_asyncio异步编程【含视频教程】
  2. 分布式中Redis实现Session终结篇
  3. win10修改mac地址
  4. zorka源码解读之Beanshell与zorka的交互实现
  5. python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解
  6. 我所理解的领域驱动模型设计
  7. geek软件是干什么的_详解强力卸载软件Geek Uninstaller使用教程
  8. [再学Python] - 2 - math库和random库
  9. C#中对 XML节点进行增、删、改、查
  10. BZOJ 1067 降雨量(RMQ-ST+有毒的分类讨论)
  11. nyoj1140鸡蛋栈(怒切一水)
  12. 当前常见游戏服务器引擎
  13. linux 中etc全拼,英语etc_英语中“等等”缩写成为etc吗要加一点吗全拼是什么谢谢大家_淘题吧...
  14. 自定义拖动条android,Android自定义滑动带(横条指示器)
  15. A pseudo attribute name is expected.解决方法
  16. 学习笔记10----学成在线案例
  17. J2EE:赛迪网J2EE视频总结
  18. 如何查看QQ在线人数
  19. 如何查看windows某个目录下所有文件/文件夹的大小?
  20. 将100以内的所有质数输出

热门文章

  1. #打开cmd指定路径_CMD
  2. esjava 同步mysql_Elasticsearch和mysql数据同步(elasticsearch-jdbc)
  3. buck电路matlab,buck变换器介绍_buck变换器matlab仿真
  4. Linux分支代码必须公开吗,linux – 当拉出不同的分支时,让“git pull”请求确认...
  5. java 二进制 base64编码_java 按字节读写二进制文件(Base64编码解码)
  6. android 将数据转换成JSON数据格式并使用JSONObject解析JSON格式的数据
  7. 五十七、Servlet工程和Tomcat
  8. 博士申请 | 美国罗格斯大学王灏助理教授招收机器学习方向博士生
  9. 多篇顶会看个体因果推断(ITE)的前世今生
  10. 阐明性问题生成 (Clarification Question Generation) 概览